效果圖:
一鞭盟、方案框架:
ExoPlayer播放器? +? vp9編碼? +? webm封裝
二、使用場景:
禮物特效脉幢、彈屏廣告、動態(tài)貼紙等
三信姓、方案對比
1、webm透明視頻 vs gif绸罗、webp意推、apng
gif、webp珊蟀、apng之間的對比這里略過菊值,從編碼質(zhì)量到平臺支持角度考慮(gif質(zhì)量太差、apng平臺支持太差)育灸,這里面webp比較有可比性腻窒,webm和webp都是Google的,只不過一個是視頻磅崭,一個是圖片儿子。webm是vp8或者vp9編碼,webp是vp8編碼砸喻,vp9的壓縮率更高一點柔逼。
相較于使用webp實現(xiàn)相關(guān)功能
本方案有幾個優(yōu)點,一割岛、支持流式播放愉适,就是邊下邊播,也不用全量載入內(nèi)存癣漆;二维咸、支持音軌,不用為了加背景音再使用一個音頻播放器,也就不用考慮音畫同步問題癌蓖;三瞬哼、基于視頻的控制邏輯,比如說進度條控制费坊、速度控制倒槐、事件回調(diào)等成熟的接口。四附井、相比圖片格式時間長度和文件大小基本沒有限制讨越。缺點也有,就是視頻格式比較“重”永毅,使用起來稍微繁瑣一點把跨。
2、webm透明視頻 vs SVGA沼死、Lottie
SVGA(YY)着逐、Lottie(Airbnb)這類基于Native Api繪制的方案現(xiàn)在也是一個非常主流的動畫實現(xiàn)方案,動畫的表現(xiàn)力與開發(fā)的便捷性相較于用View做動畫會有質(zhì)的提升意蛀。但是在我們的使用過程中也遇到了一些問題耸别。
SVGA、Lottie方案有幾個缺點县钥,這也促使了我們透明視頻方案的誕生:一秀姐、表現(xiàn)力還是不夠豐富,一些比較復(fù)雜的粒子效果可能引發(fā)卡頓若贮,還有3D效果無法實現(xiàn)(只能做仿射變換的偽3D)省有;二、對于上面的問題谴麦,導(dǎo)致很多動畫效果使用了大量的幀動畫蠢沿,導(dǎo)致文件變大,加之沒有視頻或者webp的邊解碼邊渲染的機制匾效,所有幀都要解碼為Bitmap舷蟀,導(dǎo)致累非常嚴重的內(nèi)存問題,OOM概率提升面哼;三雪侥、對于開發(fā)工具的限制,一般是要用Adobe AE精绎,而且對于特性的支持都不夠完整(Lottie會好一點)速缨。
webm相較于SVGA、Lottie方案代乃,最大的缺點是無法支持動態(tài)內(nèi)容旬牲,比如說動態(tài)圖片替換仿粹、動態(tài)文字替換、元素編輯等高階功能原茅。優(yōu)點是表現(xiàn)力強吭历,沒有性能問題,只要做出來的效果都可以無腦轉(zhuǎn)為視頻格式播放擂橘。
3晌区、webm透明視頻 vs 視頻左右分屏方案
這兩個方案本質(zhì)上沒有什么區(qū)別,都是原始RGB信息+Alpha信息分開存儲再渲染方案通贞,Alpha信息都是冗余存儲在RGB三通道數(shù)據(jù)中朗若。webm方案的一個好處是Alpha以一個payload方式存儲,原始視頻信息不變昌罩,即使用未修改的Exoplayer也能播放出不透明效果的視頻哭懈,不用再過多的修改Render層的邏輯,對播放器的修改較小茎用,使用起來比較優(yōu)雅遣总,視頻符合webm標準,可以在chrome內(nèi)核瀏覽器中直接使用轨功。視頻左右分屏方案一般是左RGB旭斥、右Alpha,需要寫一些shader代碼去做渲染古涧,透明視頻和非透明視頻分兩套渲染邏輯垂券,用起來稍繁瑣,而且在非修改播放器中無法正確渲染蒿褂。
為保證最小修改原則圆米,目前本方案使用的是Exoplayer 的vp9擴展卒暂,它用libvpx庫做解碼操作啄栓,暫時不支持硬解碼,目前看解碼性能沒有問題也祠。后續(xù)可以考慮加入硬解碼提升性能昙楚。
四、使用方法
https://github.com/zxzx74147/ExoPlayer
基于Exoplayer修改诈嘿,未改變?nèi)魏蝍pi調(diào)用方式堪旧,修改點可參考提交記錄,改動不大奖亚,具體使用見github說明淳梦。
可以源碼編譯引入,也可以直接使用基于分支r2.11.8-transparency生成的aar昔字。
六爆袍、附錄:
1首繁、ios13+基于hevc的透明視頻播放方案:? ? https://developer.apple.com/videos/play/wwdc2019/506/
2、ffmpeg轉(zhuǎn)換命令(注意加粗部分):
ffmpeg -i /path/input/file.mov -vf scale=640:360 -b:v 1.5M?-c:v libvpx-vp9 ?-vcodec libwebp /path/output/file.webp