MP4格式分析

1. mp4视频格式分析

  官网(官网推荐的Git项目)  ISO14496-12/14部分有详细描述。

  详参   详参(各种Box详解)

  H264格式有两种,一种是AnnexB-(0X00000001开头),一种是avcC(数据长度开头),见nalu的分析

  更多参考  参考(区别)  AVCC分析实例   分析

  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

 

posted @ 2020-08-12 17:27  AlexOne  阅读(1098)  评论(0)    收藏  举报