06我開始做3gp文件的播放器,但是關于3gp的文檔太少了也很難找,在網(wǎng)友luxh的幫助下,
我終于有了第一份關于3gp文件格式的文檔《ISO/IEC 14496-12,ISO媒體文件格式》.
在此真心感謝luxh的貢獻.
當然了是英文版的,有文檔就不錯了.為了便于查閱和理解,我把之后陸續(xù)找到的其他幾個文檔也揉在了一起.
從06年5月12日到現(xiàn)在2007-3-23,一點點的擠時間,總算寫完了.如有錯誤,敬請斧正.
之所以寫這篇文章目的只有一個,希望大家都能夠少走彎路.
有用的到的人可以隨意復制,轉(zhuǎn)貼.
因為以后我有可能會對本文修改更新,所以請保留文中的原始鏈接.
愿意同我一道研究的人請加msn:windcao@hotmail.com
需要看的文檔
http://www.3gpp.org/ftp/Specs/archive/26_series/
3GPP TS 26.233
3GPP TS 26.243
3GPP TS 26.244
luxh找到的一個好東西
http://isotc.iso.org/livelink/livelink/fetch/2000/2489/Ittf_Home/PubliclyAvailableStandards.htm
大家一定要仔細找找啊,寶藏!
我們研究3gpp文件最重要的兩個文檔就是《ISO/IEC 14496-12,ISO媒體文件格式》和《3GPP TS 26.244-700》
ISO/IEC 14496的組成如下:(引自:http://www.blogcn.com/user73/lipingfu/index.html)
(1)ISO/IEC 14496-1,系統(tǒng)部分,描述了組成一個場景的音頻和視頻成分之間的關系。
(2、3)ISO/IEC 14496-2,視頻部分和ISO/IEC 14496-3音頻部分,分別規(guī)定自然的和合成的視頻對象、音頻對象的編碼表示。
(4)ISO/IEC 14496-4,一致性測試部分,定義了比特流和設備的一致性條件,用來測試MPEG-4的實現(xiàn)。
(5)ISO/IEC 14496-5,參考軟件,包括與MPEG-4的主要部分相對應的軟件。
(6)ISO/IEC 14496-6,多媒體傳送整體框架DMIF,這是MPEG-4應用層與傳輸網(wǎng)絡的接口,定義了通信協(xié)議,使MPEG-4系統(tǒng)的數(shù)據(jù)流能進入各種傳輸網(wǎng)絡。還包含一個存儲格式MP4,用于存儲編碼的場景。
(7) ISO/IEC 14496-7,為MPEG-4工具優(yōu)化軟件,提供了對實現(xiàn)進行優(yōu)化的例子(這里的實現(xiàn)指的是第五部分)。
(8)ISO/IEC 14496-8,定義了在IP網(wǎng)絡上傳輸MPEG-4內(nèi)容的方式。
(9)ISO/IEC 14496-9,為參考硬件描述,提供了用于演示怎樣在硬件上實現(xiàn)本標準其他部分功能的硬件設計方案。
(10)ISO/IEC 14496-10,高級視頻編碼AVC,定義了一個被稱為AVC的視頻編解碼器。
(11)ISO/IEC 14496-11,場景描述和應用引擎。
(12)ISO/IEC 14496-12,ISO媒體文件格式,定義了一個存儲媒體內(nèi)容的文件格式。
(13)ISO/IEC 14496-13,知識產(chǎn)權(quán)管理和保護(IPMP)擴展。
(14)ISO/IEC 14496-14,MP4文件格式,定義了基于第十二部分的用于存儲MPEG-4內(nèi)容的容器文件格式。
(15)ISO/IEC 14496-15,AVC文件格式,定義了基于第十二部分的用于存儲第十部分的視頻內(nèi)容的文件格式。
(16)ISO/IEC 14496-16,動畫框架擴展AFX(Animation Framework eXtension)。
(17)ISO/IEC 14496-17,同步文本字幕格式(尚未完成,2005年1月達成"最終委員會草案"。
(18)ISO/IEC 14496-18,字體壓縮和流式傳輸(針對公開字體格式)。
(19)ISO/IEC 14496-19,綜合材質(zhì)流(Synthesized Texture Stream)。
(20)ISO/IEC 14496-20,簡單場景表示(尚未完成,2005年1月達成"最終委員會草案"。
(21)ISO/IEC 14496-21,用于描繪(Rendering)的MPEG-J拓展(尚未完成,2005年1月達成"委員會草案"
正文:
首先來說3gp文件相當于一個容器,本身沒有什么具體的編碼解碼規(guī)則。
我們可以選擇編碼方式
- AMR narrow-band:編碼簡稱'samr' 常用與語言片段的壓縮,可以對聲音片段進行最大程度的壓縮,但是失真較大,如果用在音樂文件上結(jié)構(gòu)常常是無法忍受的。
(詳情請參考:3GPP TS 26.071: "Mandatory Speech CODEC speech processing functions; AMR Speech CODEC; General description".)
(詳情請參考:3GPP TS 26.171: "AMR Wideband Speech Codec; General Description".)
(詳情請參考:
3GPP TS 26.290: "Extended AMR Wideband codec; Transcoding functions".
3GPP TS 26.304: "ANSI-C code for the Floating-point; Extended AMR Wideband codec".
3GPP TS 26.273: "ANSI-C code for the Fixed-point; Extended AMR Wideband codec".
(詳情請參考:
3GPP TS 26.401: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; General description".
3GPP TS 26.410: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; Floating-point ANSI-C code".
3GPP TS 26.411: "General audio codec audio processing functions; Enhanced aacPlus general audio codec; Fixed-point ANSI-C code".
(詳情請參考:ISO/IEC 14496-2:2004: "Information technology – Coding of audio-visual objects – Part 2: Visual".)
(詳情請參考:ITU-T Recommendation H.263 (01/05): "Video coding for low bit rate communication".)
(詳情請參考:ITU-T Recommendation H.264 (03/05): "Advanced video coding for generic audiovisual services"
ISO/IEC 14496-10:2005: "Information technology – Coding of audio-visual objects – Part 10: Advanced Video Coding".)
(詳情請參考:3GPP TS 26.245: "Transparent end-to-end packet switched streaming service (PSS); Timed text format".)
3gp文件基于mpeg4由若干個box組成
一個3gp文件由若干個box組成常見的有:
文件類型包:(FileTypeBox,簡稱代碼'ftyp')
ftyp:文件類型包相當于文件頭,說明了文件所使用的協(xié)議版本,編碼格式等信息
+[4]-+[4]-+[4]-+[4]-+[4]-+
|size|ftyp|mjbr|mivs|cpbr|
+----+----+----+----+----+
mjbr:major_brand 版本分支
mivs:minor_version 版本號
cpbr:compatible_brands 兼容分支
媒體數(shù)據(jù)包:(Media Data Box,簡稱代碼'mdat')
"Media Data Box
Box類型: ‘mdat’
容器: 文件
是否必須: 否
數(shù)量: 任意個. "-luxh
mdat box 存放了音頻視頻和其他的數(shù)據(jù),一般的文件至少有2個mdatbox, 一個用于音頻,一個用于視頻, 通常還會有一些文本信息也放在mdatbox中,各種信息的順序不固定。 如果只是存放音樂一個mdat就夠用了。
你可能會問這么多box 都叫mdat我怎么知道音頻放哪里視頻放哪里呢?別著急這些相關信息都放在moovbox里面
影片包:(moov box:Movie Box:)是一個3gp文件中最復雜最重要的文件。
看到這里你可能會問"moovbox里面的方框都分別代表什么含義呀?媒體描述信息是怎么存放的?",別著急咱們來慢慢分析一下。
"Movie Box
Box類型: 'moov';
容器: 文件
是否必須: 是
數(shù)量: 一個,并且只能是一個.
媒體的原始數(shù)據(jù)被放置在這個box中,這個box位于文件的最高級別,一般來說這個box接近于文件的開始或者末尾,盡管這并不被要求。語法如下:
a ligned(8) class MovieBox extends Box(‘moov’) {} "-luxh
moovbox 有兩個必要的子box他們是影片頭包和軌跡包
影片頭包movie header,簡稱代碼'mvhd'
首先剖析一下影片頭包,順便以此為例理解一下包的結(jié)構(gòu)。
每一個包開頭的4個字節(jié)都是一個整數(shù)存放了本包的長度。
接下來的4個字節(jié)是個字符串存放了本包的類型。如'moov','mvhd'。
基本上包都是這模樣的:
+[4]-+[4]-+[size-8]-------------------+
|size|type|data |
+----+----+---------------------------+
很多box是這樣的我們可以稱之為全包(full box)
+[4]-+[4]-+-+---+[size-8]-------------------+
|size|type|v|flg|data |
+----+----+-+---+---------------------------+
簡記為
+[4]-+[4]-+[4]-+[size-8]-------------------+
|size|type|vsfl|data |
+----+----+----+---------------------------+
其中vsfl:版本號標志
+-+---+
|v|flg|
+-+---+
v :version
flg:flages
在影片頭包中接下來的是版本標志等信息。
MVHD 是媒體信息頭,存放媒體的全局性的信息。
+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[76]----...---------+[4]-+
|size|mvhd|vsfl|cttm|mdtm|tmsc|mxtl|reserved... |ntid|
+----+----+----+----+----+----+----+--------...---------+----+
size:box長度
type:文件類型標識內(nèi)容為"mvhd"
vsfl:版本號標志
cttm:creat time 文件創(chuàng)建時間
mdtm:modification time 文件修改時間
tmsc:timescale 時間縮放因數(shù)
mxtl:maxTrackLen duration of longest track 最長播放時間
reserved: 保留字段
ntid-next trak id 下一個頻道標識
軌跡包TRAK 也是一個容器,是單個媒體流頻道的信息的容器,它有兩個必要的子box:TKHD,MDIA。
TKHD 存放本trak的信息,有兩個版本
v=0
+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+
|size|tkhd|vsfl|cttm|mdtm|tkid|resv|duat|
+----+----+----+----+----+----+----+----+
+[12]--------+2-+2-+[36]----...-+[4]-+[4]-+
|reserved |ct|rs|reserved |twvo|thvo|
+------------+--+--+--------...-+----+----+
v=1
+[4]-+[4]-+[4]-+[8]-----+[8]-----+[4]-+[4]-+[8]-----+
|size|tkhd|vsfl|cttm |mdtm |tkid|resv|duat |
+----+----+----+--------+--------+----+----+--------+
+[12]--------+2-+2-+[36]----...-+[4]-+[4]-+
|reserved |ct|rs|reserved |twvo|thvo|
+------------+--+--+--------...-+----+----+
size:box長度
type:文件類型標識內(nèi)容為"tkhd"
vsfl:版本號標志
cttm:creat time 文件創(chuàng)建時間
mdtm:modification time 文件修改時間
tkid:track-id 同一個文件中這是一個不重復的序列
resv:reserved 保留字段
duat:duration 總的播放時間長度
reserved: 保留字段
ct:codec_type {audio=0x0100; video=0} 編碼類型,到底是音頻還是視頻等
rs:reserved 保留字段
reserved: 保留字段
如果這個track 是視頻編碼它將有如下字段,在你解碼的時候非常有用.
twvo:Track width , for visual only 視頻的寬度
thvo:Track height, for visual only 視頻的高度
MDIA是存放具體的媒體信息的容器。
有且僅有3個子box:{MDHD,HDLR,MINF}
MDHD媒體頭,也有兩個版本
v=0
+[4]-+[4]-+[4]-+[4]-+[4]-+[4]-+
|size|type|cttm|mdtm|tmsk|duat|
+----+----+----+----+----+----+
v=1
+[4]-+[4]-+[8]-----+[8]-----+[4]-+[8]-----+
|size|type|cttm |mdtm |tmsk|duat |
+----+----+--------+--------+----+--------+
其中
size:box長度
type:文件類型標識內(nèi)容為"mdhd"
pl:pad&language{bit(1) pad = 0;unsigned int(5)[3] language // ISO-639-2/T language code參見附錄}
*-*[15]-----------*
|p|language |
*-*---------------*
pd:unsigned int(16) pre_defined = 0;
HDLR 句柄,描述媒體類型
+[4]-+[4]-+[4]-+[12]--------+[size-24]--+
|size|pred|hdlt|reserved |name |
+----+----+----+------------+-----------+
size:box長度
type:文件類型標識內(nèi)容為"tkhd"
pred:pre_defined = 0;
hdlt:handler_type;
‘vide’ Video track 視頻
‘soun’ Audio track 音頻
‘hint’ Hint track 注釋
reserved: reserved = 0;
name: 名稱字符串,0結(jié)尾的UTF-8串
MINF 媒體信息容器(Media Information Box)
這是一個普通的box容器.它的內(nèi)部可能包含如下的子box:
VMHD,SMHD,HMHD,NMHD,DINF,STBL.
VMHD,SMHD,HMHD分別對應于視頻,音頻,注視,NMHD我還不太清楚.它們都屬于fullbox.
DINF數(shù)據(jù)信息和STBL采樣表,都是普通的box. VMHD還包括兩個數(shù)據(jù)字段.
+[4]-+[4]-+[4]-+[4]-+
|gmod|opcl |
+----+----+----+----+
gmod:graphicsmode 描述了本視頻track 與其他視頻track的混合方式.默認的值為0,也就是直接覆蓋.
opcl:opcolor 透明色顏色值 (red, green, blue)如果gmod不是copy的話會用到.
SMHD包括兩個字段
+--+--+
|bl|rs|
+--+--+
bl:balance 是一個定點小數(shù)(精度 8.8) 前8bits是整數(shù),后8bits是小數(shù).如果值為0說明左右聲道是相同的.全左的情況下值為-1.0 全右則為1.0.
rs:reserved 保留字段.
HMHD包括5個字段.如下:
+--+--+[4]-+[4]-+[4]-+
|mp|ap|mbrt|abrt|resv|
+--+--+----+----+----+
mp:maxPDUsize 最大PDU長度 -pdu是啥???????? 知道啥是pdu的朋友請告訴我.
ap:avgPDUsize 平均PDU長度
mbrt:maxbitrate 最大比特率
abrt:avgbitrate 平均比特率
resv:reserved 保留字段
NMHD是個空的fullbox
DINF是一個普通的box,也是一個容器,它包括url,urn,dref三個fullbox
url 內(nèi)部是一個UTF-8編碼的0結(jié)尾的字符串
string location;
url里面則是兩個
string name;
string location;
這兩個都被稱為DataEntryBox.
dref里面是一個url或者urn的列表.首先它有一個字段
unsigned int(32) entry_count;DataEntryBox的列表的個數(shù).
然后就是DataEntryBox的列表
STBL是一個普通的box,也是一個容器,里面包含了很多媒體采樣信息.
STTS是一個fullbox里面包含了采樣的時間長度信息
內(nèi)部的數(shù)據(jù)首先是列表長度
unsigned int(32) entry_count;
然后就是采用時長列表.
列表每一項都由兩個字段組成.
unsigned int(32) sample_count;采樣個數(shù)
unsigned int(32) sample_delta;每個采樣的時間長度.
在認識stsd之前我們首先要了解一個數(shù)據(jù)結(jié)構(gòu)SampleEntry和它的子類AudioSampleEntry,VisualSampleEntry和HintSampleEntry
附錄:
ISO-639-2/T language code
ISO 639-2 Code | ISO 639-1 Code | English name of Language |
---|---|---|
aar | aa | Afar |
abk | ab | Abkhazian |
ace | Achinese | |
ach | Acoli | |
ada | Adangme | |
ady | Adyghe; Adygei | |
afa | Afro-Asiatic (Other) | |
afh | Afrihili | |
afr | af | Afrikaans |
ain | Ainu | |
aka | ak | Akan |
akk | Akkadian | |
alb/sqi | sq | Albanian |
ale | Aleut | |
alg | Algonquian languages | |
alt | Southern Altai | |
amh | am | Amharic |
ang | English, Old (ca.450-1100) | |
anp | Angika | |
apa | Apache languages | |
ara | ar | Arabic |
arc | Aramaic | |
arg | an | Aragonese |
arm/hye | hy | Armenian |
arn | Araucanian | |
arp | Arapaho | |
art | Artificial (Other) | |
arw | Arawak | |
asm | as | Assamese |
ast | Asturian; Bable | |
ath | Athapascan languages | |
aus | Australian languages | |
ava | av | Avaric |
ave | ae | Avestan |
awa | Awadhi | |
aym | ay | Aymara |
aze | az | Azerbaijani |
bad | Banda | |
bai | Bamileke languages | |
bak | ba | Bashkir |
bal | Baluchi | |
bam | bm | Bambara |
ban | Balinese | |
baq/eus | eu | Basque |
bas | Basa | |
bat | Baltic (Other) | |
bej | Beja | |
bel | be | Belarusian |
bem | Bemba | |
ben | bn | Bengali |
ber | Berber (Other) | |
bho | Bhojpuri | |
bih | bh | |
bik | Bikol | |
bin | Bini | |
bis | bi | Bislama |
bla | Siksika | |
bnt | Bantu (Other) | |
tib/bod | bo | Tibetan |
bos | bs | Bosnian |
bra | Braj | |
bre | br | Breton |
btk | Batak (Indonesia) | |
bua | Buriat | |
bug | Buginese | |
bul | bg | Bulgarian |
bur/mya | my | Burmese |
byn | Blin; Bilin | |
cad | Caddo | |
cai | Central American Indian (Other) | |
car | Carib | |
cat | ca | Catalan; Valencian |
cau | Caucasian (Other) | |
ceb | Cebuano | |
cel | Celtic (Other) | |
cze/ces | cs | Czech |
cha | ch | Chamorro |
chb | Chibcha | |
che | ce | Chechen |
chg | Chagatai | |
chi/zho | zh | Chinese |
chk | Chuukese | |
chm | Mari | |
chn | Chinook jargon | |
cho | Choctaw | |
chp | Chipewyan | |
chr | Cherokee | |
chu | cu | Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic |
chv | cv | Chuvash |
chy | Cheyenne | |
cmc | Chamic languages | |
cop | Coptic | |
cor | kw | Cornish |
cos | co | Corsican |
cpe | Creoles and pidgins, English based (Other) | |
cpf | Creoles and pidgins, French-based (Other) | |
cpp | Creoles and pidgins, Portuguese-based (Other) | |
cre | cr | Cree |
crh | Crimean Tatar; Crimean Turkish | |
crp | Creoles and pidgins (Other) | |
csb | Kashubian | |
cus | Cushitic (Other) | |
wel/cym | cy | Welsh |
cze/ces | cs | Czech |
dak | Dakota | |
dan | da | Danish |
dar | Dargwa | |
day | Dayak | |
del | Delaware | |
den | Slave (Athapascan) | |
ger/deu | de | German |
dgr | Dogrib | |
din | Dinka | |
div | dv | Divehi; Dhivehi; Maldivian |
doi | Dogri | |
dra | Dravidian (Other) | |
dsb | Lower Sorbian | |
dua | Duala | |
dum | Dutch, Middle (ca.1050-1350) | |
dut/nld | nl | Dutch; Flemish |
dyu | Dyula | |
dzo | dz | Dzongkha |
efi | Efik | |
egy | Egyptian (Ancient) | |
eka | Ekajuk | |
gre/ell | el | Greek, Modern (1453-) |
elx | Elamite | |
eng | en | English |
enm | English, Middle (1100-1500) | |
epo | eo | Esperanto |
est | et | Estonian |
baq/eus | eu | Basque |
ewe |