1. 程式人生 > >Android將多個視訊檔案拼接為一個檔案

Android將多個視訊檔案拼接為一個檔案

正文

利用android的2個類MediaExtractor(抽取音/視訊幀) + MediaMuxer
(將音視訊重新寫入一個多媒體檔案,完成封裝)。

合成檔案為MP4。為啥是MP4? 因為android支援最好的就是這個格式。MediaMuxer的native實現者是MPEG4Writer。

合成mp4視訊主要有三個步驟:
1. 開始時,建立MediaMuxer,寫入檔案頭部ftyp;
2. 進行時,遍歷檔案,讀取每一幀,實時寫入新檔案的資料塊mdat,並在記憶體中儲存trak表。到下一個檔案時,pts offset增加;
3. 所有檔案都讀取完,結束,索引資訊trak表寫入moov。關閉檔案描述符。

話不多說,直接給github的demo程式碼:
https://github.com/xf420811/VideoComposerDemo

關於視訊合成的一些問題

1. 前後2個視訊的video fps不一樣,有關係嗎?
沒有關係。底層decoder不會因為fps有變化,就不解碼。做render的時候,是根據pts做顯示,不會用fps。(fps一般用於pts沒有,或者出錯時,decoder根據fps重新計算pts,送給render。)

2. 前後2個視訊的video codec不一樣,有關係嗎?
有關係。底層decoder會根據不同的codec建立真正的decoder例項,如AVCDecoder, HEVCDecoder,到解碼完成前,這個無法實時切換。

3. 前後2個視訊的video 解析度不一樣,有關係嗎?
有關係。底層decoder解碼時,會根據解析度等引數,建立解碼後的Output Buffer, 假設解析度突然變大了,那buffer大小就不夠,無法儲存,會崩潰。

4. Audio sample rate /channel number不一樣有關係嗎?
有關係。因為這2個引數,在播放音訊時,底層建立decoder,就需要設定這2個引數,如果解碼到一半,突然變了,一聲道變成2聲道了,或者sample rate從44.1k變成32k了,那有些廠商如果不支援sample rate動態變化,就會出錯,最終效果,很可能是播放時變成雜音。