日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MediaRecorder MPEG4Writer

發(fā)布時(shí)間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MediaRecorder MPEG4Writer 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MPEG4Writer是Android? stagefright媒體框架下一個(gè)的封裝類,我們平常錄制視頻調(diào)用的MediaRecorder接口類其視頻錄制的底層封裝實(shí)現(xiàn)就是通過MPEG4Writer完成的。

以視頻為例,MPEG4Writer是視頻錄制的最后一環(huán)。


圖1 MediaRecorder調(diào)用流程

MPEG4Writer遵守 ISO 14496-12標(biāo)準(zhǔn)進(jìn)行封裝,MP4、3gp、ismv等我們常見的媒體封裝格式都是以這種基礎(chǔ)文件格式為基礎(chǔ)衍生的。

首先看一下MPEG4Writer封裝好的視頻的格式:

????????

Android系統(tǒng)錄像封裝流程主要有三個(gè)步驟:

1)???????錄制開始時(shí),寫入文件頭部。

2)???????錄制進(jìn)行時(shí),實(shí)時(shí)寫入音視頻軌跡的數(shù)據(jù)塊。

3)???????錄制結(jié)束時(shí),寫入索引信息并更新頭部參數(shù)。

? 索引負(fù)責(zé)描述音視頻軌跡的特征,會(huì)隨著音視頻軌跡的存儲(chǔ)而變化,所以通常做法會(huì)將錄像文件索引信息放在音視頻軌跡流后面,在媒體流數(shù)據(jù)寫完(錄像結(jié)束)后才能寫入。可以看到,存放音視頻數(shù)據(jù)的mdat box是位于第二位的,而負(fù)責(zé)檢索音視頻的moov box是位于最后的,這與通常的MP4封裝的排列順序不同,當(dāng)然這是為了符合錄制而產(chǎn)生的結(jié)果。因?yàn)?moov的大小是隨著 mdat 變化的,而我們錄制視頻的時(shí)間預(yù)先是不知道的,所以需要先將mdat 數(shù)據(jù)寫入,最后再寫入moov,完成封裝。?

? 現(xiàn)有Android系統(tǒng)上錄像都是錄制是MP4或3GP格式,底層就是使用MPEG4Writer組合器類來完成的,它將編碼后的音視頻軌跡按照MPEG4規(guī)范進(jìn)行封裝,填入各個(gè)參數(shù),就組合成完整的MP4格式文件。MPEG4Writer的組合功能主要由兩種線程完成,一種是負(fù)責(zé)音視頻數(shù)據(jù)寫入封裝文件的寫線程(WriterThread),一種是音視頻數(shù)據(jù)讀取處理的軌跡線程(TrackThread)。軌跡線程一般有兩個(gè):視頻軌跡數(shù)據(jù)讀取線程和音頻軌跡數(shù)據(jù)讀取線程,而寫線程只有一個(gè),負(fù)責(zé)將軌跡線程中打包成Chunk的數(shù)據(jù)寫入封裝文件。

? 如圖3所示,軌跡線程是以幀為單位獲取數(shù)據(jù)幀(Sample),并將每幀中的信息及系統(tǒng)環(huán)境信息提取匯總存儲(chǔ)在內(nèi)存的trak表中,其中需要維持的信息有Chunk寫入文件的偏移地址Stco(Chunk Offset)、Sample與Chunk的映射關(guān)系Stsc(Sample-to-Chunk)、關(guān)鍵幀Stss(Sync Sample)、每一幀的持續(xù)時(shí)間Stts(Time-to-Sample)等,這些信息是跟每一幀的信息密切相關(guān)的,由圖可以看出trak表由各自的線程維護(hù),當(dāng)錄像結(jié)束時(shí)trak表會(huì)就會(huì)寫入封裝文件。而每一幀的數(shù)據(jù)流會(huì)先存入一個(gè)鏈表緩存中,當(dāng)幀的數(shù)量達(dá)到一定值時(shí),軌跡線程會(huì)將這些幀數(shù)據(jù)打包成塊(Chunk)并通知寫線程寫入到封裝文件。寫線程接到Chunk已準(zhǔn)備好的通知后就馬上搜索Chunk鏈表(鏈表個(gè)數(shù)與軌跡線程個(gè)數(shù)相關(guān),一般有兩個(gè),音視頻軌跡線程各有一個(gè)),將找到的第一個(gè)Chunk后便寫入封裝文件,并會(huì)將寫入的偏移地址更新到相應(yīng)的trak表的Stco項(xiàng)(但trak表中其它數(shù)據(jù)是由軌跡線程更新)。音視頻的Chunk數(shù)據(jù)是存儲(chǔ)于同一mdat box中,按添加到Chunk鏈表時(shí)間先后順序排列。等到錄像結(jié)束時(shí),錄像應(yīng)用會(huì)調(diào)用MPEG4Writer的stop方法,此時(shí)就會(huì)將音視頻的trak表分別寫入moov。



圖3 MPEG4Writer封裝數(shù)據(jù)流圖

總結(jié)

以上是生活随笔為你收集整理的MediaRecorder MPEG4Writer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。