2013-12-09 88 views
5

我需要將視頻解碼爲一系列位圖,以便我能夠修改它們,然後將它們壓縮回android中的視頻文件。使用MediaCodec和MediaExtractor來解碼和編碼視頻

我打算通過使用getFrameAtTime並將其保存爲圖像序列來管理此操作。然後,我可以修改序列中的圖像並將其編碼回電影。但我有兩個問題是:

  • 首先,因爲我讀它時,getFrameAtTime是創建縮略圖,並不能保證返回正確的框架。這使得視頻很遲鈍。
  • 其次,保存圖像並讀回圖像需要很長時間。

我讀過解碼的正確方法是使用MediaExtractor,這很好,但我只是有示例將它直接渲染到surfaceView。有什麼辦法可以將outputBuffer轉換爲位圖嗎?

我需要它來使它的api級別爲16或更高。

回答

8

您可以在bigflake網站上找到一組有用的示例。

特別是,ExtractMpegFramesTest演示瞭如何將.mp4文件解碼爲Bitmap,並且DecodeEditEncodeTest解碼並重新編碼H.264流,用GLES着色器修改幀。

許多示例使用API​​ 18中引入的功能,如Surface輸入MediaCodec(以避免一些顏色格式的問題),以及MediaMuxer(它允許你轉換的原始H.264基本流出來將MediaCodec轉換爲.mp4文件)。某些設備將允許您將視頻提取到ByteBuffer中的YUV數據,對其進行修改並對其進行重新編碼,但其他設備會提取爲可能被API 16版本MediaCodec拒絕的專有YUV色彩格式。

我建議編碼API 18(Android 4.3「Jellybean」MR2)或更高版本。

+0

那麼問題是,我已經看到了這個網站,但不幸的是我必須做對API拉特16.而且即使它說ExtractMpegFramesTest.java需要API 16,當我嘗試構建它時,它至少需要17 ...因此它不是一個選項。 –

+0

那麼你已經有了一場艱苦的戰鬥。它需要一般工作嗎?還是僅僅爲特定設備而構建? (我會檢查到ExtractMpegFramesTest - 我不認爲它需要17+以上的任何東西。) – fadden

+0

那麼這就是它需要的通用和api lvl 16 +的問題......我得到了getFrameAtTime解決方案,無需保存即可工作PNG和這樣的速度不止一次,但我仍然可能會遇到這樣的問題,它會提取一些幀兩次,這會導致視頻遲滯,我仍然不知道如何添加音頻。因此,任何關於將視頻分割爲位圖和創建帶有音頻的新視頻文件的建議都值得讚賞,但它需要使用16+以上版本。 –

1

有很多人說,從來沒有調用方法onFrameAvailable()。那麼,聽衆應該在與主線程不同的線程中。要設置監聽做到這一點:(如果是這種類聽者實現SurfaceTexture.IOnFrameAvailableListener):

mSurfaceTexture.SetOnFrameAvailableListener(this); 
相關問題