MP4格式分析
1. mp4视频格式分析
官网(官网推荐的Git项目) ISO14496-12/14部分有详细描述。
H264格式有两种,一种是AnnexB-(0X00000001开头),一种是avcC(数据长度开头),见nalu的分析。
avcc、annexb的互相转换:参考 参考(h264_extradata_to_annexb) 官方
ffmpeg读取mp4中的h264数据,pps及sps并不能从packet中获得,而是保存在AVCodecContext的extradata数据域中
防竞争字节的详细说明
Mp4比较复杂,里面可能是avc1、avc2、avcC等:参考
avcC BOX的开头就是固定的61 76 63 43这四个字节。把这些信息写进容器中,播放器就能找到信息解码播放。4D、40、32也正如图一所示。
当然,最重要的就是sps、pps这些内容信息。
苹果官方有专业的quick time mp4文档。


2. H.264的SPS、PPS详解
bits 8 version ( always 0x01 ) 8 avc profile ( sps[0][1] ) 8 avc compatibility ( sps[0][2] ) 8 avc level ( sps[0][3] ) 6 reserved ( all bits on ) 2 NALULengthSizeMinusOne // 这个值是(前缀长度-1),值如果是3,那前缀就是4,因为4-1=3 3 reserved ( all bits on ) 5 number of SPS NALUs (usually 1) repeated once per SPS: 16 SPS size variable SPS NALU data 8 number of PPS NALUs (usually 1) repeated once per PPS 16 PPS size variable PPS NALU data


实例:
extraData中的SPS和PPS则是按照如上规则构成的:
![]()
0xFF和0xE1则是标志性的,67(sps)前面的0x0018则是长度。后面紧跟pps的个数0x01(第二行),长度0x0004(2字节,根据0xFF的后2bit得出)。
avcc的NALU:
前4字节标示了该帧的总长度(如果不够继续按该格式续接),0x0BDE = 3038, 加4字节刚好就是3042.
0x41和0x9A在每帧前面出现了,是什么意思? 是 NAL unit types in elementary streams,from:ISO_IEC_14496-15-AVC-format-2012.pdf

又如:

可见avcC格式的乃是 length(4bytes) + nalu type(1byte) + length + nalu type... 这样的序列集合。补充,RBSP
参见:

3. mp4音频格式分析
采用libaac的库来进行编码。音频编码主要注意比特率、采样率、通道。写mp4的前提就是pcm转aac,再和h264(avc)合成mp4。
其它工具:Atom Inspector

浙公网安备 33010602011771号