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

以下是一些详细信息:

我的编码器比特率是500 kbps,比特率模式是BITRATE_MODE_VBR

我尝试将比特率更改为800 kbps,输出视频质量得到很大改善,如果将bitrate-mode更改为BITRATE_MODE_CQ,则输出视频质量是完美的,但是比特率将提高到1400 kbps。

我想将平均比特率保持在较低水平,例如500 kbps,但是当手机移动时,允许比特率突然变为更大的比特率。 800 kbps。在iOS VideoToolBox中,有一个API kVTCompressionPropertyKey_DataRateLimits可以设置平均比特率和最大比特率,但是在Android中,我如何实现该平均最大比特率控制?

我注意到配置MediaCodec时有一个hide“max-bitrate”参数,但是没有任何效果(因为Android框架忽略了此参数,请参阅http://androidxref.com/7.1.1_r6/xref/frameworks/av/media/libstagefright/ACodec.cpp#configureCodec),我还注意到有一个hide“quality”参数,但是它也没有效果。

最佳答案

从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;
        }

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

关于android - 如何设置MediaCodec的平均+最大比特率来编码H.264视频?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42479549/

10-12 00:34