音視頻的時長怎么獲取,音視頻的封面怎么獲取,音視頻的格式怎么獲取呢?這些資訊都以特定格式存盤在檔案開頭或者結尾,稱為多媒體資訊或者多媒體元資料,通用的封裝格式由:檔案標識頭+多媒體資訊+音視頻(字幕)軌+視頻幀索引塊組成,如果是純音頻,后面可能還有歌詞,音視頻的封裝格式就是通過決議檔案標識頭進行判斷的,然后決議多媒體資訊從而獲取時長,再決議視頻幀索引塊,最后根據索引塊去獲取對應時間戳的視頻幀,
音視頻封裝格式存盤的欄位包括:時長、碼率、音視頻編碼器、解析度(寬x高)、幀率、像素格式、旋轉角度、采樣率、聲道數等等,其中視頻專有的欄位是解析度、幀率、像素格式、旋轉角度,而音頻專有的欄位是采樣率、聲道數,具體的欄位決議可以參考:音視頻的基本概念,
常見的視頻格式有:mp4、mov、3gp、mkv、webm、flv、avi、mpg、wmv、ts等等,其中mp4、mov、3gp同屬一個協議簇,目前mp4最為流行,mp4全稱為MPEG-4,由國際標準化組織和國際電工委員會下屬的動態影像專家組(Moving Picture Experts Group)制定,具體協議可參考:ISO/IEC14496-14協議;mkv與webm公用封裝格式:matroska,對于高清視頻而言,mkv/webm最受歡迎;而avi是比較古老的格式,音視頻流交錯(Audio Video Interleave),可以封裝各種編碼格式的音視頻流;mpg屬于ps的一種封裝格式;wmv(Windows Media Video)是微軟推出的視頻編解碼格式統稱,采用ASF(Advance System Format)作為容器,基于Object物件進行封裝;而ts的全稱為MPEG2-TS,即為Transport Stream的縮寫,具體可參考ISO/IEC13818-1協議,作用于傳輸層,主要用于實時傳輸的節目,HLS直播協議就是基于ts切片來傳輸視頻流的,主要特點是從視頻流任一片段都可獨立解碼播放;ps與ts類似,全稱為MPEG-PS,即為Program Stream的縮寫,用于存盤固定時長的節目,
整個解封裝流程:從讀取檔案頭判斷視頻格式開始,然后選擇對應的Extractor,決議多媒體資訊,再決議視頻幀的索引塊,最后根據索引去定位并讀取音視頻資料,如下圖所示:

圖1—視頻解封裝流程圖
mp4作為目前最流行的視頻封裝格式,也是本篇文章的男一號主角,下面將圍繞mp4格式進行展開分析,mp4是由一系列的box組成(在quick time協議中,稱為atom),box又由Header和Data組成,box的結構如圖2所示:

圖2—box的宏觀結構
而Header由size、type、largeSize、extendType組成,其中size和type是必要欄位,如表1所示:
| size | type | largeSize | extendType |
| 4 bytes | 4 bytes | 8 bytes | 16 bytes |
表1—通用Header結構
full box的Header多兩個欄位:version、flag,一般是track box采用full box形式,如表2所示:
| size | type | largeSize | extendType | version | flag |
| 4 bytes | 4 bytes | 8 bytes | 16 bytes | 1 byte | 3 bytes |
表2—full box的Header結構
box分為normal box、full box、large box、extend box,如果size為1,那么表明該box為large box,使用largeSize來存盤box的大小;如果size為0,那么表明該box是檔案的最后一個box;如果box的型別為uuid,那么表明該box是擴展box,如下面代碼段所示:
aligned(8) class Box (unsigned int(32) boxtype,
optional unsigned int(8)[16] extended_type) {
unsigned int(32) size;
unsigned int(32) type = boxtype;
if (size==1) {
unsigned int(64) largesize;
} else if (size==0) {
// box extends to end of file
}
if (boxtype==‘uuid’) {
unsigned int(8)[16] usertype = extended_type;
}
}
moov box作為mp4格式的重要組成部分,根據moov box與mdat box的相對位置,分為moov前置和moov后置,如下面圖3、圖4所示:

圖3—mp4結構圖(moov前置)

圖4—mp4結構圖(moov后置)
通常情況下,mp4的moov都是在mdat前面的;一般只有實時錄制的mp4視頻,moov才在mdat的后面,除了moov box,還有ftyp box、moof box、mdat box、free box、meta 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 |
表3—mp4的各種box描述
ftyp box:mp4視頻標識頭,包含major brand、minor version、compatible brands,其中major brand一般為isom,而compatible brands包括isom、iso2、avc、mp41、mp42等,
moov box:存盤多媒體資訊,嵌套著movie box(mvhd)、track box(trak box)、usedata box(udat);而track box分為視頻軌、音頻軌、字幕軌,如果有多語言,就會對應有多音軌;trak/mdia/minf/stbl/stsd存盤的是音視頻編碼器資訊,比如視頻軌的是avc,音頻軌是mp4a;trak/mdia/minf/stbl/stsz存盤的是視頻幀size;trak/mdia/minf/stbl/stco存盤的是chunk offset,
mdat box:音視頻資料,根據moov及其嵌套box決議出來的視頻幀索引,去定位關鍵幀,然后根據幀型別讀取音視頻資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/2805.html
標籤:其他
