1 FFmpeg轉(zhuǎn)換與封裝
1.1 MP4格式轉(zhuǎn)換
1.1.1 MP4格式標(biāo)準(zhǔn)
1 FFmpeg轉(zhuǎn)換與封裝
????????FFmpeg支持的媒體封裝格式具有多樣性與全面性,與此,我們還可以使用FFmpeg來(lái)對(duì)媒體格式進(jìn)行轉(zhuǎn)換與封裝。
1.1 MP4格式轉(zhuǎn)換
在互聯(lián)網(wǎng)常見(jiàn)的格式中,跨平臺(tái)最好的應(yīng)該是 MP4 文件,因?yàn)?MP4 文件既可以在PC 平臺(tái)的Flashplayer中播放,又可以在移動(dòng)平臺(tái)的 Android 、 iOS 等平臺(tái)中進(jìn)行播放,而且使用系統(tǒng)默認(rèn)的播放器即可播放,因此我們說(shuō) MP4 格式是最常見(jiàn)的多媒體文件格式 。
1.1.1 MP4格式標(biāo)準(zhǔn)
????????MP4 格式標(biāo)準(zhǔn)為IS0-14496 Part 12 、ISO-14496 Part 14 ,標(biāo)準(zhǔn)內(nèi)容并不是特別多。
????????要了解 MP4 的格式信息,要清楚幾個(gè)概念,具體如下:
????????? MP4 文件由許多個(gè) Box 與 FullBox 組成
??????????每個(gè)Box 由 Header 和 Data 兩部分組成
????????? FullBox 是 Box 的擴(kuò)展,其在 Box 結(jié)構(gòu)的基礎(chǔ)上,在 Header 中增加 8 位 version 標(biāo)志和 24 位的 flags 標(biāo)志
????????? Header 包含了整個(gè) Box 的長(zhǎng)度的大小( size )和類(lèi)型( type ),當(dāng) size 等于 0 時(shí),代表這個(gè) Box 是文件的最后一個(gè) Box 。 當(dāng) size 等于 1 時(shí),說(shuō)明 Box 長(zhǎng)度需要更多的位來(lái)描述,在后面會(huì)定義一個(gè) 64 位的 large size 用來(lái)描述 Box 的長(zhǎng)度 。當(dāng) Type 為uuid 時(shí),說(shuō)明這個(gè) Box 中的數(shù)據(jù)是用戶自定義擴(kuò)展類(lèi)型
????????? Data 為 Box 的實(shí)際數(shù)據(jù),可以是純數(shù)據(jù),也可以是更多的子 Box
????????? 當(dāng) 一個(gè) Box 中 Data 是一系列的子 Box 時(shí),這個(gè) Box 又可以稱(chēng)為 Container(容器)Box MP4 文件中 Box 的組成可以用表 3-1 所示的列表進(jìn)行排列,下表中標(biāo)記“√”的Box為必要Box,否則為可選Box。
MP4常用參考標(biāo)準(zhǔn)排列方式
容器名 | 必選 | 描述 | |||||
一級(jí) | 二級(jí) | 三級(jí) | 四級(jí) | 五級(jí) | 六級(jí) | - | - |
ftyp | √ | 文件類(lèi)型 | |||||
pdin | 下載進(jìn)度信息 | ||||||
moov | √ | 音視頻數(shù)據(jù)的metadata信息 | |||||
mvhd | √ | 電影文件頭 | |||||
trak | √ | 流的track | |||||
tkhd | √ | 流信息的track頭 | |||||
tref | track參考容器 | ||||||
edts | edit list 容器 | ||||||
elst | edit list元素信息 | ||||||
mdia | √ | track里面的media 信息 | |||||
mdhd | √ | media 信息頭 | |||||
hdlr | √ | media 信息的句柄 | |||||
minf | √ | media 信息容器 | |||||
vmhd | 視頻media頭(只存在于視頻的track) | ||||||
smhd | 音頻media頭(只存在于音頻的track) | ||||||
hmhd | 提示meida頭(只存在于提示的track) | ||||||
nmhd | 空media頭(其他的track) | ||||||
dinf | √ | 數(shù)據(jù)信息容器 | |||||
dref | √ | 數(shù)據(jù)參考容器,track中media的參考信息 | |||||
stbl | √ | 采樣表容器,容器做時(shí)間與數(shù)據(jù)所在位置的描述 | |||||
stsd | √ | 采樣描述(codec類(lèi)型與初始化信息) | |||||
stts | √ | (decoding)采樣時(shí)間 | |||||
ctts | (composition)采樣時(shí)間 | ||||||
stsc | √ | chunk采樣,數(shù)據(jù)片段信息 | |||||
stsz | 采樣大小 | ||||||
stz2 | 采樣大小詳細(xì)描述 | ||||||
stco | √ | Chunk 偏移信息,數(shù)據(jù)偏移信息 | |||||
co64 | 64位Chunk 偏移信息 | ||||||
stss | 同步采樣表 | ||||||
stsh | 采樣同步表 | ||||||
padb | 采樣 padding | ||||||
stdp | 采樣退化優(yōu)先描述 | ||||||
sdtp | 獨(dú)立于可支配采樣描述 | ||||||
sbgp | 采樣組 | ||||||
sgpd | 采樣組描述 | ||||||
subs | 子采樣信息 | ||||||
mvex | 視頻擴(kuò)展容器 | ||||||
mehd | 視頻擴(kuò)展容器頭 | ||||||
trex | √ | track 擴(kuò)展信息 | |||||
ipmc | IPMP控制容器 | ||||||
moof | 視頻分片 | ||||||
mfhd | √ | 視頻分片頭 | |||||
traf | track分片 | ||||||
tfhd | √ | track 分片頭 | |||||
trun | track 分片run 信息 | ||||||
sdtp | 獨(dú)立和可支配的采樣 | ||||||
sbgp | 采樣組 | ||||||
subs | 子采樣信息 | ||||||
mfra | 視頻分片訪問(wèn)控制信息 | ||||||
tfra | track 分片訪問(wèn)控制信息 | ||||||
mfro | √ | 拼分片訪問(wèn)控制偏移量 | |||||
mdat | media 數(shù)據(jù)容器 | ||||||
free | 空閑區(qū)域 | ||||||
skip | 空閑區(qū)域 | ||||||
udta | 用戶數(shù)據(jù) | ||||||
cprt | copyright 信息 | ||||||
meta | 元數(shù)據(jù) | ||||||
hdlr | √ | 定義元數(shù)據(jù)的句柄 | |||||
dinf | 數(shù)據(jù)信息容器 | ||||||
dref | 元數(shù)據(jù)的源參考信息 | ||||||
ipmc | IPMP控制容器 | ||||||
iloc | 所在位置信息容器 | ||||||
ipro | 樣本保護(hù)容器 | ||||||
sinf | 計(jì)劃信息保護(hù)容器 | ||||||
frma | 原格式容器 | ||||||
imif | IPMP 信息容器 | ||||||
schm | 計(jì)劃類(lèi)型容器 | ||||||
schi | 計(jì)劃信息容器 | ||||||
iinf | 容器所在項(xiàng)目信息 | ||||||
xml | XML容器 | ||||||
bxml | binary XML 容器 | ||||||
pitm | 主要參考容器 | ||||||
fiin | 文件發(fā)送信息 | ||||||
paen | partition 人口 | ||||||
fpar | 文件片段容器 | ||||||
fecr | FEC reservoir | ||||||
segr | 文件發(fā)送 session 組信息 | ||||||
gitn | 組id轉(zhuǎn)名稱(chēng)信息 | ||||||
tsel | track 選擇信息 | ||||||
meco | 追加的metadata 信息 | ||||||
mere | metabox 關(guān)系 |
????????MP4文件中的Box結(jié)構(gòu)與表中描述的基本上一致,在MP4的描述標(biāo)準(zhǔn)中moov與mdat的存放位置前后并沒(méi)有作強(qiáng)制要求,所以有時(shí)候moov被放在mdat的前面。而在互聯(lián)網(wǎng)的視頻點(diǎn)播中,若希望MP4被快速打開(kāi),則需要將moov存放在mdat的前面;如果放在后面,則需要將MP4文件下載完成后才可播放。
????????1.moov容器
????????moov容器定義了一個(gè)MP4文件中的數(shù)據(jù)信息,類(lèi)型是moov,是一個(gè)Atom容器,必須至少包含以下三種Atom中的一種:
?????????mvhd 標(biāo)簽, Movie Header Atom ,存放未壓縮過(guò)的影片信息的頭容器
?????????cmov 標(biāo)簽, Compressed Movie Atom , 壓縮過(guò)的電影信息容器,此容器不常用
?????????rmra 標(biāo)簽, Reference Movie Atom , 參考電影信息容器,此容器不常用
????????也可以包含其他容器信息,例如影片剪輯信息Clipping atom(clip)、一個(gè)或幾個(gè)trakAtom(trak)、一個(gè) Color Table Atom(ctab)和一個(gè) User Data Atom(udta)。其中,mvhd 中定義了多媒體文件的 time scale 、 duration 以及 display characteristics 。而 trak 中定義了多媒體文件中的一個(gè) track 的信息,track 是多媒體文件中可以獨(dú)立操作的媒體單位,例如一個(gè)音頻流就是一個(gè) track 、一個(gè)視頻流就是一個(gè) track。
? ? ? ? 在mvhd中定義了多媒體文件的time scale、duration以及display characteristics。而trak中定義了多媒體文件中的一個(gè)track的信息,track是多媒體文件中可以獨(dú)立操作的媒體單位。
? ? ? ? 用二進(jìn)制查看工具打開(kāi)一個(gè)MP4格式文件,如第一張圖,我們可以看到moov容器類(lèi)型位于(0x6D6F6F76),共包含0x00019689(104073)字節(jié);moov的參數(shù)格式隨下表所示。
? ? ? ? 接著我們往下找可以發(fā)現(xiàn)下一個(gè)容器類(lèi)型是mvhd,如圖中藍(lán)色標(biāo)記所示,地址為0x6D766864,同時(shí)容器大小為0x0000006C
? ? ? ? ?完成分析后,可以發(fā)現(xiàn)下個(gè)容器是一個(gè)trak標(biāo)簽,類(lèi)型和容器大小在這里就不再標(biāo)出和計(jì)算了。
? ? ? ? 最后便是udta容器(屬于moov的子容器),這個(gè)udta容器的解析方式與前面解析trak的方式基本相同。
? ? ? ? 我們通過(guò)計(jì)算可以發(fā)現(xiàn),udata+視頻trak+音頻trak+mvhd+moov描述大小之后得出來(lái)的總大小剛好與之前得出來(lái)的moov大小相等。
????????2.解析mvhd子容器
????????3.解析trak子容器
????????4.解析tkhd容器
????????5.解析mdia容器
????????6.解析mdhd容器
????????7.解析hdlr容器
????????8.解析minf容器
????????待完成
????????9.解析vmhd容器
????????10.解析smhd容器
????????11.解析dinf容器
????????12.解析stbl容器
????????待完成
????????13.解析edts容器
? ? ? ? 碼文中……文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-477758.html
歡迎閱讀下一章 FFmpeg格式轉(zhuǎn)換與封裝 II - FLV格式【音視頻開(kāi)發(fā)】FFmpeg格式轉(zhuǎn)換與封裝 II - FLV格式https://blog.csdn.net/weixin_42839065/article/details/130682490?spm=1001.2014.3001.5502文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-477758.html
到了這里,關(guān)于【音視頻開(kāi)發(fā)】FFmpeg轉(zhuǎn)換與封裝 I - MP4格式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!