一规伐、背景介紹
1. VAP(Video Animation Player)是直播中臺使用的一個視頻動畫特效SDK,可以通過制作Alpha通道分離的視頻素材思瘟,再在客戶端上通過OpenGL ES重新實現(xiàn)Alpha通道和RGB通道的混合泉哈,從而實現(xiàn)在端上播放帶透明通道的視頻。
已經接入的app
image
同原理實現(xiàn)也用在其他app
抖音张抄、西瓜視頻、今日頭條洼怔、愛奇藝署惯、比心等
2. 方案對比
目前較常見的動畫實現(xiàn)方案有幀動畫、gif/webp镣隶、lottie/SVGA极谊,對于復雜動畫特效的實現(xiàn)做個簡單對比
方案 | 文件大小 | 解碼方式 | 特效支持 | 應用表現(xiàn) |
---|---|---|---|---|
Lottie/SVGA | 無法導出 | 軟解 | 部分復雜特效不支持 | 繪制耗時,內存抖動 |
gif/webp | 4.6M | 軟解 | 只支持8位色彩 | 文件資源消耗大 |
apng | 10.6M | 軟解 | 全支持 | 資源消耗大 |
vap | 1.5M | 硬解碼 | 全支持 | 性能好,復雜動畫支持好 |
3. 運行效果
image
4. 本文主要內容
主要介紹VAP如何實現(xiàn)诡右,從MediaCodec視頻解碼到OpenGL ES 渲染RGB及Alpha通道,最后輸出到TextureView上轻猖。
二帆吻、VAP實現(xiàn)架構
1. 需要的技術
- OpenGL ES: 創(chuàng)建紋理,及繪制工作
- TextureView: Android UI組件咙边,持有SurfaceTexture猜煮,監(jiān)聽SurfaceTexture的size變化,做顯示區(qū)域更新
- SurfaceTexture: 持有OpenGL ES創(chuàng)建的紋理败许,監(jiān)聽解碼后的幀數(shù)據(jù)做幀更新王带,并通知OpenGL ES繪制
- MediaCodec: 解碼,把解碼后的數(shù)據(jù)綁定到SurfaceTexture
2. 實現(xiàn)流程圖
image
image
3. 整體工作流程
為了方便查看各個類的職責及順序執(zhí)行的流程市殷,這里用泳道圖:
image
image
三愕撰、其他
完結,撒花??