h264裸流(Annex B)
Network Abstraction Layer Units简称NALU也叫 NAL
是指起始码(Start Code)分隔开的一个个NALU
起始码:00 00 01或者 00 00 00 01
一帧画面分成多份时,起始码是3字节, 其余情况4字节, 也有可能不按这个规则编码
如果一个NAL中出现 00 00 00或 00 00 01 或 00 00 02或 00 00 03 防竞争码
替换成
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
解码时, 删除nal数据中防竞争码的0x00 00 03 00, 丢弃03
--------------------------------------------------
0x67开头 SPS
0x68开头 PPS
H264解码前使用sps pps创建CMVideoFormatDescriptionRef
HEVC解码前使用pvs sps pps创建CMVideoFormatDescriptionRef
--------
AVCC,HVCC格式(mp4)
videotoolbox硬解码只支持avc1(h264)或hvcc(HEVC),h264和hevc封装成mp4。如果是裸流需删除起始码,添加4字节前缀
--------------
没有B帧时,DTS和PTS一样
I帧.(关键帧,无需参考其他帧) P.(向前参考I. P.帧) B.(向前和向后参考I. P.帧)
压缩率排序: B >P>I帧,B帧压缩率最高,失真最多
2个I帧之间 组成GOP(Group of Picture)
IDR帧(Decoded Picture Buffer): 特殊的I帧,一般是在第一个I帧,立马清空参考帧列队,并将解码数据全部丢弃, 后面的帧不能参考IDR前面的帧, 有了IDR帧就能从随意点起播, 如果没有IDR帧随意点起播会崩溃
收到IDR帧, 解码器需要重新更新PPS和SPS参数
解码必须包含I. P.帧
I. P.帧之间插入的B.帧越多压缩比越高,然后增加B帧增加延迟
直播时b帧丢弃,加快直播播放,客户端无法保证是不是立马接受到后面的B帧数据,最后用户看到的是永无止境的等待,b帧双向参考,参考向前向后参考I. P.帧
PTS(Presentation Time Stamp): 将解码后数据按照顺序在屏幕上显示
DTS(Decode Time Stanp): 决定压缩数据什么时候开始解码
如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame