我正在使用MediaCodec
对来自摄像头的H.264视频进行编码,问题是,当我移动手机时,输出视频的质量非常高,视频中充满了马赛克/视觉块。 / p>
Belows是一些细节:
我的编码器比特率为500 kbps,比特率模式为BITRATE_MODE_VBR
。
我尝试将比特率更改为800 kbps,输出视频质量提高了很多,如果我将比特率模式更改为BITRATE_MODE_CQ
,输出视频质量是完美的,但比特率将增加到1400 kbps
我想将平均比特率保持在较低水平,例如500 kbps,但允许比特率在手机移动时突然变成更大的比特率,例如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 :(得分: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下看起来不太好。