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:

 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.

¿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.

  • No se puede mux tanto de audio como de vídeo
  • MediaCodec KEY_FRAME_RATE parece ser ignorado
  • Imposible mezclar archivos de audio y archivos de video usando MediaMuxer?
  • Android: reproducir muchos videos simultáneamente
  • Excepción de estado ilegal al llamar a MediaCodec.configure ()
  • Múltiples instancias de MediaCodec
  • Reducción de tamaño de archivo de vídeo MediaMuxer (compresión, disminución de resolución)
  • Conversión de imágenes en vídeo
  • MediaCodec problemas de muxing de audio / video y Android
  • ¿Cómo acceder a EGL Image directamente desde Android Surface para su uso en el decodificador de video MediaCodec?
  • Uso de renderscript para procesamiento y mediacodec para codificación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.