前言
當(dāng)前眾多的視頻SDK中, 大都是封裝ffmpeg對視頻進(jìn)行轉(zhuǎn)碼, 壓縮, 裁剪的處理.
優(yōu)點(diǎn)是ffmpeg發(fā)展到現(xiàn)在已經(jīng)相對成熟, 支持的視頻格式較多.
但是缺點(diǎn)也是顯而易見的的,
速度慢
用cpu來執(zhí)行視頻數(shù)據(jù)的處理屬于軟解碼, 效率并不高;
是需要的程序運(yùn)行尺寸較大.
以騰訊視頻sdk為例, 有20m上下, 這樣的sdk合入應(yīng)用后, 對應(yīng)用尺寸影響太大.
版權(quán)問題
那可是GPL許可證, 當(dāng)然, 在國內(nèi)這個(gè)沒人在意...
當(dāng)然目前像是七牛視頻sdk也是使用的硬解碼方式, 但卻是收費(fèi)的.
最近兩個(gè)多月因?yàn)楣ぷ餍枰? 經(jīng)歷了一番視頻錄制, 美顏, 裁剪, 轉(zhuǎn)碼的需求洗禮, 最終證明通過安卓本地硬解碼的方式完全可以實(shí)現(xiàn)基本的視頻處理. 并且效果很好.
視頻預(yù)覽
預(yù)覽也許叫播放更合適. 說道播放, 最簡單的有兩種選擇, 一是MediaPlayer, 一是ExoPlayer
1. 支持的格式方面
ExoPlayer比MediaPlayer支持的視頻格式更多. 但因?yàn)槲覀兲幚淼囊曨l格式只有MP4, 所以MediaPlayer完全勝任.
2. 視頻逐幀預(yù)覽.
就是拖動(dòng)播放進(jìn)度條時(shí), 顯示拖動(dòng)位置的幀頁面, 方便選擇. 經(jīng)過調(diào)研, 這個(gè)功能跟播放器的關(guān)系不大, 跟視頻格式強(qiáng)相關(guān), 如果視頻的關(guān)鍵幀很少, 那么拖動(dòng)的時(shí)候,顯示的畫面必然不流暢, 反之, 如果關(guān)鍵幀數(shù)據(jù)很豐富, 那么畫面就會很流暢. 經(jīng)過測試, 在相同數(shù)據(jù)狀況下, MediaPlayer表現(xiàn)的更好. 當(dāng)然也可以通過定制修改exoplayer的邏輯達(dá)到目的, 但是考慮之下, 已經(jīng)沒有必要.
3. 變速播放.
這個(gè)都是支持的.
4. 循環(huán)播放
都支持.
5. 預(yù)覽播放時(shí)對畫面進(jìn)行濾鏡, 動(dòng)效處理
都支持.
經(jīng)過學(xué)習(xí)研究, 發(fā)現(xiàn)可以通過glsurfaceview或者TextureView基礎(chǔ)上使用egl來創(chuàng)建surface, 并交給播放器使用. 只要達(dá)到這個(gè)目的, 就可以方便的對播放器給出的幀畫面進(jìn)行opengl渲染, 不管是濾鏡還是類似抖音上的那些動(dòng)效, 都可以通過著色器來實(shí)現(xiàn).
可以參考項(xiàng)目: https://github.com/MasayukiSuda/ExoPlayerFilter](https://github.com/MasayukiSuda/ExoPlayerFilter
6. 對視頻進(jìn)行多種動(dòng)效的疊加.
通過使用fbo, 并且對每種過濾器(filter)添加時(shí)間段屬性, 從而實(shí)現(xiàn)動(dòng)效的疊加.
視頻裁剪
引入的開源庫是
https://github.com/MasayukiSuda/Mp4Composer-android](https://github.com/MasayukiSuda/Mp4Composer-android
https://github.com/ypresto/android-transcoder/
兩個(gè)日本人的作品.
視頻裁剪同樣需要有應(yīng)用濾鏡, 疊加動(dòng)效的功能. 上面兩個(gè)項(xiàng)目并不支持, 需要改造擴(kuò)展.
示例代碼
最終給出一份我的項(xiàng)目代碼demo
https://github.com/shaopx/VideoClipEditViewTest
資源列表
1.http://bigflake.com/mediacodec/
這個(gè)網(wǎng)址列出的cts測試用例, 可以說是最全面, 最正確的是安卓平臺硬解碼使用范例了.
對應(yīng)一篇簡單翻譯過的中文文章
http://www.reibang.com/p/e6c683d6dbbe
幀緩沖技術(shù)簡介
https://blog.csdn.net/jxw167/article/details/54985183
https://blog.csdn.net/junzia/article/details/53861519
http://www.reibang.com/p/78a64b8fb315
http://www.reibang.com/p/1da4a843e1b2Surface, SurfaceTexture, OpenglEs , 安卓平臺上surface及相關(guān)概念的介紹
https://source.android.com/devices/graphics/arch-sf-hwc關(guān)于opengl 著色器的簡單介紹
https://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-part-ii-building-a-polygon/通過MediaCodec播放音視頻的項(xiàng)目
https://github.com/saki4510t/AudioVideoPlayerSample
https://github.com/googlesamples/android-BasicMediaDecoder通過MediaPlayer + SurfaceTexture 播放視頻
https://github.com/crossle/MediaPlayerSurface一份視頻軟解碼壓縮
https://github.com/fishwjy/VideoCompressor
關(guān)于isoparser: 這里是另一個(gè)文章: https://blog.csdn.net/qq1263292336/article/details/73197456各種模仿抖音的動(dòng)效, 著色器實(shí)現(xiàn)的
http://www.reibang.com/u/fd6f2b25d0f4
http://www.reibang.com/p/5bb7f2a0da90使用Camera2 添加opengl效果的示例:
https://github.com/aleksas/androidGlesCamera2
https://github.com/googlecreativelab/shadercam/