2017-02-27 148 views
7

请帮我:如何设置MediaCodec编码H.264视频的平均+最大比特率?

我使用MediaCodec来编码来自摄像机的H.264视频,问题是,当我移动手机时,输出视频的质量非常高,充满了马赛克/可视块视频。

初级讲座还有一些细节:

我的编码码率为500kbps的,和比特率模式是BITRATE_MODE_VBR。

我试图将比特率改为800 kbps,输出视频质量提高了很多,如果我将比特率模式更改为BITRATE_MODE_CQ,输出视频质量是完美的,但比特率会增加到1400 kbps。

我想保持平均比特率处于较低的水平,例如, 500kbps,但允许在移动电话时将比特率突发一些更大的比特率,例如, 800 kbps。在iOS VideoToolBox中,有一个API kVTCompressionPropertyKey_DataRateLimits来设置平均比特率和最大比特率,但在Android中,我如何实现平均最大比特率控制?

我注意到在配置MediaCodec时有一个隐藏的“max-bitrate”参数,但它没有任何作用(因为Android框架忽略这个参数,见http://androidxref.com/7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec),我还注意到有一个隐藏的“质量”参数,但它也没有效果。

请帮帮我,谢谢!!!

回答

0

从android源代码中,它看起来像KEY_MAX_BIT_RATE将设置最大比特率。看下面的快照从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; 
     } 

让我知道这是否适合你。

我建议你把一个更高的值取决于视频分辨率。对于例如1080p视频在500kbps VBR或CBR上看起来不太好。

+0

我试过'KEY_MAX_BIT_RATE'参数,实际上关键是“最大比特率”,但它在VBR中没有任何作用,而且似乎参数被本机代码丢弃了,请参阅http://androidxref.com /7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec。 当我编码720p视频时,我将比特率设置为800 kbps,当我在相机周围移动时,输出视频质量非常差,满块,我想让MediaCodec在输入数据增加时临时增加比特率,并在输入数据减少时将比特率降低到平均水平。我该怎么做? – Piasy

+0

视频芯片组是延迟的来源。 您正在要求它做太多的增量。 –