Android 平臺上使用 MediaCodec , OpenGL 對視頻進行處理(建議收藏)
前言
當前眾多的視頻SDK中, 大都是封裝ffmpeg對視頻進行轉碼, 壓縮, 裁剪的處理.
優(yōu)點是ffmpeg發(fā)展到現(xiàn)在已經(jīng)相對成熟, 支持的視頻格式較多。
但是缺點也是顯而易見的的。
速度慢
用cpu來執(zhí)行視頻數(shù)據(jù)的處理屬于軟解碼, 效率并不高;
是需要的程序運行尺寸較大.
以騰訊視頻sdk為例, 有20m上下, 這樣的sdk合入應用后, 對應用尺寸影響太大.
版權問題
那可是GPL許可證, 當然, 在國內(nèi)這個沒人在意…
當然目前像是七牛視頻sdk也是使用的硬解碼方式, 但卻是收費的。
最近兩個多月因為工作需要, 經(jīng)歷了一番視頻錄制, 美顏, 裁剪, 轉碼的需求洗禮, 最終證明通過安卓本地硬解碼的方式完全可以實現(xiàn)基本的視頻處理. 并且效果很好。

視頻預覽
預覽也許叫播放更合適. 說道播放, 最簡單的有兩種選擇, 一是MediaPlayer, 一是ExoPlayer
1. 支持的格式方面
ExoPlayer比MediaPlayer支持的視頻格式更多. 但因為我們處理的視頻格式只有MP4, 所以MediaPlayer完全勝任.
2. 視頻逐幀預覽.
就是拖動播放進度條時, 顯示拖動位置的幀頁面, 方便選擇. 經(jīng)過調研, 這個功能跟播放器的關系不大, 跟視頻格式強相關, 如果視頻的關鍵幀很少, 那么拖動的時候,顯示的畫面必然不流暢。
反之, 如果關鍵幀數(shù)據(jù)很豐富, 那么畫面就會很流暢. 經(jīng)過測試, 在相同數(shù)據(jù)狀況下, MediaPlayer表現(xiàn)的更好. 當然也可以通過定制修改exoplayer的邏輯達到目的, 但是考慮之下, 已經(jīng)沒有必要。
3. 變速播放.
這個都是支持的.
4. 循環(huán)播放
都支持.
5. 預覽播放時對畫面進行濾鏡, 動效處理
都支持。
經(jīng)過學習研究, 發(fā)現(xiàn)可以通過glsurfaceview或者TextureView基礎上使用egl來創(chuàng)建surface, 并交給播放器使用。
只要達到這個目的, 就可以方便的對播放器給出的幀畫面進行opengl渲染, 不管是濾鏡還是類似抖音上的那些動效, 都可以通過著色器來實現(xiàn)。
可以參考項目: https://github.com/MasayukiSuda/ExoPlayerFilter
6. 對視頻進行多種動效的疊加.
通過使用fbo, 并且對每種過濾器(filter)添加時間段屬性, 從而實現(xiàn)動效的疊加.
視頻裁剪
引入的開源庫是
https://github.com/MasayukiSuda/Mp4Composer-android
https://github.com/ypresto/android-transcoder/
兩個日本人的作品.
視頻裁剪同樣需要有應用濾鏡, 疊加動效的功能. 上面兩個項目并不支持, 需要改造擴展.
示例代碼
最終給出一份我的項目代碼demo
https://github.com/shaopx/VideoClipEditViewTest
資源列表
1.http://bigflake.com/mediacodec/
這個網(wǎng)址列出的cts測試用例, 可以說是最全面, 最正確的是安卓平臺硬解碼使用范例了。
對應一篇簡單翻譯過的中文文章
https://www.jianshu.com/p/e6c683d6dbbe
幀緩沖技術簡介
https://blog.csdn.net/jxw167/article/details/54985183
https://blog.csdn.net/junzia/article/details/53861519
https://www.jianshu.com/p/78a64b8fb315
https://www.jianshu.com/p/1da4a843e1b2Surface, SurfaceTexture, Opengl ES , 安卓平臺上surface及相關概念的介紹
https://source.android.com/devices/graphics/arch-sf-hwc關于opengl 著色器的簡單介紹
https://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-part-ii-building-a-polygon/通過MediaCodec播放音視頻的項目
https://github.com/saki4510t/AudioVideoPlayerSample
https://github.com/googlesamples/android-BasicMediaDecoder通過MediaPlayer + SurfaceTexture 播放視頻
https://github.com/crossle/MediaPlayerSurface一份視頻軟解碼壓縮
https://github.com/fishwjy/VideoCompressor
關于isoparser: 這里是另一個文章: https://blog.csdn.net/qq1263292336/article/details/73197456各種模仿抖音的動效, 著色器實現(xiàn)的
https://www.jianshu.com/u/fd6f2b25d0f4
https://www.jianshu.com/p/5bb7f2a0da90使用Camera2 添加opengl效果的示例:
https://github.com/aleksas/androidGlesCamera2
https://github.com/googlecreativelab/shadercam/FFmpeg 和 OpenGL
https://github.com/githubhaohao/LearnFFmpeg
https://github.com/githubhaohao/NDK_OpenGLES_3_0
原文鏈接: https://www.jianshu.com/p/cbebba28b12c
-- END --
進技術交流群,掃碼添加我的微信:Byte-Flow
獲取相關資料和源碼
推薦:
全網(wǎng)最全的 Android 音視頻和 OpenGL ES 干貨,都在這了
面試官:如何利用 Shader 實現(xiàn) RGBA 到 NV21 圖像格式轉換?
項目疑難問題解答、大廠內(nèi)部推薦、面試指導、簡歷指導、代碼指導、offer 選擇建議、學習路線規(guī)劃,可以點擊找我一對一解答。
