
最近為了更加深入了解音視頻demux這塊的功能,準(zhǔn)備著手寫(xiě)個(gè)demuxer,提取視頻流。
MP4簡(jiǎn)介 MP4的定義MP4是一種常用的視音頻流封裝格式,按照指定的協(xié)議來(lái)存放媒體數(shù)據(jù);因?yàn)閙p4是基于蘋(píng)果QuickTime文件格式,所以與mov有很多相同之處,在蘋(píng)果開(kāi)發(fā)者平臺(tái)可以看到詳細(xì)的有關(guān)封裝文檔(https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25615)
MP4的封裝格式MP4格式預(yù)覽—mp4是由多個(gè)box嵌套組成的
MP4主要的頂部box
ftyp box:描述MP4鎖遵循的規(guī)范和版本
mdat box :存放媒體數(shù)據(jù)
moov box:存放媒體參數(shù)(pps、sps等)相關(guān)信息和用于索引媒體數(shù)據(jù)存儲(chǔ)位置的信息
MP4常用box

字段分布圖
字段解析
major_brand:比如常見(jiàn)的 isom、mp41、mp42、avc1、qt等。它表示“最好”基于哪種格式來(lái)解析當(dāng)前的文件。舉例,major_brand 是 A,compatible_brands 是 A1,當(dāng)解碼器同時(shí)支持 A、A1 規(guī)范時(shí),最好使用A規(guī)范來(lái)解碼當(dāng)前媒體文件,如果不支持A規(guī)范,但支持A1規(guī)范,那么,可以使用A1規(guī)范來(lái)解碼;
minor_version:提供 major_brand 的說(shuō)明信息,比如版本號(hào),不得用來(lái)判斷媒體文件是否符合某個(gè)標(biāo)準(zhǔn)/規(guī)范;
compatible_brands:文件兼容的brand列表。比如 mp41 的兼容 brand 為 isom。通過(guò)兼容列表里的 brand 規(guī)范,可以將文件 部分(或全部)解碼出來(lái);
字段分布圖
字段解析
version :一字節(jié)用于指定mvhd的版本
flags:3字節(jié),預(yù)留
Create time:媒體創(chuàng)建時(shí)間,與UTC時(shí)間不同的是,此時(shí)間是從1904年1月1日0:0:0開(kāi)始計(jì)算的,而utc是從1970年1月1日0:0:0開(kāi)始計(jì)算,故Create time須要減去時(shí)間差換算成utc時(shí)間
// 注:66年時(shí)間差不是66*365*24*3600來(lái)計(jì)算
creation_time_utc = creation_time - (66年時(shí)間差) = creation_time - 2082844800Modification time:媒體最后被修改的時(shí)間,計(jì)算方式同Create time
Timescale:一秒包含的時(shí)間單位(整數(shù))。舉個(gè)例子,如果timescale等于1000,那么,一秒包含1000個(gè)時(shí)間單位(后面track等的時(shí)間,都要用這個(gè)來(lái)?yè)Q算,比如track的duration為10,000,那么,track的實(shí)際時(shí)長(zhǎng)為10,000/1000=10s);
Duration:影片時(shí)長(zhǎng)(整數(shù)),根據(jù)文件中的track的信息推導(dǎo)出來(lái),等于時(shí)間最長(zhǎng)的track的duration;
Preferred rate:推薦的播放速率,32位整數(shù),高16位、低16位分別代表整數(shù)部分、小數(shù)部分([16.16]),舉例 0x0001 0000 代表1.0,正常播放速度;
Preferred volume:播放音量,16位整數(shù),高8位、低8位分別代表整數(shù)部分、小數(shù)部分([8.8]),舉例 0x01 00 表示 1.0,即大音量;
Matrix struct:視頻的轉(zhuǎn)換矩陣,詳情看
Basic Data Types
Next_track_ID:32位整數(shù),非0,一般可以忽略不計(jì)。當(dāng)要添加一個(gè)新的track到這個(gè)影片時(shí),可以使用的track id,必須比當(dāng)前已經(jīng)使用的track id要大。也就是說(shuō),添加新的track時(shí),需要遍歷所有track,確認(rèn)可用的track id;
字段分布圖
字段解析
字段分布圖
字段解析
數(shù)據(jù)結(jié)構(gòu)分布圖
注意:取到的frame前四個(gè)字節(jié)為frame數(shù)據(jù)的長(zhǎng)度字節(jié),須要偏移去掉
主要存放了媒體參數(shù)(pps、sps、vps等)相關(guān)信息和用于解析mdat中視音頻數(shù)據(jù)的關(guān)鍵信息
字段分布圖
字段解析
avc1 box
字段分布圖
字段解析
這個(gè)在https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html的“Sample Description Atoms”一節(jié)可以研究下
avcC box(包含了視頻關(guān)鍵參數(shù),在ISO/IEC 14496-15中定義)
字段分布圖
字段解析
其他字段可以自行在ISO/IEC 14496-15中查到
字段分布圖
字段解析
字段分布圖
字段解析
Sample-to-chunk table示意圖
字段分布圖
字段解析
字段分布圖
字段解析
Time-to-sample table:示意圖
sample1 - sample4的sample duration是4
字段分布圖
字段解析
獲取sps pps參數(shù)
解析stsd box,其中contain avc1 box和avcC box(此步驟詳解見(jiàn)上文)
解析avcC box可以獲取到sps和pps
以下為ISO/IEC 14496-15中解析avcC的偽代碼
aligned(8) class AVCDecoderConfigurationRecord { unsigned int(8) configurationVersion = 1;
unsigned int(8) AVCProfileIndication;
unsigned int(8) profile_compatibility;
unsigned int(8) AVCLevelIndication;
bit(6) reserved = ‘111111’b;
unsigned int(2) lengthSizeMinusOne;
bit(3) reserved = ‘111’b;
unsigned int(5) numOfSequenceParameterSets;
for (i=0; i< numOfSequenceParameterSets; i++) { unsigned int(16) sequenceParameterSetLength ;
bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
}
unsigned int(8) numOfPictureParameterSets;
for (i=0; i< numOfPictureParameterSets; i++) { unsigned int(16) pictureParameterSetLength;
bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
}
if( profile_idc == 100 || profile_idc == 110 ||
profile_idc == 122 || profile_idc == 144 )
{ bit(6) reserved = ‘111111’b;
unsigned int(2) chroma_format;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_luma_minus8;
bit(5) reserved = ‘11111’b;
unsigned int(3) bit_depth_chroma_minus8;
unsigned int(8) numOfSequenceParameterSetExt;
for (i=0; i< numOfSequenceParameterSetExt; i++) { unsigned int(16) sequenceParameterSetExtLength;
bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
}
}
}獲取關(guān)鍵幀位置
解析stss box可以知道哪一個(gè)sample中包含關(guān)鍵幀
獲取chunk位置
解析stco box可以獲取到每個(gè)chunk在視頻文件中的索引
獲取每個(gè)chunk中sample個(gè)數(shù)
解析stsc box可以獲取到每個(gè)chunk包含多少個(gè)sample
獲取sample大小
解析stsz box可以獲取到每個(gè)sample的大小
獲取frame位置(demo視頻文件一個(gè)sample只包含一個(gè)frame,所以sample的位置和大小就是frame的位置和大小)
獲取到一幀數(shù)據(jù)后
保存成h264文件,可使用ffplay和potplay播放
注意:有些非字串的字段為大端字節(jié)序,須要轉(zhuǎn)換
總結(jié):mp4info—可以看到相關(guān)box的字節(jié)信息,但發(fā)現(xiàn)對(duì)avcC的解析漏掉了幾個(gè)字節(jié)
mp4 exploer—可以更加直觀的看到視音頻數(shù)據(jù)信息
https://github.com/TaoChou/demuxer-c
參考你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:c實(shí)現(xiàn)mp4解封裝-創(chuàng)新互聯(lián)
瀏覽地址:http://chinadenli.net/article26/didscg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、品牌網(wǎng)站建設(shè)、Google、移動(dòng)網(wǎng)站建設(shè)、建站公司、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)