2014-02-27 140 views
11

我正在尋找一種方法來「壓縮」MP4視頻。爲了實現這一點,我想降低視頻的分辨率和/或降低FPS。Android MediaCodec:減少MP4視頻尺寸

經過長期的研究,我認爲這樣做是使用MediaCodec和相關的API如下的方式:

- > MediaExtractor從MP4文件中提取編碼的媒體數據。 - > MediaCodec(解碼器):解碼每個幀以供後續處理。 - > MediaCodec(編碼器):在這一點上,我想我們應該建立MediaFormat參數,例如視頻分辨率,這應該有助於我們減少mp4文件的最終大小。 - > MediaMuxer用於生成mp4文件(MinSDK 18,這可能是一個問題,但現在...確定)。

我不想使用SurfaceView/TextureView。 關於音頻,我不想處理它以降低質量。

我一直期待在這裏所有的例子: http://bigflake.com/mediacodec/

我也看到了CTS的源代碼模塊。

而且我一直在看一些項目像這樣: https://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

當然,我看過幾十個計算器的職位。

問題是我還沒有找到任何代碼示例適用於此porpuse。我嘗試了各種代碼並將它們放在一個項目中,但實際上並不奏效。

謝謝。

+3

請分享,如果你發現這個問題的任何解決方案。 – Kanchan

+0

你能解決這個問題嗎? –

回答

4

最接近你想要的東西可能是DecodeEditEncodeTest在bigflake上。您不需要SurfaceViewTextureView,因爲您並未嘗試顯示該視頻,但需要使用SurfaceTexture

測試代碼生成視頻,然後解碼/編輯/編碼,然後測試編碼輸出。你想要解碼 - 編輯 - 編碼部分。創建編碼器時,請將其設爲任意大小。它創建的輸入表面的大小將匹配。縮放由GPU在將GL紋理(從SurfaceTexture)渲染到編碼器的輸入表面時執行。您必須決定GLES線性過濾是否提供您需要的質量水平。

(你可以看到在ExtractMpegFramesTest類似的東西,它可以擴展一切爲640x480,因爲它是幹什麼的提取。在這種情況下,它轉換幀PNG而不是將它們送入編碼器,所以它不是適用於您的情況。 )

刪除幀在理論上很容易:只是不要將其提交給編碼器。在實踐中,如果輸入具有不規則間隔的幀,則會更困難。如果輸入是「frame1 frame2 ... pause ... frame4 frame5」,並且你放棄了frame2,那麼你最終會在frame1上暫停,這可能看起來很奇怪。您可以使用演示時間戳來計算時間。

表面輸入和MediaMuxer(將H.264保存爲.mp4所需)需要API 18+。對於較舊版本的Android,您可能需要使用第三方庫,如ffmpeg

+0

DecodeEditEncodeTest只解碼視頻,但如何對其進行編碼。基本上我想減少視頻大小,以便在服務器上發送。 – Kanchan

+0

任何建議。 – Kanchan

+0

它被稱爲「DecodeEditEncodeTest」,因爲它解碼並編碼視頻,修改(編輯)它的顏色。 – fadden