軟編碼Flv 到Mp4 容器(四) fmp4 總覽和基礎講解

https://github.com/332065255/flv2fmp4

代碼庫


軟編碼Flv 到Mp4 容器(一)
軟編碼Flv 到Mp4 容器(二) flv tag拆解
軟編碼Flv 到Mp4 容器(三) flv metadata tag解析
軟編碼Flv 到Mp4 容器(四) fmp4 總覽和基礎講解
軟編碼Flv 到Mp4 容器(五) fmp4 ftyp box 和moov>mvhd box詳解
軟編碼Flv 到Mp4 容器(六) fmp4 moov>trak>tkhd box 和 moov>trak>mdia>mdhd box講解
軟編碼Flv 到Mp4 容器(七) fmp4 mdia>hdlr box 和 mdia>minf> smhd 和dinf box講解
軟編碼Flv 到Mp4 容器(八) fmp4 mdia>stbl>stsd box 講解
軟編碼Flv 到Mp4 容器(九) fmp4 stts stsc stsz stco box 講解
軟編碼Flv 到Mp4 容器(十) fmp4 mvex box 講解
軟編碼Flv 到Mp4 容器(十一) fmp4 moof box詳解
軟編碼Flv 到Mp4 容器(十二) fmp4 mdat box詳解
軟編碼Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv數據


首先約定幾個定義

1、 文件,由許多Box和FullBox組成。
2、 Box,每個Box由Header和Data組成。
3、 FullBox,是Box的擴展,Box結構的基礎上在Header中增加8bits version和24bits flags。

4、 Header,包含了整個Box的長度size和類型type。
當size==0時,代表這是文件中最後一個Box;當size==1時,意味着Box長度需要更多bits來描述,在後面會定義一個64bits的largesize描述Box的長度;當type是uuid時,代表Box中的數據是用戶自定義擴展類型。
5、 Data,是Box的實際數據,可以是純數據也可以是更多的子Boxes。
6、 當一個Box的Data中是一系列子Box時,這個Box又可成爲Container Box。

Container box意思是容器box,裏面會包含更多的box, 代表有moov box
full box是單個box,裏面不會包含更多的box,代表有mvhd box
full box 組成如下:4字節長度+4字節box type+1字節版本+3字節保留位+各種box特有內容

標準的box開頭的4個字節(32位)爲box size,該大小包括box header和box body整個box的大小,這樣我們就可以在文件中定位各個box。如果size爲1,則表示這個box的大小爲large size,真正的size值要在largesize域上得到。(實際上只有“mdat”類型的box纔有可能用到large size。)如果size爲0,表示該box爲文件的最後一個box,文件結尾即爲該box結尾。(同樣只存在於“mdat”類型的box中。)
size後面緊跟的32位爲box type,一般是4個字符,如“ftyp”、“moov”等,這些box type都是已經預定義好的,分別表示固定的意義。如果是“uuid”,表示該box爲用戶擴展類型。如果box type是未定義的,應該將其忽略。


下面是一段 標準的mp4開頭二進制代碼

00000000h: 00 00 00 1C  66 74 79 70     6D 70 34 32     00 00 00 00 ;       

            1c長度爲28   f   t  y  p     m  p   4  2      0   0  0  0

00000010h: 6D 70 34 32  6D 70 34 31     69 73 6F 6D     00 00 04 63 ; 
            這12個字節表明的是兼容品牌       到此28字節結束   0x4631123
                                        ftyp box結束
            m  p  4  2   m  p  4  1      i  s  o  m

00000020h: 6D 6F 6F 76  00 00 00 6C     6D 76 68 64     00 00 00 00 ; 
           m   o  o  v   6c爲 108        m  v  h  d
                                        mvhd box爲fullbox,所以0x00000000爲內容
moov爲容器,所以後4個字節爲下個box的長度

mvhd的box內容比較繁瑣,就不全部貼出來了,下面是官方mp4文檔的mvhd的詳細說明

aligned(8) class MovieHeaderBox extends FullBox(‘mvhd’, version, 0) 
{ 
    if (version==1) {
   unsigned int(64)  creation_time;
   unsigned int(64)  modification_time;
   unsigned int(32)  timescale;
   unsigned int(64)  duration;
} else { // version==0
   unsigned int(32)  creation_time;
   unsigned int(32)  modification_time;
   unsigned int(32)  timescale;
   unsigned int(32)  duration;
}
template int(32)  rate = 0x00010000; //
template int(16)  volume = 0x0100;   //
const bit(16)  reserved = 0;
const unsigned int(32)[2]  reserved = 0;
template int(32)[9]  matrix =
typically 1.0
typically, full volume
{ 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };
      // Unity matrix
   bit(32)[6]  pre_defined = 0;
   unsigned int(32)  next_track_ID;
}

一個正常的fmp4文件,他的box排序是下面的這種情況

 - ftyp
 - moov
     - mvhd
     - trak
         - tkhd
         - mdia
             - mdhd
             - hdlr
             - minf
                 - smhd
                 - dinf
                     - dref
                         - url
                 - stbl
                     -  stsd
                         - mp4a(avc1)
                             - esds(avcC)
                     - stts
                     - stsc
                     - stsz
                     - stco


     - mvex
        -trex
 - moof
    - mfhd
    - traf
        -tfhd
        -tfdt
        -sdtp
        -trun
 - mdat

由上圖可見..fmp4 box非常複雜,所以本系列博客也是循序漸進,一步一步的來講每個box的情況.

本章我們主要講解了box和 fmp4的box組合情況

下一章我們來講解fmp4中 ftyp和moov中mvhd的詳細情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章