H.264格式简单介绍—FFmpeg源码分析

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

h264 是编码层的标准格式,不是容器层的标准格式,容器层是指 MP4,FLV 这种 Muxer 的容器格式。

h264 码流有两种组织方式,Annex BavcC,如下:

1,H.264 Annex B,ITU 组织定义的

ITU 组织的 Coding of moving video 部分的标准文档的 正文 里只是对 H.264 的编码方法做了规范,但是没有规定怎么排列编码后的数据。所以他们后面在 Annex B(附录B)后面增加了数据排列的规范,如下:

4-1

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

0-1-2

上图中的每一个 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 里面,如下:

0-2


avcC 格式是在每个 nalu 的 前面,注意是前面,加上 1~4 个字节来表示 nalu 的长度,具体是 1 字节还是 4字节 在另一个地方 extradata 里面可以找到的。通常是 4 字节来表达 nalu 的长度

avcC 格式通常不单独使用,它必须包在一个 container(容器)里面,例如 MP4。可以说 MP4 里面的 H264 它就是 avcC 格式的。不信我们用 StreamAnalyzer 打开 juren-30s.mp4 来看看。如下:

0-3

第一个 H264 NALU 的开始位置是 0x26f,结束位置是 0x2809,所以这个 NALU 的大小应该是 0x2809-0x26f,跟前面0x0000259a 是完全一致的。


参考文章:

  1. H.264 视频编解码技术分享--AnnexB 和 avcC
  2. H264码流之AnnexB和AVCC
  3. how-to-convert-raw-h-264-in-annex-b-format-to-avcc-using-ffmpeg-command-line

版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2023-12-30 19:24:46

results matching ""

    No results matching ""