? ? 最近在開(kāi)發(fā)中遇到了一個(gè)問(wèn)題,即無(wú)法提取到MP4中H264流的關(guān)鍵幀進(jìn)行處理,且保存到本地的AAC音頻也無(wú)法正常播放。經(jīng)過(guò)調(diào)試分析發(fā)現(xiàn),這是由于解封裝MP4得到的H264和AAC是ES流,它們?nèi)笔Ы獯a時(shí)必要的
起始碼
/SPS
/PPS
和adts頭
。
1. MP4格式解析
1.1 MP4簡(jiǎn)介
?MP4封裝格式是基于QuickTime容器
格式定義,媒體描述與媒體數(shù)據(jù)分開(kāi),目前被廣泛應(yīng)用于封裝h.264
視頻和aac
音頻,是高清視頻/HDV的代表。MP4文件中所有數(shù)據(jù)都封裝在Box中(d對(duì)應(yīng)QuickTime中的atom),即MP4文件是由若干個(gè)Box組成,每個(gè)Box有長(zhǎng)度和類(lèi)型
,每個(gè)Box中還可以包含另外的子Box,因此,這種包含子Box的也可被稱(chēng)為container Box
。Box的基本結(jié)構(gòu)如下圖所示:
?從上圖可知,Box的基本結(jié)構(gòu)由兩部分組成:BoxHeader
和BoxData
。BoxHeader由size
、type
和largesize
(由size的值確定是否存在)組成,它們分別占4bytes、4bytes、8bytes,其中,size
表示的是整個(gè)Box的大小(BoxHeader+BoxData),假如Box的大小超過(guò)了uint32的最大值,size會(huì)被置為1,這時(shí)將由largesize來(lái)表示Box的大小。type
表示Box的類(lèi)型,主要有ftyp、moov、mdat等。largesize
表示當(dāng)size=1時(shí),用它代替size來(lái)存儲(chǔ)Box的大小;BoxData存儲(chǔ)的是真實(shí)數(shù)據(jù)(不一定是音視頻數(shù)據(jù)),大小由真實(shí)數(shù)據(jù)決定。
【騰訊文檔】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音視頻流媒體高級(jí)開(kāi)發(fā)-資料領(lǐng)取
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNxhttps://docs.qq.com/doc/DYU5ORlBOdkpCUkNx
?
1.2 MP4結(jié)構(gòu)分析
?Box是構(gòu)成MP4文件的基本單元,一個(gè)MP4文件由若干個(gè)Box組成,且每個(gè)Box中還可以包括另外的子Box。MP4格式結(jié)構(gòu)中包括三個(gè)最頂層的Box,即ftyp
、moov
、mdat
,其中,ftyp是整個(gè)MP4文件的第一個(gè)Box,也是唯一的一個(gè),它主要用于確定當(dāng)前文件的類(lèi)型(比如MP4);moov保存了視頻的基本信息,比如時(shí)間信息、trak信息以及媒體索引等;mdat保存視頻和音頻數(shù)據(jù)。需要注意的是,moov Box和mdat Box在文件中出現(xiàn)的順序不是固定的,但是ftyp Box必須是第一個(gè)出現(xiàn)。
?當(dāng)然,我們也可以使用MP4Info軟件打開(kāi)一個(gè)MP4文件來(lái)觀察MP4的結(jié)構(gòu)。從下圖可以看到,該軟件不僅能夠看到MP4文件的Box結(jié)構(gòu),還列出了音頻數(shù)據(jù)的格式(mp4a
)、采樣率、通道數(shù)量、比特率和視頻的格式(AVC1
)、寬高、比特率、幀率等信息。需要注意的是,由于錄制設(shè)備的不同,生成的MP4文件可能會(huì)包含類(lèi)型為free的Box,這類(lèi)Box通常出現(xiàn)在moov于mdata之間,它的數(shù)據(jù)通常為全0,其作用相當(dāng)于占位符,在實(shí)時(shí)拍攝視頻時(shí)隨著moov類(lèi)型數(shù)據(jù)的增多會(huì)分配給moov使用,如果沒(méi)有free預(yù)留的空間,則需要不停的向后移動(dòng)mdat數(shù)據(jù)以騰出更更多的空間給moov。
- ftype box
?ftyp就是一個(gè)由四個(gè)字符組成的碼字,用來(lái)標(biāo)識(shí)編碼類(lèi)型、兼容性或者媒體文件的用途,它存在于MP4文件和MOV文件中,當(dāng)然也存在于3GP文件中。因此,在MP4文件中,ftyp類(lèi)型Box被放在文件的最開(kāi)始,用于標(biāo)志文件類(lèi)型為MP4,這類(lèi)Box在文件中有且只有一個(gè)。我們利用WinHex工具打開(kāi)一個(gè)MP4文件,就可以看到ftyp Box的具體細(xì)節(jié),如下圖所示:
?根據(jù)Box的基本結(jié)構(gòu)可知,Box由BoxHeader和BoxData構(gòu)成,其中,BoxHeader又由size、type以及l(fā)argesize(可選)組成。由上圖可以知道,ftyp Box頭部信息為0x00 00 00 18 66 74 79 70,其中,0x00 00 00 18
這四個(gè)字節(jié)表示ftyp Box整個(gè)Box的大小size=24字節(jié);0x66 74 79 70
表示該Box為ftyp類(lèi)型,它們組成了ftyp的頭部。0x6D 70 34 32
(十六進(jìn)制)表示major brand,這里為"mp42"且不同的文件該值可能不一樣;0x00 00 00 00
表示minor version。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-414892.html
- moov box
?moov類(lèi)型box主要用于存儲(chǔ)媒體的時(shí)間信息、trak信息和媒體索引等信息。從MP4Info軟件打開(kāi)的文件可知,moov Box是緊接著ftyp Box的,因此,該Box頭部為0x00 00 28 D1 6D 6F 6F 76,其中,0x00 00 28 D1
表示整個(gè)moov Box的大小size=10449字節(jié),0x6D 6F 6F 76
表示當(dāng)前Box為moov類(lèi)型,而剩下的字節(jié)數(shù)據(jù)即為BoxData。另外,moov Box還包含了mvhd
、文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-414892.html
到了這里,關(guān)于FFmpeg從入門(mén)到入魔(3):提取MP4中的H.264和AAC的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!