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

視頻預(yù)覽
預(yù)覽也許叫播放更合適. 說(shuō)道播放, 最簡(jiǎn)單的有兩種選擇, 一是MediaPlayer, 一是ExoPlayer
1. 支持的格式方面
ExoPlayer比MediaPlayer支持的視頻格式更多. 但因?yàn)槲覀兲幚淼囊曨l格式只有MP4, 所以MediaPlayer完全勝任.
2. 視頻逐幀預(yù)覽.
就是拖動(dòng)播放進(jìn)度條時(shí), 顯示拖動(dòng)位置的幀頁(yè)面, 方便選擇. 經(jīng)過(guò)調(diào)研, 這個(gè)功能跟播放器的關(guān)系不大, 跟視頻格式強(qiáng)相關(guān), 如果視頻的關(guān)鍵幀很少, 那么拖動(dòng)的時(shí)候,顯示的畫面必然不流暢, 反之, 如果關(guān)鍵幀數(shù)據(jù)很豐富, 那么畫面就會(huì)很流暢. 經(jīng)過(guò)測(cè)試, 在相同數(shù)據(jù)狀況下, MediaPlayer表現(xiàn)的更好. 當(dāng)然也可以通過(guò)定制修改exoplayer的邏輯達(dá)到目的, 但是考慮之下, 已經(jīng)沒(méi)有必要.
3. 變速播放.
這個(gè)都是支持的.
4. 循環(huán)播放
都支持.
5. 預(yù)覽播放時(shí)對(duì)畫面進(jìn)行濾鏡, 動(dòng)效處理
都支持.
經(jīng)過(guò)學(xué)習(xí)研究, 發(fā)現(xiàn)可以通過(guò)glsurfaceview或者TextureView基礎(chǔ)上使用egl來(lái)創(chuàng)建surface, 并交給播放器使用. 只要達(dá)到這個(gè)目的, 就可以方便的對(duì)播放器給出的幀畫面進(jìn)行opengl渲染, 不管是濾鏡還是類似抖音上的那些動(dòng)效, 都可以通過(guò)著色器來(lái)實(shí)現(xiàn).
可以參考項(xiàng)目: https://github.com/MasayukiSuda/ExoPlayerFilter](https://github.com/MasayukiSuda/ExoPlayerFilter
6. 對(duì)視頻進(jìn)行多種動(dòng)效的疊加.
通過(guò)使用fbo, 并且對(duì)每種過(guò)濾器(filter)添加時(shí)間段屬性, 從而實(shí)現(xiàn)動(dòng)效的疊加.
視頻裁剪
引入的開(kāi)源庫(kù)是
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測(cè)試用例, 可以說(shuō)是最全面, 最正確的是安卓平臺(tái)硬解碼使用范例了.
對(duì)應(yīng)一篇簡(jiǎn)單翻譯過(guò)的中文文章
http://www.itdecent.cn/p/e6c683d6dbbe
幀緩沖技術(shù)簡(jiǎn)介
https://blog.csdn.net/jxw167/article/details/54985183
https://blog.csdn.net/junzia/article/details/53861519
http://www.itdecent.cn/p/78a64b8fb315
http://www.itdecent.cn/p/1da4a843e1b2Surface, SurfaceTexture, OpenglEs , 安卓平臺(tái)上surface及相關(guān)概念的介紹
https://source.android.com/devices/graphics/arch-sf-hwc關(guān)于opengl 著色器的簡(jiǎn)單介紹
https://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-part-ii-building-a-polygon/通過(guò)MediaCodec播放音視頻的項(xiàng)目
https://github.com/saki4510t/AudioVideoPlayerSample
https://github.com/googlesamples/android-BasicMediaDecoder通過(guò)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.itdecent.cn/u/fd6f2b25d0f4
http://www.itdecent.cn/p/5bb7f2a0da90使用Camera2 添加opengl效果的示例:
https://github.com/aleksas/androidGlesCamera2
https://github.com/googlecreativelab/shadercam/