2017-09-05 120 views
6

假設我們在Android上Surface能顯示視頻(例如H264)用的MediaPlayer:視頻在機器人:改變視覺特性(例如飽和度,亮度)

1)是否有可能改變顯示飽和,對比&顯示在平面視頻上的亮度?實時?例如。圖像可以使用setColorFilter有什麼類似的Android來處理視頻幀?

替代問題(如果沒有1太難了。):

2)如果我們想導出此視頻與例如飽和度增加,我們應該使用編解碼器,例如MediaCodec。我們應該在編解碼器/保存操作之前使用哪些技術(方法,類,庫等)來應用飽和度更改?

+0

你想,可以操縱用於顯示視頻現成的庫(如下面的答案),或者你有其他要求不允許呢?答案中的鏈接項目演示瞭如何使用具有'MediaPlayer'的'GLSurfaceView'並應用OpenGL着色器在顯示器上執行過濾。如果您不需要導出已過濾的視頻,那絕對是一種合理的方法。你的'Surface'現在從哪裏來? – Dave

+0

嗨@Dave,我目前正在研究如何調整顯示的視頻(通常在表面上),還導出調整後的視頻。所以我沒有具體的「表面」 - 這就是我正在尋找:) – Diolor

回答

2

僅供顯示,一種簡單的方法是使用GLSurfaceViewSurfaceTexture來渲染視頻幀,以及MediaPlayer。 Prokash的答案鏈接到一個開放源代碼庫,顯示如何實現這一點。如果你一起搜索這些術語,還有其他許多例子。採取這種路線,您可以將視頻幀繪製爲OpenGL紋理,並創建OpenGL着色器來操縱紋理的渲染方式。 (如果這足以滿足您的要求,我會建議詢問Prokash並接受他的回答。)

同樣,您可以使用OpenGL工具MediaCodecMediaExtractor來解碼視頻幀。 MediaCodec將被配置爲輸出到SurfaceTexture,所以您不需要做更多的工作,只需編寫一些樣板文件即可獲得輸出緩衝區。過濾過程將與MediaPlayer相同。有許多使用MediaCodec作爲可用解碼器的例子。 herehere。將這些示例中使用的TextureViewSurfaceView替換爲Prokash示例的GLSurfaceView應該相當直接。

此方法的優點是您可以訪問媒體文件中的所有單獨軌道。因此,您應該可以使用OpenGL過濾視頻軌道並直接複製其他軌道以導出。您可以在編碼模式下使用MediaCodec,使用GLSurfaceViewSurface作爲輸入,使用MediaMuxer將其全部重新組合。你可以在BigFlake看到幾個相關的例子。

您可以使用不帶SurfaceMediaCodec直接訪問解碼的字節數據並以此方式操作。 This example說明了這種方法。您可以操作這些數據並將其發送到編碼器進行導出或按您認爲合適的方式進行渲染。處理原始字節數據有一些額外的複雜性。請注意,我喜歡這個例子,因爲它說明了分別處理音頻和視頻軌道。

您也可以使用FFMpeg,無論是本地代碼還是通過其中一個Java包裝。此選項更適合導出而不是立即播放。對於某些試圖使FFMpeg可用於Java的庫,請參見herehere。它們基本上是命令行界面的包裝。您需要做一些額外的工作才能通過FFMpeg管理播放,但這絕對是可行的。

如果您有任何疑問,請隨時詢問,並且我會嘗試闡述對您的用例最有意義的任何選項。

+0

嗨戴夫,你肯定值得賞賜,因爲它非常分析。創建可視過濾器並導出它們的最均衡的解決方案看起來像使用'MediaCodec'手動工作。當然,我正在尋找是否可以使用FFMpeg(它看起來很棒),並帶有一些「預覽」的可能性。謝謝! – Diolor

1

如果您使用的是支持視頻濾鏡玩家,那麼你可以做到這一點。

這樣的球員的實施例是VLC,其圍繞FFMPEG [1]建造。

VLC很容易編譯爲Android。然後,你需要的是libvlc(aar文件),你可以構建自己的應用程序。請參閱編譯指令here

您還需要write your own module。只需複製一個現有的並修改它。不用說,VLC提供強大的轉碼和流媒體功能。

至於強大的VLC Android版,它有一個巨大的缺點 - 視頻濾波器不能與硬件解碼工作(僅限Android)。這意味着整個視頻處理都在CPU上。


您的其他選項是在GLSurfaceView和TextureView等表面上使用GLSL/OpenGL。這保證了GPU的能力。

相關問題