用Intel MediaSDK 做超高码率编码

闲扯几句最近在用Intel MediaSDK做编码方面的一些收获。

老板需要编段100Mbps的码流,用mediasdk 2021r1的sample_encode来试试

实验1: 先来段8Mbps的试试,一切正常

sample_encode h264 -i jellyfish-4k-uhd-nv12.yuv -nv12 -h 2160 -w 3840 -o msdk_test_4k.h264 -u 7 -cbr -b 8000

命令行输出

用mediainfo看看输出的码流

实验2: 设置码率100Mbps, 输出文件的码率只有34.5Mbps 翻车!

sample_encode h264 -i jellyfish-4k-uhd-nv12.yuv -nv12 -h 2160 -w 3840 -o msdk_test_4k.h264 -u 7 -cbr -b 100000

命令行输出

MediaInfo看码率也就是34Mbps

最后经过多次实验,发现用-b参数设置码率,最高只能到64Mbps左右, 再高以后码率就不准了。

一顿debug, 发现问题出在编码时表示编码码率的TargetKbps数据类型是无符号16bit

            union {
                mfxU16  TargetKbps;
                mfxU16  QPP;
                mfxU16  ICQQuality;
            };

这个bitrate最高也就能设到65535 (0xFFFF), 再高就会溢出了。 所以当我们设置参数是-b 100000时,ParseInputString()里的 msdk_opt_read(strInput[++i], pParams->nBitRate)返回nBitRate就是34,464。打断点进去看,发现函数msdk_strtol()返回还是0x186a0, 赋值给mfxU16的value以后就变成了0x86a0 (十进制34,464)。 这个就跟前面的输出匹配了。

遇事不决,可问谷哥

发现了这么一篇文章 Bitrate Control Methods (BRC) in Intel® Media SDK 这里面提到了在mediasdk的mfxInfoMFX结构体里,有这么个变量mfxU16  BRCParamMultiplier 平时这个值为0,当这个值不为0的时候,最终的编码码率为 BRCParamMultiplier*TargetKbps。

试验一下,

修改一下sample_encode.cpp的代码,在解析输入参数的地方,加一个-bm的参数,负责设置这个bitrate multiplier,然后在InitMfxEncParams()函数里,把这个值设给m_mfxEncParas.mfx.BRCParamMultiplier.

运行命令, 要100Mbps的码流,所以targetKbps设置50000, Multiplier设置成2, 乘起来正好100Mbps

sample_encode h264 -i jellyfish-4k-uhd-nv12.yuv -nv12 -h 2160 -w 3840 -o msdk_test_4k.h264 -u 7 -cbr -b 50000 -bm 2

命令行输出

 MediaInfo输出

搞定,收工!!!

最后按照惯例,参考代码奉上,仅供参考

https://gitee.com/tisandman/intel_mediasdk2021_sample_encode_with_bitrate_multiplier

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值