天天看點

Android(java方法)上實作mp4的分割和拼接 (一)

            最近正在處理android上的mp4切割問題。學習了很多mp4的知識,mp4檔案按照編碼類型,分為mpeg-4,avc這兩種;這兩種類型的mp4在後面的進行中會有不同的地方。

            在android系統下,MP4的分割大緻有三種可選擇的方法,(1)FFmpeg架構,對視訊進行一幀一幀解碼編碼處理。(2)第三方java開源庫,比如優秀的mp4parser。(3)Android4.1中新加入的api:MediaCodec。

            以上三種方法都有自己的優劣勢,簡單介紹:

           (1)FFmpeg,需要做jni實作。編碼解碼可以裁剪任意長度視訊的任意中間長度區間,支援對視訊加入水印,配樂,濾鏡處理;支援裁剪螢幕尺寸。最緻命的缺點是:

             效率低的難以忍受,大概是1s的視訊1.5S的處理時間,如果Android應用中這樣處理讓使用者等待完全找死行為。

             (2)mp4Parser。有非常詳細的資料和demo可以學習,是一個大牛的個人作品。但是它對視訊的裁剪處理非常粗糙,隻能從關鍵幀進行裁剪。經過我測試:mpeg-4格式的mp4檔案,大概2S-10S左右會有一個關鍵幀;avc格式的mp4檔案大概0.3S有一個關鍵幀。

                很大的有點是運作效率非常高,可以忽略時間成本。

               但是這樣會引入很明顯的問題,如果你的業務需求需要準确截取,無論你是選擇上一個節點還是下一個,頭尾大概都會引入平均3-4S的長度誤差。這個誤差有時難以忍受。

              (3)mediaCodec是Android4.1才引入的。如果以來這個Lib進行操作,會導緻4.1之前的版本無法使用。另外,需要說明,這個api以來很多C層和硬體層的實作,不要試圖将所有代碼分隔出來加到自己的項目中。

                下篇給出一個可行的方案來解決android上的mp4切割問題。