H.264格式简单介绍—FFmpeg源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
h264 是编码层的标准格式,不是容器层的标准格式,容器层是指 MP4,FLV 这种 Muxer 的容器格式。
h264 码流有两种组织方式,Annex B 与 avcC,如下:
1,H.264 Annex B,ITU 组织定义的
ITU 组织的 Coding of moving video 部分的标准文档的 正文 里只是对 H.264 的编码方法做了规范,但是没有规定怎么排列编码后的数据。所以他们后面在 Annex B(附录B)后面增加了数据排列的规范,如下:
Annex B 格式,这个名字是有点奇怪的,他并不是一个正统的格式名称,他指的就是 Coding of moving video 标准里面 附录B 定义的数据排列格式。
Coding of moving video 部分的标准文档,可以在 百度网盘 进行下载。
Annex B
格式是用 NALU Start Codes(开始码)来分割 nalu 单元的,NALU Start Codes 可以是 0x000001
或者 0x00000001
。
其他资料说 Annex B 格式 通常用于实时传输场景,也就是 RTMP-FLV 直播的时候 H.264 数据是 Annex B 格式的。但是我按照《Wireshark解密SRS的WebRTC数据》一文抓包看 WebRTC 的流,发现 H.264 数据又不是 Annex B 格式的。
如果你想获得一个 Annex B
格式的 h264 文件,可以使用下面的命令,素材可以在 GitHub 下载。
ffmpeg -i juren-30s.mp4 -an -c:v copy -bsf:h264_mp4toannexb -f h264 juren-30s.h264
上图中的每一个 slice
都是一个 NALU
,都是以 0x000001
开头的。
2,H.264 avcC,ISO/IEC 组织定义的
ISO/IEC 组织把 H.264 称为 AVC 编码的,AVC 的全称是 Advanced Video Coding。avcC
格式后面的 C
代表 Configuration
(配置)。
avcC
格式的标准定义在 ISO_IEC_14496-15 里面,如下:
avcC
格式是在每个 nalu 的 前面,注意是前面,加上 1~4
个字节来表示 nalu 的长度,具体是 1 字节还是 4字节 在另一个地方 extradata
里面可以找到的。通常是 4 字节来表达 nalu 的长度
avcC
格式通常不单独使用,它必须包在一个 container
(容器)里面,例如 MP4。可以说 MP4 里面的 H264 它就是 avcC
格式的。不信我们用 StreamAnalyzer 打开 juren-30s.mp4
来看看。如下:
第一个 H264 NALU 的开始位置是 0x26f
,结束位置是 0x2809
,所以这个 NALU 的大小应该是 0x2809-0x26f
,跟前面的 0x0000259a
是完全一致的。
参考文章: