注:概念
- box:由唯一類型標識符和長度定義的面向?qū)ο蟮臉?gòu)件
- container box:用來容納一組相關(guān)box的box,container box通常都不是fullbox
- chunk:同一軌道的一組連續(xù)的采樣
- hint track:不包含媒體數(shù)據(jù)鲫懒,但包含了將一個或多個軌打包到流頻道的指示
- media data box:用來容納實體數(shù)據(jù)的box
- movie box:子box定義了元數(shù)據(jù)(metadata)的容器box
- sample:與單個時間戳相關(guān)聯(lián)的所有數(shù)據(jù)蚁堤,video sample即為一幀視頻醉者,或一組連續(xù)視頻幀,audio sample即為一段連續(xù)的壓縮音頻
- sample description:定義和描述軌中的采樣的格式的結(jié)構(gòu)
- sample table:指明sampe時序和物理布局的表
- track:按時間排序的相關(guān)的采樣披诗,對于媒體數(shù)據(jù)來說撬即,track表示一個視頻或音頻序列
1、概述
??MP4文件中的所有數(shù)據(jù)都裝在box(QuickTime中為atom)中呈队,也就是說MP4文件由若干個box組成剥槐,每個box有類型和長度,可以將box理解為一個數(shù)據(jù)對象塊宪摧。box中可以包含另一個box粒竖,這種box稱為container box。一個MP4文件首先會有且只有一個“ftyp”類型的box几于,作為MP4格式的標志并包含關(guān)于文件的一些信息蕊苗;之后會有且只有一個“moov”類型的box(Movie Box),它是一種container box沿彭,子box包含了媒體的metadata信息朽砰;MP4文件的媒體數(shù)據(jù)包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box喉刘,可以有多個瞧柔,也可以沒有(當媒體數(shù)據(jù)全部引用其他文件時),媒體數(shù)據(jù)的結(jié)構(gòu)由metadata進行描述睦裳。
2造锅、Box
??box中的字節(jié)序為網(wǎng)絡(luò)字節(jié)序,也就是大端字節(jié)序(Big-Endian)廉邑,簡單的說哥蔚,就是一個32位的4字節(jié)整數(shù)存儲方式為高位字節(jié)在內(nèi)存的低端。Box由header和body組成鬓催,其中header統(tǒng)一指明box的大小和類型肺素,body根據(jù)類型有不同的意義和格式。
??標準的box開頭的4個字節(jié)(32位)為box size宇驾,該大小包括box header和box body整個box的大小倍靡,這樣我們就可以在文件中定位各個box。如果size為1课舍,則表示這個box的大小為large size塌西,真正的size值要在largesize域上得到他挎。(實際上只有“mdat”類型的box才有可能用到large size。)如果size為0捡需,表示該box為文件的最后一個box办桨,文件結(jié)尾即為該box結(jié)尾。(同樣只存在于“mdat”類型的box中站辉。)
??size后面緊跟的32位為box type呢撞,一般是4個字符,如“ftyp”饰剥、“moov”等殊霞,這些box type都是已經(jīng)預(yù)定義好的,分別表示固定的意義汰蓉。如果是“uuid”绷蹲,表示該box為用戶擴展類型。如果box type是未定義的顾孽,應(yīng)該將其忽略祝钢。
3、ftyp:file type box
表明文件類型若厚,該box只有一個并且只能被包含在文件層拦英,不能被其他box包含。同時盹沈,他應(yīng)該出現(xiàn)在文件的最開始的位置龄章,指示該MP4文件應(yīng)用的相關(guān)信息。ftyp box包含一個32位的major brand(4個字符)乞封,一個32位的minor version(整數(shù))和一個以32位為單位的compatible brands數(shù)組。
注:box的類型為ftyp box大小為24個字節(jié)岗憋,其中major_brand和minor_version都是isom肃晚。
- major_brand: 是一個標識符
- minor_version: 是一個major brand 的次版本標識
- compatible_brands:是一個list,一直到box的結(jié)尾
4仔戈、Movie Box(moov)
該box包含了文件媒體的metadata信息关串,“moov”是一個container box,具體內(nèi)容信息由子box詮釋监徘。同F(xiàn)ile Type Box一樣晋修,該box有且只有一個,且只被包含在文件層凰盔。一般情況下墓卦,“moov”會緊隨“ftyp”出現(xiàn)』Ь矗“moov”中會包含1個“mvhd”和若干個“trak”落剪。其中“mvhd”為header box睁本,一般作為“moov”的第一個子box出現(xiàn)(對于其他container box來說,header box都應(yīng)作為首個子box出現(xiàn))忠怖∧匮撸“trak”包含了一個track的相關(guān)信息,是一個container box凡泣。