H264帧
对于H.264而言,每帧的界定符为00 00 00 01 或者00 00 01。
例如下面是一个H264的文件片段
00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00
00 03 00 10 00 00 03 01 48 F1 83 2A 00 00 00 01
68 CE 3C 80 00 00 01 06 05 FF FF 5D DC 45 E9 BD
E6 D9 48 B7 96 2C D8 20 D9 23 EE EF …
第一帧是00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A
第二帧是00 00 00 01 68 CE 3C 80
第三帧是00 00 01 06 05 FF FF 5D DC 45 E9 BD E6 D9 48 B7 96 2C D8 20 D9 23 EE EF ..
帧类型有:
NAL_SLICE = 1 非关键帧
NAL_SLICE_DPA = 2
NAL_SLICE_DPB = 3
NAL_SLICE_DPC =4
NAL_SLICE_IDR =5 关键帧
NAL_SEI = 6
NAL_SPS = 7 SPS帧
NAL_PPS = 8 PPS帧
NAL_AUD = 9
NAL_FILLER = 12
SPS 对于H264而言,就是编码后的第一帧,如果是读取的H264文件,就是第一个帧界定符和第二个帧界定符之间的数据的长度是4
PPS 就是编码后的第二帧,如果是读取的H264文件,就是第二帧界定符和第三帧界定符中间的数据长度不固定。
测试
http://samples.mplayerhq.hu/V-codecs/h264/
下载名为:H264_artifacts_motion.h264 的源文件
测试放在vlc中可以直接播放
使用sublimeText可直接打开查看二进制文件:
NALU
- 有时并不能直接得到NALU,文件中也没有ox00000001 分隔符:
- 从图中可以发现,packet中的数据起始处没有分隔符(0x00000001), 也不是0x65、0x67、0x68、0x41等字节,所以可以肯定这不是标准的nalu。
- 前4个字0x000032ce表示的是nalu的长度,从第5个字节开始才是nalu的数据。所以直接将前4个字节替换为0x00000001即可得到标准的nalu数据
- 获取pps和sps
- pps及sps不能从packet获得,而是保存在AVCodecContext的extradata数据域中
- 一般情况下,extradata中包含一个sps、一个pps 的nalu, 从
h264_mp4toannexb_bsf.c
代码中容易看出extradata的数据格式 - 分析后的sps及pps依然储存在extradata域中,并添加了起始符