openh264限制slice/nal分片大小导致的编码数据错误

来源:互联网 发布:安卓改机软件 编辑:程序博客网 时间:2024/06/03 23:47

openh264限制slice/nal分片大小导致的编码数据错误

最近在使用openh264进行编码的时候发现,一旦限制了slice/nal分片的大小,编码输出的数据就会出现错误。最后确定这个是openh264的bug。这里讲一下这个问题的原因和规避方法。
本文所述的openh264皆是指1.6版本

复现步骤

经过多次试验、对比后发现,只有当启用了CABAC然后限制slice/nal分片的大小小于一定的值得时候。编码得到的数据就会出现错误,出现解码失败。
启用CABAC的需要在创建编码器的时候设置初始化参数param.iEntropyCodingModeFlag=1
而限制slice/nal分片需要设置param.sSpatialLayers[i].sSliceArgument.uiSliceMode = SM_SIZELIMITED_SLICE来启用限制slice/nal分片大小模式。分片的字节大小可以通过设置param.sSpatialLayers[0].sSliceArgument.uiSliceNum或者param.uiMaxNalSize来实现。

当同时启用了CABAC和限制分片大小后,编码出的数据就会错误。为了排除其他问题的干扰,使用ffmpeg编码并指定编码器类型为libopenh264(确保此版本的ffmpeg中附带的是openh264-1.6版本)。同样启用CABAC和限制分片大小。依然得到错误的数据,所以可以排除使用方式的问题。确定是openh264库的bug。

规避方法

既然出现此问题必须要同时满足启用CABAC和限制分片大小。那么只要视情况不要同时满足这两个条件即可。通常是禁用CABAC,使用CAVLC,因为CABAC相比于CAVLC只是提高了一些压缩率,影响并不大。而限制分片大小有可能是码流传输过程中必不可少的。

修复

此问题已经报告给openh264官方(https://github.com/cisco/openh264/issues/2600)。 目前已经修复,但是可能要在下一个稳定版中才能合并进来。所以如果使用1.6版本,只能先使用规避方法,或者自己编译不稳定分支上的代码。

0 0
原创粉丝点击