一文读懂h264文件格式

发布时间:2020-07-11 14:30:15 作者: 阅读量:113

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

Catfish(鲶鱼) Blog V 2.3.27