Android平臺(tái)上使用MediaCodec, Opengl對(duì)視頻進(jìn)行處理

前言

當(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)基本的視頻處理. 并且效果很好.

image.png

視頻預(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

  1. 幀緩沖技術(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/1da4a843e1b2

  2. Surface, SurfaceTexture, OpenglEs , 安卓平臺(tái)上surface及相關(guān)概念的介紹
    https://source.android.com/devices/graphics/arch-sf-hwc

  3. 關(guān)于opengl 著色器的簡(jiǎn)單介紹
    https://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-part-ii-building-a-polygon/

  4. 通過(guò)MediaCodec播放音視頻的項(xiàng)目
    https://github.com/saki4510t/AudioVideoPlayerSample
    https://github.com/googlesamples/android-BasicMediaDecoder

  5. 通過(guò)MediaPlayer + SurfaceTexture 播放視頻
    https://github.com/crossle/MediaPlayerSurface

  6. 一份視頻軟解碼壓縮
    https://github.com/fishwjy/VideoCompressor
    關(guān)于isoparser: 這里是另一個(gè)文章: https://blog.csdn.net/qq1263292336/article/details/73197456

  7. 各種模仿抖音的動(dòng)效, 著色器實(shí)現(xiàn)的
    http://www.itdecent.cn/u/fd6f2b25d0f4
    http://www.itdecent.cn/p/5bb7f2a0da90

  8. 使用Camera2 添加opengl效果的示例:
    https://github.com/aleksas/androidGlesCamera2
    https://github.com/googlecreativelab/shadercam/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,096評(píng)論 2 59
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,228評(píng)論 3 119
  • 曾經(jīng)以為認(rèn)識(shí)的或者要好的人會(huì)在一起一輩子,現(xiàn)在想想真是童真的很。 好多人走進(jìn)我的生命生活,又悄無(wú)聲息或...
    哈捺米奇閱讀 210評(píng)論 2 0
  • 這個(gè)故事,來(lái)自于剽悍讀書營(yíng)(營(yíng)長(zhǎng):剽悍一只貓)匿名老鐵(尊重作者意愿,不署昵稱): 說(shuō)一下加入讀書營(yíng)之前的學(xué)習(xí)、工...
    牛牛的Annie閱讀 476評(píng)論 1 1

友情鏈接更多精彩內(nèi)容