首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置MediaCodec编码H.264视频的average+max码率?

如何设置MediaCodec编码H.264视频的average+max码率?
EN

Stack Overflow用户
提问于 2017-02-27 14:57:23
回答 1查看 4.6K关注 0票数 11

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

以下是一些详细信息:

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

我试着把码率改成800kbps,输出的视频质量提高了很多,如果我把码率模式改成BITRATE_MODE_CQ,输出的视频质量是完美的,但是码率会提高到1400kbps。

我希望将平均比特率保持在较低的水平,例如500kbps,但允许在手机移动时将比特率突发为更高的比特率,例如800kbps。在iOS VideoToolBox中,有一个kVTCompressionPropertyKey_DataRateLimits接口可以设置平均码率和最大码率,但在安卓中,我如何实现平均-最大码率控制?

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-03 10:11:45

从安卓的源代码看,KEY_MAX_BIT_RATE似乎会设置最大比特率。请参见下面来自media/java/android/media/MediaCodecInfo.java的快照

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42479549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档