Cómo establecer media + tasa de bits máxima para MediaCodec para codificar vídeo H.264?

Por favor, ayúdame:

Estoy utilizando MediaCodec para codificar el vídeo H.264 de la cámara, el problema es, cuando muevo mi teléfono, la calidad del vídeo de salida es muy piscina, llena de mosaico / bloques visuales en el video.

Belows son algunos detalles:

Mi velocidad de bits de codificador es de 500 kbps y el modo de bitrate es BITRATE_MODE_VBR.

Trato de cambiar la velocidad de bits a 800 kbps, la calidad de salida de vídeo mejora mucho, y si cambio el modo de bitrate en BITRATE_MODE_CQ, la calidad de salida de vídeo es perfecta, pero el bitrate aumentará hasta 1400 kbps.

Quiero mantener la velocidad media de bits a un nivel bajo, por ejemplo, 500 kbps, pero permitiendo que la tasa de bits estalle en una tasa de bits mayor cuando el teléfono se mueve, por ejemplo, 800 kbps. En iOS VideoToolBox, hay una API kVTCompressionPropertyKey_DataRateLimits para establecer el bitrate promedio y el bitrate máximo, pero en Android, ¿cómo podría lograr ese control de velocidad media-max?

Me di cuenta de que hay un parámetro ocultar "max-bitrate" cuando se configura el MediaCodec, pero no tiene ningún efecto (porque el marco de Android ignorar este parámetro, consulte http://androidxref.com/7.1.1_r6/xref/frameworks/av/ Media / libstagefright / ACodec.cpp # configureCodec ), también noté que hay un parámetro de "calidad" de ocultar, pero tampoco tiene ningún efecto.

Por favor, ayúdame, gracias!

Desde el código fuente de android, parece que KEY_MAX_BIT_RATE establecerá la velocidad de bits máxima. Vea a continuación la instantánea de media/java/android/media/MediaCodecInfo.java

 private static boolean supportsBitrate( Range<Integer> bitrateRange, MediaFormat format) { Map<String, Object> map = format.getMap(); // consider max bitrate over average bitrate for support Integer maxBitrate = (Integer)map.get(MediaFormat.KEY_MAX_BIT_RATE); Integer bitrate = (Integer)map.get(MediaFormat.KEY_BIT_RATE); if (bitrate == null) { bitrate = maxBitrate; } else if (maxBitrate != null) { bitrate = Math.max(bitrate, maxBitrate); } if (bitrate != null && bitrate > 0) { return bitrateRange.contains(bitrate); } return true; } 

Hazme saber si esto funciona para ti.

Le sugiero que ponga un valor más alto dependiendo de la resolución de vídeo. Por ejemplo, 1080p de vídeo no se verá bien a 500kbps VBR o CBR.

  • La resolución de la vista previa no coincide con la resolución del códec
  • Descodificación del búfer de salida de MediaCodec
  • Android MediaCodec no decodificar todos los búferes de entrada
  • Cómo vivir la transmisión desde Android
  • Archivo de video no streamable creado con MediaMuxer
  • ¿Cómo inicializar MediaFormat para configurar un MediaCodec para decodificar datos AAC sin procesar?
  • Android cambia el tamaño de VirtualDisplay
  • Cómo reducir la latencia en la decodificación de video / avc de MediaCodec
  • MediaCodec createInputSurface
  • Cómo jugar raw h264 producido por MediaCodec encoder?
  • Android MediaCodec no puede descifrar archivos wma
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.