H264编解码中的防止竞争机制

问题h264流就是一个接一个的NAL组成,那么解码器如何在数据流中分辨每个NAL的起始和终止?

H264的解决方案: 在每个NAL前面添加起始码(3个字节): 0x00 00 01;此外,在某些类型的介质上,为了寻址方便,要求数据流在长度上对其,或必须是某个常数的倍数,考虑到这种情况,H264建议在起始码前添加若干字节的0来填充,直到该NAL的长度符合要求。在这样的机制下,解码器在码流中检测起始码,作为一个NAL的起始标识,当检测到下一个起始码时当前NAL结束。H264规定当检测到0x00 00 00时也可以表征当前NAL的结束,这时因为连着3个字节的0中,任何一个字节的0要么属于起始码,要么是起始码前面添加的0。

引入的问题:如果在NAL内部出现0x00 00 00 或者0x 00 00 01怎么办?而且这种可能性是很大的!

解决引入问题的方案:“防止竞争”机制


具体操作如下:
    当编码器编码完一个NAL后,检查该NAL单元内部是否出现以下左侧的四个字节序列,如果存在,编码器将在最后一个字节前插入一个新的字节:0x03
    从而使其变成右侧的样子,这样在NAL内部就不会出现0x00 00 00或者0x00 00 01了;然后解码器在NAL内部检测到0x00 00 03的序列时,将0x03丢弃,
    恢复原始数据。
        
                0x00 00 00  -----> 0x00 00 03 00
                0x00 00 01  -----> 0x00 00 03 01
                0x00 00 02  -----> 0x00 00 03 02
                0x00 00 03  -----> 0x00 00 03 03
                
    0x00 00 02是做保留用,0x00 00 03是为了避免原始数据中0x00 00 03序列。   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值