使用Intel media SDK h264编码后的数据帧分析及用vlc播放不出原因分析

使用Intel media SDK硬编码H264数据然后保存成264文件,用vlc播放失败。

默认编码是第一帧有IDR帧,后续都没有I帧,这里打开保存的264文件分析数据帧时发现其数据帧如下

 

从上图中可以看到,第一个00 00 00 01 09可以判断出是分界符的类型,第二个00 00 00 01 27是SPS,第三个00 00 00 01 28是PPS,第四个00 00 00 01 06是SEI,第五个00 00 01 25才是IDR。判断类型补充如下,参考https://blog.csdn.net/jefry_xdz/article/details/8461343

我们还是接着看最上面图的码流对应的数据来层层分析,以00 00 00 01分割之后的下一个字节就是NALU类型,将其转为二进制数据后,解读顺序为从左往右算,如下:
(1)第1位禁止位,值为1表示语法出错
(2)第2~3位为参考级别
(3)第4~8为是nal单元类型

例如上面00000001后有67,68以及65

其中0x67的二进制码为:
0110 0111
4-8为00111,转为十进制7,参考第二幅图:7对应序列参数集SPS

其中0x68的二进制码为:
0110 1000
4-8为01000,转为十进制8,参考第二幅图:8对应图像参数集PPS

其中0x65的二进制码为:
0110 0101
4-8为00101,转为十进制5,参考第二幅图:5对应IDR图像中的片(I帧)

接着是后面的非IDR帧数据,如下图

依次分别是0x00 00 00 01 09(分隔符)|| 0x00 00 00 01 28(PPS)|| 0x00 00 00 01 06(SEI)|| 0x00 00 01 21(非IDR)。

所以用vlc播放失败的原因就在于这个分隔符,必须去掉这个分隔符才行。

Intel media SDK里有个sample_encode命令行程序,在执行sample_encode.exe h264 -i out.yuv -o out.264 -w 544 -h 960 -PicTimingSEI:off的时候,发现仍然没有去掉这个0x00 00 00 01 09(分隔符),通过参考https://blog.jianchihu.net/intel-media-sdk-remove-unused.html,发现在代码里pipeline_encode.cpp文件里添加m_CodingOption.AUDelimiter = MFX_CODINGOPTION_OFF;能去掉分隔符,如下:

   //-PicTimingSEI:off添加这个选项pInParams->nPicTimingSEI就会为true
if (pInParams->nPicTimingSEI || pInParams->nNalHrdConformance || pInParams->nVuiNalHrdParameters)
    {
        //只有进入到这里通过设置bCodingOption为true,m_CodingOption的配置才能生效
        m_CodingOption.PicTimingSEI = pInParams->nPicTimingSEI;
        m_CodingOption.NalHrdConformance = pInParams->nNalHrdConformance;
        m_CodingOption.VuiNalHrdParameters = pInParams->nVuiNalHrdParameters;
        
        //这行代码才是关键,很奇怪的是在inter media sdk说明文档里对这个测试程序的附加选项中没有这个值的对应选项,目前只能在代码里设置,不能通过命令行来设置
        m_CodingOption.AUDelimiter = MFX_CODINGOPTION_OFF;
        bCodingOption = true;
    }
    if (bCodingOption)
    {
        m_EncExtParams.push_back((mfxExtBuffer *)&m_CodingOption);
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值