如何设置MediaCodec对H.264视频进行编码的平均+最大比特率?

Pia*_*asy 8 android bitrate h.264 mediacodec

我正在使用MediaCodec从相机编码H.264视频,问题是,当我移动手机时,输出视频的质量非常高,视频中充满了马赛克/视觉块.

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),我也注意到有一个隐藏"质量"参数,但它也没有效果.

man*_*shg 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;
        }
Run Code Online (Sandbox Code Playgroud)

我建议您根据视频分辨率设置更高的值。例如,1080p 视频在 500kbps VBR 或 CBR 下看起来效果不佳。