Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> FFmpeg使用手冊 - MP4的格式解析

FFmpeg使用手冊 - MP4的格式解析

編輯:關於android開發

FFmpeg使用手冊 - MP4的格式解析


視頻文件轉MP4
在互聯網中常見的格式中,跨平台最好的,應該是MP4文件,因為MP4文件既可以在PC平台的Flashplayer中播放,又可以在移動平台的Android,IOS等平台中進行播放,而且是默認播放,那麼就可以理解為MP4為最常見的多媒體文件格式,所以重點介紹MP4封裝,說到MP4封裝,下面簡單介紹一下MP4封裝的基本格式.
3.1.1 MP4格式標准介紹
MP4格式標准為ISO-14496 Part 12、ISO-14496 Part 14,標准內容並不是特別的多,下面著重介紹一些重要的信息。
如果要了解MP4的格式的信息,首先要清楚幾個概念:
1.MP4文件由許多個Box與FullBox組成;
2.每個Box由Header和Data兩部分組成
3.FullBox則是Box的擴展,Box結構的基礎上在Header中增加8bit位 version標志和24bit位的flags標志
4.Header包含了整個Box的長度的大小(Size)和類型(Type),當size等於0時,代表這個Box是文件的最後一個Box;當size等於0時說明Box長度需要更多的bits位來描述,在後面會定義一個64bits位的largesize用來描述Box的長度;當Type為uuid時,說明這個Box中的數據是用戶自定義擴展類型;
5.Data為Box的實際數據,可以是純數據也可以是更多的子Box;
6.當一個Box中Data是一系列的子Box時,這個Box又可以稱作為Container Box。

而MP4文件中的Box的組成,大概可以用下面的列表進行排列,下面列表中標記√ 的Box為必要Box,否則為可選Box。

ftyp

file type and compatibility

pdin

progressive download information

moov

container for all the metadata

mvhd

movie header, overall declarations

trak

container for an individual track or stream

tkhd

track header, overall information about the track

tref

track reference container

edts

edit list container

elst

an edit list

mdia

container for the media information in a track

mdhd

media header, overall information about the media

hdlr

handler, declares the media (handler) type

minf

media information container

vmhd

video media header, overall information (video track only)

smhd

sound media header, overall information (sound track only)

hmhd

hint media header, overall information (hint track only)

nmhd

Null media header, overall information (some tracks only)

dinf

data information box, container

dref

data reference box, declares source(s) of media data in track

stbl

sample table box, container for the time/space map

stsd

sample descriptions (codec types, initialization etc.)

stts

(decoding) time-to-sample

ctts

(composition) time to sample

stsc

sample-to-chunk, partial data-offset

information

stsz

sample sizes (framing)

stz2

compact sample sizes (framing)

stco

chunk offset, partial data-offset information

co64

64-bit chunk offset

stss

sync sample table (random access points)

stsh

shadow sync sample table

padb

sample padding bits

stdp

sample degradation priority

sdtp

independent and disposable samples

sbgp

sample-to-group

sgpd

sample group description

subs

sub-sample information

mvex

movie extends box

mehd

movie extends header box

trex

track extends defaults

ipmc

IPMP Control Box

moof

movie fragment

mfhd

movie fragment header

traf

track fragment

tfhd

track fragment header

trun

track fragment run

sdtp

independent and disposable samples

sbgp

sample-to-group

subs

sub-sample information

mfra

movie fragment random access

tfra

track fragment random access

mfro

movie fragment random access offset

mdat

media data container

free

free space

skip

free space

udta

user-data

cprt

copyright etc.

meta

metadata

hdlr

handler, declares the metadata (handler) type

dinf

data information box, container

dref

data reference box, declares source(s) of metadata items

ipmc

IPMP Control Box

iloc

item location

ipro

item protection

sinf

protection scheme information box

frma

original format box

imif

IPMP Information box

schm

scheme type box

schi

scheme information box

iinf

item information

xml

XML container

bxml

binary XML container

pitm

primary item reference

fiin

file delivery item information

paen

partition entry

fpar

file partition

fecr

FEC reservoir

segr

file delivery session group

gitn

group id to name

tsel

track selection

meco

additional metadata container

mere

metabox relation


在MP4文件中顯示的排版方式與上面表格描述基本無差別,當然,因為MP4的標准中描述的moov與mdat的存放位置前後並沒有進行強制要求,所以有些時候moov這個Container在mdat的後面,有些時候moov被存放在mdat的前面,在互聯網的視頻點播中,如果希望MP4文件被快速的打開時,則需要moov Container存放在mdat的前面,如果放在後面,需要將MP4文件下載完成後才可以進行播放。
解析mp4多媒體文件時,需要一些關鍵的信息,下面介紹一下主要的信息;
1.moov 容器,前面表格中已經介紹過,這個容器是定義了一個mp4文件中的數據信息,類型是moov,是一個容器atom,至少必須包含三種atom中的一種
a)mvhd標簽,Movie Header Atom,存放未壓縮過的影片信息的頭容器;
b)cmov標簽,Compressed Movie Atom,壓縮過的電影信息容器;
c)rmra標簽,Reference Movie Atom,參考電影信息容器。
也可以包含其他的容器信息,例如影片剪輯信息Clipping atom(clip),一個或幾個Trak Atom(trak),一個Color Table Atom(ctab),和一個User Data Atom(udta)。
a)mvhd中定義了整部電影的time scale,duration,以及display characteristics.
b)trak 中定義了電影中的一個track的信息,track就是電影中可以獨立操作的媒體單位,例如一個聲道就是一個track,一個視頻流就是一個track。

下面來打開一個mp4文件查看其內容,通過舉例來了解這裡所講到的mp4文件容器信息:

關於讀取這個moov容器的方式,可以參考下面這個列表

字段

長度(字節)

描述

尺寸

4

這個movie header atom的字節數

類型

4

moov

根據解析這個moov的容器的字節長度,可以看到該容器共包含0x00000ca3(3235)個字節,容器的類型為moov;下面繼續在moov這個容器中往下解析,下一個容器為的大小為0x0000006c(108)個字節,類型為mvhd;然後繼續從moov容器中往下解析;

分析完mvhd之後,下一個moov中的容器可以從上圖中看到是一個trak標簽,這個trak容器的大小是0x00000517(1303)個字節,類型是trak。解析完這個trak之後,有進入到moov容器中解析下一個trak,下一個trak解析的方式與這個trak的解析方式相同,可以看到下圖trak的大小為0x0000069c(1692)個字節;

解析完這個音頻的trak之後,接下來可以看到還有一個moov容器中的子容器,就是udta容器,這個udta容器解析方式與前面解析trak的方式基本相同,可以從下圖看到,udta的大小為0x0000007c(124)個字節,

可以根據前面描述過的信息得知,udta+視頻trak+音頻trak+mvhd+moov描述大小之後的出來的總大小,剛好為3235個字節,與前面得出來的moov的大小相等。
前面描述了針對moov容器下面的子容器的解析,接下來繼續解析moov子容器中的子容器。
1. 解析mvhd子容器:

從圖中可以看到,mvhd這個容器的大小為0x0000006c個字節,mvhd的解析方式如下表:

字段

長度(字節)

描述

尺寸

4

這個movie header atom的字節數

類型

4

mvhd

版本

1

這個movie header atom的版本

標志

3

擴展的movie header標志,這裡為0

生成時間

4

Movie atom的起始時間。基准時間是1904-1-1 0:00 AM

修訂時間

4

Movie atom的修訂時間。基准時間是1904-1-1 0:00 AM

Time scale

4

時間計算單位,就像是系統時間單位換位為60秒一樣

Duration

4

通過這個值計算後可以得到影片的播放長度時間值

播放速度

4

播放此movie的速度。1.0為正常播放速度(16.16的浮點表示)

播放音量

2

播放此movie的音量。1.0為最大音量(8.8的浮點表示)

保留

10

這裡為0

矩陣結構

36

該矩陣定義了此movie中兩個坐標空間的映射關系

預覽時間

4

開始預覽此movie的時間

預覽duration

4

以movie的time scale為單位,預覽的duration

Poster time

4

Poster的時間值.

Selection time

4

當前選擇的時間的開始時間值

Selection duration

4

當前選擇的時間的計算後的時間值

當前時間

4

當前時間

下一個track ID

4

下一個待添加track的ID值。0不是一個有效的ID值。


按照上表的方式解析出來的mvhd的內容對應的信息如下:

字段

結論值

尺寸

0x0000006c

類型

mvhd

版本

0x00

標志

0x000000

生成時間

0x00000000

修訂時間

0x00000000

Time scale

0x000003E8 (1000)

Duration

0x00000770 (1904)

播放速度

0x00010000(1.0)

播放音量

0x0100(1.0)

保留

0x00 00 00 00 00 00 00 00 00 00

矩陣結構

0x00010000,0,0,0,0x00010000,0,0,0,0x40000000

預覽時間

0x00000000

預覽duration

0x00000000

Poster time

0x00000000

Selection time

0x00000000

Selection duration

0x00000000

當前時間

0x00000000

下一個track ID

0x00000003


解析mvhd之後,可以看到下一個trakID為0x00000003,接下來就開始解析trak,解析trak的時候同樣也包含了多個子容器;


2.解析Track子容器
track 容器中定義了影片中的一個track的信息,一個影片文件中可以包含多個tracks,每個track都是獨立的,各有各的時間和空間占用的信息,每個track容器都有與他關聯的media容器描述信息。Track容器的主要使用目的如下:
a)包含媒體數據的引用和描述(media track)
b)包含modifier trackers信息
c)流媒體協議的打包信息(hint tracks),hint tracks可以引用或者復制對應的媒體采樣數據。
Hint tracks和modifier tracks必須保證完整性,同時和至少一個media track一起存在。
一個trak容器中要求必須有一個Track Header Atom(tkhd),一個Media Atom(mdia),其他的atom都是可選的,例如
a)Track Clipping Atom(clip);
b)Track Matte Atom(matt);
c)Edit Atom(edts);
d)Track Reference Atom(tref);
e)Track Load Settings Atom(load);
f)Track Input Map Atom(imap);
g)User Data Atom(udta)


解析的方式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的大小

類型

4

tkhd/mdia/clip/matt等


如下圖:

從上圖可以看到,這個track的大小為0x00000517(1303)字節,下面的子容器的大小為0x0000005c(92)字節,這個子容器的類型為tkhd;跳過92字節後,接下來讀到的trak的子容器的大小為0x00000024(36)字節,這個子容器的類型為edts;跳過36字節後,接下來讀到的trak子容器的大小為0x0000048f(1167)個字節,這個子容器的類型為mdia;可以分析得到trak+tkhd+edts+mdia子容器的大小加起來剛好為1303字節,trak的讀取完畢。


3.tkhd容器的解析
解析tkhd容器的方式可以參考下面表格:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

tkhd

版本

1

這個atom的版本

標志

3

有效的標志是

·0x0001 - the track is enabled

·0x0002 - the track is used in the movie

·0x0004 - the track is used in the movie’s preview

·0x0008 - the track is used in the movie’s poster

生成時間

4

Movie atom的起始時間。基准時間是1904-1-1 0:00 AM

修訂時間

4

Movie atom的修訂時間。基准時間是1904-1-1 0:00 AM

Track ID

4

唯一標志該track的一個非零值。

保留

4

這裡為0

Duration

4

The duration of this track (in the movie’s time coordinate system).Note that this property is derived from the track’s edits. The value of this field is equal to the sum of the durations of all of the track’s edits. If there is no edit list, then the duration is the sum of the sample durations, converted into the movie timescale.

保留

8

這裡為0

Layer

2

The track’s spatial priority in its movie. The QuickTime Movie Toolbox uses this value to determine how tracks overlay one another. Tracks with lower layer values are displayed in front of tracks with higher layer values.

Alternate group

2

A collection of movie tracks that contain alternate data for one another. QuickTime chooses one track from the group to be used when the movie is played. The choice may be based on such considerations as playback quality, language, or the capabilities of the computer.

音量

2

播放此track的音量。1.0為正常音量

保留

2

這裡為0

矩陣結構

36

該矩陣定義了此track中兩個坐標空間的映射關系

寬度

4

如果該track是video track,此值為圖像的寬度(16.16浮點表示)

高度

4

如果該track是video track,此值為圖像的高度(16.16浮點表示)

下面看看一下tkhd的內容,然後根據上面的表格做一個信息的對應

這個tkhd對應的值如下表:

字段

長度(字節)

尺寸

4

0x0000005c(92)

類型

4

tkhd

版本

1

00

標志

3

0x000003(這個track生效並且用在這個影片中)

生成時間

4

0x00000000

修訂時間

4

0x00000000

Track ID

4

0x00000001

保留

4

0x00000000

Duration

4

0x00000758

保留

8

0x00 00 00 00 00 00 00 00

Layer

2

0x0000

Alternate group

2

0x0000

音量

2

0x0000

保留

2

0x0000

矩陣結構

36

00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

40 00 00 00

寬度

4

0x02800000 (640.00)

高度

4

0x01e00000 (480.00)


以上表格為解析視頻trak容器的tkhd,下面在分析一個音頻的tkhd:

解析trak的方法前面已經講過,這裡現在重點解析音頻的tkhd,並已表格形式將數據表示出來:

字段

長度(字節)

尺寸

4

0x0000005c(92)

類型

4

tkhd

版本

1

00

標志

3

0x000003(這個track生效並且用在這個影片中)

生成時間

4

0x00000000

修訂時間

4

0x00000000

Track ID

4

0x00000002

保留

4

0x00000000

Duration

4

0x00000770

保留

8

0x00 00 00 00 00 00 00 00

Layer

2

0x0000

Alternate group

2

0x0001

音量

2

0x0100

保留

2

0x0000

矩陣結構

36

00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

40 00 00 00

寬度

4

0x00000000 (00.00)

高度

4

0x00000000 (00.00)


從兩個例子中可以看出,音頻與視頻的trak的tkhd的大小相同,裡面的內容會隨著音視頻trak的類型不同有所不同。到這裡trak的tkhd解析完畢。


4.mdia容器的解析
解析完tkhd之後,接下來可以分析一下trak容器的子容器。
Media Atom的類型是mdia,是一個容器atom必須包含如下容器:
a)一個Media Header Atom(mdhd)
b)一個Handler Reference(hdlr)
c)一個媒體信息引用(minf)和User Data Atom(udta)
這個容器解析方式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的大小

類型

4

mdia

下面參考一下mp4文件的數據:

可以看到這個mdia容器的大小為0x0000048f(1167)個字節,mdia容器下面包含了三大子容器,分別為mdhd,hdlr和minf,其中mdhd大小為0x00000020(32)個字節;hdlr大小為0x0000002d(45)個字節;minf大小為0x0000043a(1082)個字節;mdia容器信息+mdhd+hdlr+minf容器大小剛好為1167字節;到這裡mdia容器解析完畢。
4.1 mdhd容器的解析
mdhd容器中被包含在各個Track中,描述Media的Header,包含的信息如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

mdhd

版本

1

這個atom的版本

標志

3

這裡為0

生成時間

4

Movie atom的起始時間。基准時間是1904-1-1 0:00 AM

修訂時間

4

Movie atom的修訂時間。基准時間是1904-1-1 0:00 AM

Time scale

4

時間計算單位

Duration

4

這個媒體Track的duration時長

語言

2

媒體的語言碼

質量

2

媒體的回放質量

根據ISO14496-Part2描述可以看到,當版本字段為0時,解析與當版本字段為1時解析稍微有所不同,這裡介紹的為常見的解析方式。
下面根據表格的解析方式將對應的數據解析出來:

從圖中可以逐一解析出來:

字段

長度(字節)

尺寸

4

0x00000020(32)

類型

4

mdhd

版本

1

0x00

標志

3

0x000000

生成時間

4

0x00000000

修訂時間

4

0x00000000

Time scale

4

0x00003200(12800)

Duration

4

0x00005e00(24064)

語言

2

0x55c4

質量

2

0x0000


從上表可以看出這個Media Header的大小是32字節,類型是mdhd,版本為0,生成時間與媒體修改時間都為0,計算單位時間是12800,媒體時間戳長度為24064,語言編碼是0x55C4(具體代表的語言可以參考標准ISO 639-2/T),到這裡mdhd標簽解析完畢。


4.2 hdlr 容器的解析
hdlr容器中描述了媒體流的播放過程,該容器中包含的內容如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

hdlr

版本

1

這個atom的版本

標志

3

這裡為0

Handle的類型

4

handler的類型。當前只有兩種類型

'mhlr':media handlers

'dhlr':data handlers

Handle的子類型

4

media handler or data handler的類型。如果component type是mhlr,這個字段定義了數據的類型,例如,'vide'是video數據,'soun'是sound數據

如果component type是dhlr,這個字段定義了數據引用的類型,例如,'alis'是文件的別名

保留

12

保留字段,缺省為0

Component name

可變

這個component的名字,也就是生成此media的media handler。該字段的長度可以為0

根據這個表格的讀取方式,讀取示例文件中的內容數據,數據如下圖:

根據圖中的信息,可以將內容讀取出來,對應的值如下:

字段

長度(字節)

尺寸

4

0x0000002d(45)

類型

4

hdlr

版本

1

0x00

標志

3

0x00

Handle的預定義字段

4

0x00000000

Handle的子類型

4

Vide

保留

12

0x0000 0000 0000 0000 0000 0000

Component name

可變

VideoHandler’\0’

從上表中解析出來的對應的值可以看出來,這是一個視頻的Track對應的數據,對應的組件的名稱為VideoHandler和一個0x00結尾,hdlr容器解析完畢。

4.3 minf 容器的解析
minf容器中包含了很多重要的子容器,例如音視頻相關的采樣等信息相關的容器,minf容器中的信息將作為音視頻數據的映射存在,其內容信息如下:
a)(Video Media Information Header)vmhd 子容器
b)(Sound Media Information Header)smhd 子容器
c)(Data Information)dinf 子容器
d)(Sample Table)stbl 子容器
解析minf的方式在前面已經介紹過,下面詳細介紹一下解析vmhd、smhd、dinf以及stbl容器:
(1)vmhd容器解析
vmhd容器內容的格式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

vmhd

版本

1

這個atom的版本

標志

3

這裡總是0x000001

圖形模式

2

傳輸模式,傳輸模式指定的布爾值

Opcolor

6

顏色值,RGB顏色值

根據這個表格讀取容器中的內容,進行解析,其數據如下圖:

將數據解析出來,對應值如下表:

字段

長度(字節)

尺寸

4

0x00000014

類型

4

vmhd

版本

1

0x00

標志

3

0x000001

圖形模式

2

0x0000

Opcolor

6

0x0000 0000 0000


上面這個表格為視頻的Header的解析,下面看一下音頻的Header解析
(2)smhd容器解析
smhd容器的格式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

smhd

版本

1

這個atom的版本

標志

3

這裡為0

均衡

2

音頻的均衡是用來控制計算機的兩個揚聲器的聲音混合效果,一般是0。一般值是0。

保留

2

保留字段,缺省為0


根據這個表格解析文件中的音頻對應的數據,數據如下圖:

將數據解析出來後,對應的值如下表:

字段

長度(字節)

尺寸

4

0x00000010

類型

4

smhd

版本

1

0x00

標志

3

0x000000

均衡

2

0x0000

保留

2

0x0000



(3)dinf容器解析
dinf容器是一個用以描述數據信息的容器,定義了音視頻數據的信息,這是一個容器,它包含子容器dref。下面舉一個解析dinf及其子容器dref的例子,dref解析方式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

dref

版本

1

這個atom的版本

標志

3

這裡為0

條目數目

4

data references的數目

數據參考

每個data reference就像容器的格式一樣,包含以下的數據成員

尺寸

4

這個atom的字節數

類型

4

見下表

版本

1

這個data reference的版本

標志

3

目前只有一個標志:

Self reference

This flag indicates that the media’s data is in the same file as the movie atom. On the Macintosh, and other file systems with multifork files, set this flag to 1 even if the data resides in a different fork from the movie atom. This flag’s value is 0x0001.

數據

可變

data reference信息



(4)stbl容器解析
stbl容器為采樣參數列表的容器(Sample Table atom),該容器包含轉化媒體時間到實際的sample的信息,也說明了解釋sample的信息,例如,視頻數據是否需要解壓縮,解壓縮算法是什麼等信息。他包含子容器:
a)Sample Description Atom(stsd)
b)Time-To-Sample Atom(stts)
c)Sync Sample Atom(stss)
d)Sample-To-Chunk Atom(stsc)
e)Sample Size Atom(stsz)
f)Chunk Offset Atom(stco)
g)Shadow Sync Atom(stsh)
stbl包含track中media sample的所有時間和數據索引,利用這個表,就可以定位sample到媒體時間,決定其類型,大小,以及如何在其他容器中找到緊鄰的sample。如果sample table atom所在的track沒有引用任何數據,那麼它就不是一個有用的media track,不需要包含任何子atom。
如果sample table atom所在的track引用了數據,那麼必須包含以下的子atom:
a)Sample Description Atom(stsd)
b)Sample Size Atom(stsz)
c)Sample Size Atom(stsz)
d)Sample Size Atom(stsz)

所有的字表有相同的sample數目。
stbl是必不可少的一個atom,而且必須包含至少一個條目,因為它包含了數據引用atom檢索media sample的目錄信息。沒有sample description,就不可能計算出media sample存儲的位置。sync sample atom 是可選的,如果沒有,表明所有的samples都是sync samples。

5.edts容器的解析
edts容器定義了創建Movie影片中的一個track的一部分媒體,所有的edit都在一個表裡,包括每一部分的時間偏移量和長度,如果沒有該表,這個track就會被立即播放,一個空的edit用來便宜track的其實時間,如果沒有edit atom或者edit list atom,則這個track會使用前部媒體。Edit atom這個容器很簡單,解析方式如下表:

字段

長度(字節)

描述

尺寸

4

這個atom的字節數

類型

4

edts


Trak中的edts數據如下圖:

這個Edit Atom的大小為0x00000024(36)個字節,類型為edta;其中包含了elst子容器,elst子容器的大小為0x0000001c(28)字節,edts容器+elst子容器的大小為36字節,到這裡,edts容器解析完畢。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved