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版本,只能先使用规避方法,或者自己编译不稳定分支上的代码。
- openh264限制slice/nal分片大小导致的编码数据错误
- 分片的NAL单元(FU-A分片)
- openH264编码流程
- 表单提交数据大小的限制
- 自作聪明导致的一个Java编码错误
- XML编码问题导致的错误
- 因编码格式问题导致的错误
- Python 分片(slice)
- mapreduce 分片大小的计算
- Delphi2009 SOAP的bytearray编码错误导致AV错误
- 【Android】intent传递数据时,数据大小的限制问题
- 【Android】intent传递数据时,数据大小的限制问题
- 表单提交数据大小的限制:Firebug 达到了 Post 请求大小限制
- 遍历数组修改数据导致的错误
- 为什么分片大小需要与HDFS数据块大小一致
- [mongodb翻译]分片的限制(sharding limit)
- OpenH264
- 由获取out的顺序导致的编码错误
- (2)C语言常用图形函数
- HDU2109 Fighting for HDU
- 学习 UML 核心元素
- Tomcat-----Linux下实时查看Tomcat日志
- macbook系统升级到10.12.1后office办公软件不可用问题解决
- openh264限制slice/nal分片大小导致的编码数据错误
- 彻底弄懂Activity四大启动模式
- ARM汇编编程基础(二) -- 基本寻址方式与基本指令
- LeetCode 237 Delete Node in a Linked List
- R语言调用MySQL数据库及R的自动更新
- 数组逆序对
- JSP+javabean实现购物车功能
- linux 内核进程管理子系统
- hdu 1175 连连看 bfs