免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

mp4文件格式解析

 angelbrian 2013-01-30
目前MP4的概念被炒得很火,也很亂。最開始MP4指的是音頻(MP3的升級版),即MPEG-2 AAC標(biāo)準(zhǔn)。隨后MP4概念被轉(zhuǎn)移到視頻上,對應(yīng)的是MPEG-4標(biāo)準(zhǔn)。而現(xiàn)在我們流行的叫法,多半是指能播放MPEG-4標(biāo)準(zhǔn)編碼格式視頻的播放器。但是這篇文章介紹的內(nèi)容跟上面這些都無關(guān),我們要討論的是MP4文件封裝格式,對應(yīng)的標(biāo)準(zhǔn)為ISO/IEC 14496-12,即信息技術(shù) 視聽對象編碼的第12部分:ISO 基本媒體文件格式(Information technology Coding of audio-visual objects Part 12: ISO base media file format)。ISO/IEC組織指定的標(biāo)準(zhǔn)一般用數(shù)字表示,ISO/IEC 14496MPEG-4標(biāo)準(zhǔn)。

    MP4視頻文件封裝格式是基于QuickTime容器格式定義的,因此參考QuickTime的格式定義對理解MP4文件格式很有幫助。MP4文件格式是一個(gè)十分開放的容器,幾乎可以用來描述所有的媒體結(jié)構(gòu),MP4文件中的媒體描述與媒體數(shù)據(jù)是分開的,并且媒體數(shù)據(jù)的組織也很自由,不一定要按照時(shí)間順序排列,甚至媒體數(shù)據(jù)可以直接引用其他文件。同時(shí),MP4也支持流媒體。MP4目前被廣泛用于封裝h.264視頻和AAC音頻,是高清視頻的代表。

 

    現(xiàn)在我們就來看看MP4文件格式到底是什么樣的。

1、概述

    MP4文件中的所有數(shù)據(jù)都裝在box(QuickTime中為atom)中,也就是說MP4文件由若干個(gè)box組成,每個(gè)box有類型和長度,可以將box理解為一個(gè)數(shù)據(jù)對象塊。box中可以包含另一個(gè)box,這種box稱為container box。一個(gè)MP4文件首先會(huì)有且只有一個(gè)“ftyp”類型的box,作為MP4格式的標(biāo)志并包含關(guān)于文件的一些信息;之后會(huì)有且只有一個(gè)“moov”類型的box(Movie Box),它是一種container box,子box包含了媒體的metadata信息;MP4文件的媒體數(shù)據(jù)包含在“mdat”類型的box(Midia Data Box)中,該類型的box也是container box,可以有多個(gè),也可以沒有(當(dāng)媒體數(shù)據(jù)全部引用其他文件時(shí)),媒體數(shù)據(jù)的結(jié)構(gòu)由metadata進(jìn)行描述。

    下面是一些概念:

    track  表示一些sample的集合,對于媒體數(shù)據(jù)來說,track表示一個(gè)視頻或音頻序列。

    hint track  這個(gè)特殊的track并不包含媒體數(shù)據(jù),而是包含了一些將其他數(shù)據(jù)track打包成流媒體的指示信息。

    sample  對于非hint track來說,video sample即為一幀視頻,或一組連續(xù)視頻幀,audio sample即為一段連續(xù)的壓縮音頻,它們統(tǒng)稱sample。對于hint track,sample定義一個(gè)或多個(gè)流媒體包的格式。

    sample table  指明sampe時(shí)序和物理布局的表。

    chunk 一個(gè)track的幾個(gè)sample組成的單元。

    在本文中,我們不討論涉及hint的內(nèi)容,只關(guān)注包含媒體數(shù)據(jù)的本地MP4文件。下圖為一個(gè)典型的MP4文件的結(jié)構(gòu)樹。

 

mp4文件格式解析(一)

2、Box

       首先需要說明的是,box中的字節(jié)序?yàn)榫W(wǎng)絡(luò)字節(jié)序,也就是大端字 節(jié)序(Big-Endian),簡單的說,就是一個(gè)32位的4字節(jié)整數(shù)存儲方式為高位字節(jié)在內(nèi)存的低端。Box由header和body組成,其中 header統(tǒng)一指明box的大小和類型,body根據(jù)類型有不同的意義和格式。

       標(biāo)準(zhǔn)的box開頭的4個(gè)字節(jié)(32位)為box size,該大小包括box header和box body整個(gè)box的大小,這樣我們就可以在文件中定位各個(gè)box。如果size為1,則表示這個(gè)box的大小為large size,真正的size值要在largesize域上得到。(實(shí)際上只有“mdat”類型的box才有可能用到large size。)如果size為0,表示該box為文件的最后一個(gè)box,文件結(jié)尾即為該box結(jié)尾。(同樣只存在于“mdat”類型的box中。)

       size后面緊跟的32位為box type,一般是4個(gè)字符,如“ftyp”、“moov”等,這些box type都是已經(jīng)預(yù)定義好的,分別表示固定的意義。如果是“uuid”,表示該box為用戶擴(kuò)展類型。如果box type是未定義的,應(yīng)該將其忽略。

3File Type Boxftyp

    該box有且只有1個(gè),并且只能被包含在文件層,而不能被其他box包含。該box應(yīng)該被放在文件的最開始,指示該MP4文件應(yīng)用的相關(guān)信息。

    “ftyp” body依次包括1個(gè)32位的major brand(4個(gè)字符),1個(gè)32位的minor version(整數(shù))和1個(gè)以32位(4個(gè)字符)為單位元素的數(shù)組compatible brands。這些都是用來指示文件應(yīng)用級別的信息。該box的字節(jié)實(shí)例如下:

mp4文件格式解析(一)

4Movie Boxmoov

    該box包含了文件媒體的metadata信息,“moov”是一個(gè)container box,具體內(nèi)容信息由子box詮釋。同F(xiàn)ile Type Box一樣,該box有且只有一個(gè),且只被包含在文件層。一般情況下,“moov”會(huì)緊隨“ftyp”出現(xiàn)。

    一般情況下(限于篇幅,本文只講解常見的MP4文件結(jié)構(gòu)),“moov”中會(huì)包含1個(gè)“mvhd”和若干個(gè)“trak”。其中“mvhd”為header box,一般作為“moov”的第一個(gè)子box出現(xiàn)(對于其他container box來說,header box都應(yīng)作為首個(gè)子box出現(xiàn))?!皌rak”包含了一個(gè)track的相關(guān)信息,是一個(gè)container box。下圖為部分“moov”的字節(jié)實(shí)例,其中紅色部分為box header,綠色為“mvhd”,黃色為一部分“trak”。

mp4文件格式解析(一)

4.1 Movie Header Boxmvhd

   mvhd”結(jié)構(gòu)如下表。

 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

creation time

4

創(chuàng)建時(shí)間(相對于UTC時(shí)間1904-01-01零點(diǎn)的秒數(shù))

modification time

4

修改時(shí)間

time scale

4

文件媒體在1秒時(shí)間內(nèi)的刻度值,可以理解為1秒長度的時(shí)間單元數(shù)

duration

4

該track的時(shí)間長度,用duration和time scale值可以計(jì)算track時(shí)長,比如audio track的time scale = 8000, duration = 560128,時(shí)長為70.016,video track的time scale = 600, duration = 42000,時(shí)長為70

rate

4

推薦播放速率,高16位和低16位分別為小數(shù)點(diǎn)整數(shù)部分和小數(shù)部分,即[16.16] 格式,該值為1.0(0x00010000)表示正常前向播放

volume

2

與rate類似,[8.8] 格式,1.0(0x0100)表示最大音量

reserved

10

保留位

matrix

36

視頻變換矩陣

pre-defined

24

 

next track id

4

下一個(gè)track使用的id號

 

   

   mvhd”的字節(jié)實(shí)例如下圖,各字段已經(jīng)用顏色區(qū)分開:

mp4文件格式解析(一)

4.2 Track Boxtrak

    “trak”也是一個(gè)container box,其子box包含了該track的媒體數(shù)據(jù)引用和描述(hint track除外)。一個(gè)MP4文件中的媒體可以包含多個(gè)track,且至少有一個(gè)track,這些track之間彼此獨(dú)立,有自己的時(shí)間和空間信息?!皌rak”必須包含一個(gè)“tkhd”和一個(gè)“mdia”,此外還有很多可選的box(略)。其中“tkhd”為track header box,“mdia”為media box,該box是一個(gè)包含一些track媒體數(shù)據(jù)信息box的container box。

    “trak”的部分字節(jié)實(shí)例如下圖,其中黃色為“trak”box的頭,綠色為“tkhd”,藍(lán)色為“edts”(一個(gè)可選box),紅色為一部分“mdia”。

mp4文件格式解析(一)


4.2.1 Track Header Boxtkhd

   tkhd”結(jié)構(gòu)如下表。 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

按位或操作結(jié)果值,預(yù)定義如下:

0x000001 track_enabled,否則該track不被播放;

0x000002 track_in_movie,表示該track在播放中被引用;

0x000004 track_in_preview,表示該track在預(yù)覽時(shí)被引用。

一般該值為7,如果一個(gè)媒體所有track均未設(shè)置track_in_movie和track_in_preview,將被理解為所有track均設(shè)置了這兩項(xiàng);對于hint track,該值為0

creation time

4

創(chuàng)建時(shí)間(相對于UTC時(shí)間1904-01-01零點(diǎn)的秒數(shù))

modification time

4

修改時(shí)間

track id

4

id號,不能重復(fù)且不能為0

reserved

4

保留位

duration

4

track的時(shí)間長度

reserved

8

保留位

layer

2

視頻層,默認(rèn)為0,值小的在上層

alternate group

2

track分組信息,默認(rèn)為0表示該track未與其他track有群組關(guān)系

volume

2

[8.8] 格式,如果為音頻track,1.0(0x0100)表示最大音量;否則為0

reserved

2

保留位

matrix

36

視頻變換矩陣

width

4

height

4

高,均為 [16.16] 格式值,與sample描述中的實(shí)際畫面大小比值,用于播放時(shí)的展示寬高

 

 

   tkhd”的字節(jié)實(shí)例如下圖,各字段已經(jīng)用顏色區(qū)分開:

mp4文件格式解析(二)


4.2.2 Media Boxmdia

   mdia”也是個(gè)container box,其子box的結(jié)構(gòu)和種類還是比較復(fù)雜的。先來看一個(gè)“mdia”的實(shí)例結(jié)構(gòu)樹圖。

mp4文件格式解析(二)


       總體來說,“mdia”定義了track媒體類型以及sample數(shù)據(jù),描述sample信息。一般“mdia”包含一個(gè)“mdhd”,一個(gè)“hdlr”和一個(gè)“minf”,其中“mdhd”為media header box,“hdlr”為handler reference box,“minf”為media information box。下面依次看一下這幾個(gè)box的結(jié)構(gòu)。

4.2.2.1 Media Header Boxmdhd

   mdhd”結(jié)構(gòu)如下表。 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

creation time

4

創(chuàng)建時(shí)間(相對于UTC時(shí)間1904-01-01零點(diǎn)的秒數(shù))

modification time

4

修改時(shí)間

time scale

4

同前表

duration

4

track的時(shí)間長度

language

2

媒體語言碼。最高位為0,后面15位為3個(gè)字符(見ISO 639-2/T標(biāo)準(zhǔn)中定義)

pre-defined

2

 

  

   mdhd”的字節(jié)實(shí)例如下圖,各字段已經(jīng)用顏色區(qū)分開:

mp4文件格式解析(二)

4.2.2.2 Handler Reference Boxhdlr

   hdlr”解釋了媒體的播放過程信息,該box也可以被包含在meta boxmeta)中?!?/span>hdlr”結(jié)構(gòu)如下表。

 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

pre-defined

4

 

handler type

4

在media box中,該值為4個(gè)字符:

“vide”— video track

“soun”— audio track

“hint”— hint track

reserved

12

 

name

不定

track type name,以‘\0’結(jié)尾的字符串

 

   hdlr”的字節(jié)實(shí)例如下圖,各字段已經(jīng)用顏色區(qū)分開:

mp4文件格式解析(二)


4.2.2.3 Media Information Boxminf

    “minf”存儲了解釋track媒體數(shù)據(jù)的handler-specific信息,media handler用這些信息將媒體時(shí)間映射到媒體數(shù)據(jù)并進(jìn)行處理?!癿inf”中的信息格式和內(nèi)容與媒體類型以及解釋媒體數(shù)據(jù)的media handler密切相關(guān),其他media handler不知道如何解釋這些信息?!癿inf”是一個(gè)container box,其實(shí)際內(nèi)容由子box說明。

    一般情況下,“minf”包含一個(gè)header box,一個(gè)“dinf”和一個(gè)“stbl”,其中,header box根據(jù)track type(即media handler type)分為“vmhd”、“smhd”、“hmhd”和“nmhd”,“dinf”為data information box,“stbl”為sample table box。下面分別介紹。

    下圖為“minf”部分字節(jié)實(shí)例,其中紅色為box header,藍(lán)色為“smhd”,綠色為“dinf”,黃色為一部分“stbl”。

mp4文件格式解析(二)

4.2.2.3.1 Media Information Header Boxvmhd、smhd、hmhd、nmhd

Video Media Header Boxvmhd 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

graphics mode

4

視頻合成模式,為0時(shí)拷貝原始圖像,否則與opcolor進(jìn)行合成

opcolor

2×3

{red,green,blue}

 

 

Sound Media Header Boxsmhd 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

balance

2

立體聲平衡,[8.8] 格式值,一般為0,-1.0表示全部左聲道,1.0表示全部右聲道

reserved

2

 

 

Hint Media Header Box(hmhd)

   

Null Media Header Box(nmhd)

    非視音頻媒體使用該box,略。

4.2.2.3.2 Data Information Boxdinf

    “dinf”解釋如何定位媒體信息,是一個(gè)container box?!癲inf”一般包含一個(gè)“dref”,即data reference box;“dref”下會(huì)包含若干個(gè)“url”或“urn”,這些box組成一個(gè)表,用來定位track數(shù)據(jù)。簡單的說,track可以被分成若干段,每 一段都可以根據(jù)“url”或“urn”指向的地址來獲取數(shù)據(jù),sample描述中會(huì)用這些片段的序號將這些片段組成一個(gè)完整的track。一般情況下,當(dāng) 數(shù)據(jù)被完全包含在文件中時(shí),“url”或“urn”中的定位字符串是空的。

    “dref”的字節(jié)結(jié)構(gòu)如下表。 

字段

字節(jié)數(shù)

意義

box size

4

box大小

box type

4

box類型

version

1

box版本,0或1,一般為0。(以下字節(jié)數(shù)均按version=0)

flags

3

 

entry count

4

“url”或“urn”表的元素個(gè)數(shù)

“url”或“urn”列表

不定

 

 

   url”或“urn”都是box,“url”的內(nèi)容為字符串(location string),“urn”的內(nèi)容為一對字符串(name string and location string)。當(dāng)“url”或“urn”的box flag1時(shí),字符串均為空。

    下面是一個(gè)“dinf”的字節(jié)實(shí)例圖。其中黃色為“dinf”的box header,由紅色部分我們知道包含的“url”或“urn”個(gè)數(shù)為1,紅色后面為“urlbox的內(nèi)容。紫色為“url”的box header(根據(jù)box type我們知道是個(gè)“url”),綠色為box flag,值為1,說明“url”中的字符串為空,表示track數(shù)據(jù)已包含在文件中。

mp4文件格式解析(三)

4.2.2.3.3 Sample Table Boxstbl

   stbl”幾乎是普通的MP4文件中最復(fù)雜的一個(gè)box了,首先需要回憶一下sample的概念。sample是媒體數(shù)據(jù)存儲的單位,存儲在mediachunk中,chunksample的長度均可互不相同,如下圖所示。

mp4文件格式解析(三)

    “stbl”包含了關(guān)于track中sample所有時(shí)間和位置的信息,以及sample的編解碼等信息。利用這個(gè)表,可以解釋sample的時(shí)序、類型、大小以及在各自存儲容器中的位置。“stbl”是一個(gè)container box,其子box包括:sample description box(stsd)、time to sample box(stts)、sample size box(stsz或stz2)、sample to chunk box(stsc)、chunk offset box(stco或co64)、composition time to sample box(ctts)、sync sample box(stss)等。

    “stsd”必不可少,且至少包含一個(gè)條目,該box包含了data reference box進(jìn)行sample數(shù)據(jù)檢索的信息。沒有“stsd”就無法計(jì)算media sample的存儲位置?!皊tsd”包含了編碼的信息,其存儲的信息隨媒體類型不同而不同。

Sample Description Box(stsd)

    box header和version字段后會(huì)有一個(gè)entry count字段,根據(jù)entry的個(gè)數(shù),每個(gè)entry會(huì)有type信息,如“vide”、“sund”等,根據(jù)type不同sample description會(huì)提供不同的信息,例如對于video track,會(huì)有“VisualSampleEntry”類型信息,對于audio track會(huì)有“AudioSampleEntry”類型信息。

    視頻的編碼類型、寬高、長度,音頻的聲道、采樣等信息都會(huì)出現(xiàn)在這個(gè)box中。

Time To Sample Box(stts)

    “stts”存儲了sample的duration,描述了sample時(shí)序的映射方法,我們通過它可 以找到任何時(shí)間的sample?!皊tts”可以包含一個(gè)壓縮的表來映射時(shí)間和sample序號,用其他的表來提供每個(gè)sample的長度和指針。表中每 個(gè)條目提供了在同一個(gè)時(shí)間偏移量里面連續(xù)的sample序號,以及samples的偏移量。遞增這些偏移量,就可以建立一個(gè)完整的time to sample表。

Sample Size Box(stsz)

    “stsz” 定義了每個(gè)sample的大小,包含了媒體中全部sample的數(shù)目和一張給出每個(gè)sample大小的表。這個(gè)box相對來說體積是比較大的。

Sample To Chunk Box(stsc)

    用chunk組織sample可以方便優(yōu)化數(shù)據(jù)獲取,一個(gè)thunk包含一個(gè)或多個(gè)sample?!皊tsc”中用一個(gè)表描述了sample與chunk的映射關(guān)系,查看這張表就可以找到包含指定sample的thunk,從而找到這個(gè)sample。

Sync Sample Box(stss)

    “stss”確定media中的關(guān)鍵幀。對于壓縮媒體數(shù)據(jù),關(guān)鍵幀是一系列壓縮序列的開始幀,其解壓縮 時(shí)不依賴以前的幀,而后續(xù)幀的解壓縮將依賴于這個(gè)關(guān)鍵幀?!皊tss”可以非常緊湊的標(biāo)記媒體內(nèi)的隨機(jī)存取點(diǎn),它包含一個(gè)sample序號表,表內(nèi)的每一 項(xiàng)嚴(yán)格按照sample的序號排列,說明了媒體中的哪一個(gè)sample是關(guān)鍵幀。如果此表不存在,說明每一個(gè)sample都是一個(gè)關(guān)鍵幀,是一個(gè)隨機(jī)存取 點(diǎn)。

Chunk Offset Box(stco)

    “stco”定義了每個(gè)thunk在媒體流中的位置。位置有兩種可能,32位的和64位的,后者對非常 大的電影很有用。在一個(gè)表中只會(huì)有一種可能,這個(gè)位置是在整個(gè)文件中的,而不是在任何box中的,這樣做就可以直接在文件中找到媒體數(shù)據(jù),而不用解釋 box。需要注意的是一旦前面的box有了任何改變,這張表都要重新建立,因?yàn)槲恢眯畔⒁呀?jīng)改變了。

5、Free Space Boxfreeskip

   free”中的內(nèi)容是無關(guān)緊要的,可以被忽略。該box被刪除后,不會(huì)對播放產(chǎn)生任何影響。

6、Meida Data Boxmdat

    該box包含于文件層,可以有多個(gè),也可以沒有(當(dāng)媒體數(shù)據(jù)全部為外部文件引用時(shí)),用來存儲媒體數(shù)據(jù)。數(shù)據(jù)直接跟在box type字段后面,具體數(shù)據(jù)結(jié)構(gòu)的意義需要參考metadata(主要在sample table中描述)。

 

    普通MP4文件的結(jié)構(gòu)就講完了,可能會(huì)比較亂,下面這張圖是常見的box的樹結(jié)構(gòu)圖,可以用來大致了解MP4文件的構(gòu)造。

mp4文件格式解析(四)

   

    這篇文章主要面向一些對MP4文件結(jié)構(gòu)沒有太多了解的初學(xué)者,算是篇比較初級的文章,本人也是參考了一些資料寫出來的,對于MP4文件中涉及的一些概念沒有太深入的了解,因此其中應(yīng)該是有一些錯(cuò)誤理解,希望大家抱著批判的眼光讀這篇文章。如果有錯(cuò)誤的地方,還請大家不吝賜教。該文主要參考了標(biāo)準(zhǔn)和網(wǎng)友wqyuwssblog系列文章:mp4文件格式


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多