僅供顯示,一種簡單的方法是使用GLSurfaceView
,SurfaceTexture
來渲染視頻幀,以及MediaPlayer
。 Prokash的答案鏈接到一個開放源代碼庫,顯示如何實現這一點。如果你一起搜索這些術語,還有其他許多例子。採取這種路線,您可以將視頻幀繪製爲OpenGL紋理,並創建OpenGL着色器來操縱紋理的渲染方式。 (如果這足以滿足您的要求,我會建議詢問Prokash並接受他的回答。)
同樣,您可以使用OpenGL工具MediaCodec
和MediaExtractor
來解碼視頻幀。 MediaCodec
將被配置爲輸出到SurfaceTexture
,所以您不需要做更多的工作,只需編寫一些樣板文件即可獲得輸出緩衝區。過濾過程將與MediaPlayer
相同。有許多使用MediaCodec
作爲可用解碼器的例子。 here和here。將這些示例中使用的TextureView
或SurfaceView
替換爲Prokash示例的GLSurfaceView
應該相當直接。
此方法的優點是您可以訪問媒體文件中的所有單獨軌道。因此,您應該可以使用OpenGL過濾視頻軌道並直接複製其他軌道以導出。您可以在編碼模式下使用MediaCodec
,使用GLSurfaceView
的Surface
作爲輸入,使用MediaMuxer
將其全部重新組合。你可以在BigFlake看到幾個相關的例子。
您可以使用不帶Surface
的MediaCodec
直接訪問解碼的字節數據並以此方式操作。 This example說明了這種方法。您可以操作這些數據並將其發送到編碼器進行導出或按您認爲合適的方式進行渲染。處理原始字節數據有一些額外的複雜性。請注意,我喜歡這個例子,因爲它說明了分別處理音頻和視頻軌道。
您也可以使用FFMpeg,無論是本地代碼還是通過其中一個Java包裝。此選項更適合導出而不是立即播放。對於某些試圖使FFMpeg可用於Java的庫,請參見here或here。它們基本上是命令行界面的包裝。您需要做一些額外的工作才能通過FFMpeg管理播放,但這絕對是可行的。
如果您有任何疑問,請隨時詢問,並且我會嘗試闡述對您的用例最有意義的任何選項。
你想,可以操縱用於顯示視頻現成的庫(如下面的答案),或者你有其他要求不允許呢?答案中的鏈接項目演示瞭如何使用具有'MediaPlayer'的'GLSurfaceView'並應用OpenGL着色器在顯示器上執行過濾。如果您不需要導出已過濾的視頻,那絕對是一種合理的方法。你的'Surface'現在從哪裏來? – Dave
嗨@Dave,我目前正在研究如何調整顯示的視頻(通常在表面上),還導出調整後的視頻。所以我沒有具體的「表面」 - 這就是我正在尋找:) – Diolor