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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MediaRecorder MPEG4Writer

發布時間:2023/12/16 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MediaRecorder MPEG4Writer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MPEG4Writer是Android? stagefright媒體框架下一個的封裝類,我們平常錄制視頻調用的MediaRecorder接口類其視頻錄制的底層封裝實現就是通過MPEG4Writer完成的。

以視頻為例,MPEG4Writer是視頻錄制的最后一環。


圖1 MediaRecorder調用流程

MPEG4Writer遵守 ISO 14496-12標準進行封裝,MP4、3gp、ismv等我們常見的媒體封裝格式都是以這種基礎文件格式為基礎衍生的。

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

????????

Android系統錄像封裝流程主要有三個步驟:

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

2)???????錄制進行時,實時寫入音視頻軌跡的數據塊。

3)???????錄制結束時,寫入索引信息并更新頭部參數。

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

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

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



圖3 MPEG4Writer封裝數據流圖

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。