Calidad de vídeo incoherente al codificar los fotogramas de previsualización de la cámara con MediaCodec en Xperia Z1
Estoy codificando los marcos de NV21
vienen de la inspección previo de la cámara. Por alguna razón el esquema que funciona bien en otros dispositivos funciona incorrectamente en Sony Xperia Z1
con Android 4.3
. Devuelve los fotogramas codificados con calidad incorrecta (baja).
El formato de MediaCodec
es COLOR_FormatYUV420SemiPlanar
que es NV12
(convierto NV21
a NV12
intercambiando componentes U y V). Los búferes de salida enviados a mí por MediaCodec
son de tamaño muy bajo que no corresponden a la resolución ( 1280x720
) y la velocidad de bits ( 1000000
) que estoy usando. Primeros cuadros vienen con una buena calidad, pero luego está cayendo significativamente:
- Android cambia el tamaño de VirtualDisplay
- MediaCodec y PCM de 24 bits
- Android: Encontrando audio y video usando MediaCodec
- Mp3 a conversión wav android
- Cómo salvar SurfaceTexture como bitmap
int encoderStatus = mMediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC); // a few encoderStatus checks skipped ByteBuffer encodedData = outputBuffers[encoderStatus]; Log.i(Constants.TAG, "Buffer size " + mBufferInfo.size);
Lo que me da el siguiente registro en Xperia Z1:
Buffer size 26 Buffer size 52172 Buffer size 23650 Buffer size 14394 Buffer size 3591 Buffer size 1849 Buffer size 3908 ... Buffer size 1043 Buffer size 248 Buffer size 836 Buffer size 518 Buffer size 1112
Ejemplo de registro de Sony Xperia ZR
en el que esto funciona correctamente:
Buffer size 21 Buffer size 51048 Buffer size 21063 Buffer size 24228 Buffer size 28040 ... Buffer size 44959 Buffer size 44972 Buffer size 44957 Buffer size 45004 Buffer size 44999 Buffer size 44957
Cualquier consejo sería apreciado.
- MediaExtractor, MediaMetadataRetriever con archivo Raw / Asset
- ¿Cómo usar MediaMuxer / MediaCodec InputSurface con GLSurfaceView?
- Codificación de audio AAC utilizando AudioRecord y MediaCodec en Android
- Cómo jugar raw h264 producido por MediaCodec encoder?
- Grabación de una superficie con MediaCodec
- Entrada de superficie de búfer en MediaCodec
- Decodificar mp4 / h.264 usando MediaCodec sin MediaExtractor, formato de unidad de acceso esperado
- Cómo utilizar MediaCodec sin MediaExtractor para H264
¿Está seguro de que pasa las marcas de tiempo en la unidad correcta (microsegundos) – y que ha establecido una velocidad de fotogramas sensible?
-
Algunos codificadores pueden ignorar las marcas de tiempo y sólo establecer un presupuesto de bitrate fijo por marco, basado en la velocidad de fotogramas.
-
Otros podrían tratar de calcular cuántos bits se les permite usar por marco basado en la marca de tiempo.
Si las marcas de tiempo se dan, por ejemplo, en milisegundos, esto podría conducir al codificador a reducir el tamaño de los fotogramas codificados hacia cero.
- ¿Por qué findFragmentById devuelve el fragmento antiguo estaba en antes de la llamada para reemplazar FragmentLayout?
- Necesidad de manejar el clic de la clase NON-Activity (.java)