資料介紹
軟件簡介
AlphaPlayer 是字節(jié)跳動開源的直播中臺使用的一個(gè)視頻動畫特效 SDK,可以通過制作 Alpha 通道分離的視頻素材,再在客戶端上通過OpenGL ES 重新實(shí)現(xiàn) Alpha 通道和 RGB 通道的混合,從而實(shí)現(xiàn)在端上播放帶透明通道的視頻。
這套方案對設(shè)計(jì)師而言明顯降低了特效的制作成本,對于客戶端而言有著更可靠的性能和穩(wěn)定性,且相比cocos2d引擎有著更低的入門門檻和維護(hù)成本,為復(fù)雜動畫的實(shí)現(xiàn)提供了一種全新的方式,新的復(fù)雜動畫開發(fā)將會變得更加簡單高效。
背景
在直播項(xiàng)目的原有禮物動畫實(shí)現(xiàn)效果是通過 cocos 引擎實(shí)現(xiàn)的,大部分動畫都是通過一系列的旋轉(zhuǎn)平移縮放組合而成,能實(shí)現(xiàn)的動畫效果較簡單且開發(fā)成本較高。為了豐富動畫的表現(xiàn)形式,降低開發(fā)成本,引入了 AlphaPlayer 的動畫實(shí)現(xiàn)方案。
方案對比
目前較常見的動畫實(shí)現(xiàn)方案有原生動畫、幀動畫、gif/webp、lottie/SVGA、cocos引擎,對于復(fù)雜動畫特效的實(shí)現(xiàn)做個(gè)簡單對比
方案 | 實(shí)現(xiàn)成本 | 上手成本 | 還原程度 | 接入成本 |
---|---|---|---|---|
原生動畫 | 復(fù)雜動畫實(shí)現(xiàn)成本高 | 低 | 中 | 低 |
幀動畫 | 實(shí)現(xiàn)成本低,但資源消耗大 | 低 | 中 | 低 |
gif/webp | 實(shí)現(xiàn)成本低,但資源消耗大 | 低 | 只支持8位顏色 | 低 |
Lottie/SVGA | 實(shí)現(xiàn)成本低,部分復(fù)雜特效不支持 | 低 | 部分復(fù)雜特效不支持 | 低 |
cocos2d引擎 | 實(shí)現(xiàn)成本高 | 高 | 較高 | 較高 |
AlphaPlayer | 開發(fā)無任何實(shí)現(xiàn)成本,一次接入永久使用 | 低 | 高 | 低 |
而在復(fù)雜動畫特效高效實(shí)現(xiàn)的場景中,我們的備選方案會更少一些,可以將討論集中在Cocos2d、Lottie、Webp和本文的AlphaPlayer上。
Lottie
Lottie是非常優(yōu)選的多平臺動畫效果解決方案,其簡單原理是將AE動畫導(dǎo)出的json文件解析成每個(gè)layer層級對象,再繪制成對應(yīng)的Drawable,最后顯示在View上。在不涉及mask和mattes等特性時(shí)性能非常優(yōu)選,主要耗時(shí)基本集中在Canvas#draw()上而已,json解析時(shí)通過流讀取的方式避免一次性加載全部json數(shù)據(jù)帶來的OOM問題。
但是也存在部分不足:
- 如果動畫涉及到mask或mattes等特性時(shí),需要生成2~3個(gè)臨時(shí)bitmap實(shí)現(xiàn)動畫效果,容易引起內(nèi)存抖動,且涉及的canvas#saveLayer()和canvas#drawBitmap()會帶來額外的耗時(shí);
- 如果動畫中還直接使用了圖片,在ImageAssetManager首次對圖片解碼是在主線程進(jìn)行的(據(jù)了解在iOS的版本上,使用圖片導(dǎo)致內(nèi)存和CPU的性能消耗會更大);
- 主要耗時(shí)還是在draw()上,繪制區(qū)域越大耗時(shí)越長;
- 目前支持的AE特性還有待完善,此外有一些特性在低版本上可能還會沒有效果,設(shè)計(jì)資源時(shí)需要規(guī)避。(Supported After Effect Features)
實(shí)際使用過程中,最常見的首啟全屏引導(dǎo)動畫基本都會包含上面提到的前三點(diǎn)不足,這種情況下性能其實(shí)是大幅退化的。因此對于直播場景的復(fù)雜特效動畫而言,Lottie就不是一個(gè)很合適的實(shí)現(xiàn)方案了。
Cocos2d-x
Cocos2d-x 支持非常多的游戲功能,諸如精靈、動作、動畫、粒子特效、骨骼動畫等等,可以供開發(fā)者自由實(shí)現(xiàn)各種姿勢的動畫效果,再加上自身具備跨平臺能力和輕量級,同時(shí)支持 Lua 作為開發(fā)語言,可以說是非常適合植入移動端作為動畫效果實(shí)現(xiàn)方案的游戲引擎。
但實(shí)際使用維護(hù)中會面臨很多問題:
- 體積大,即使經(jīng)過裁剪也還有2M左右的大小,如果不是核心場景需要基本很難允許接入;
- 對開發(fā)者的技術(shù)棧有較高要求;
- 無法滿足快速迭代;
- 維護(hù)難度大,尤其是在Android機(jī)型兼容的問題上。
Webp
Webp 相比 PNG 和 JPEG 格式體積可以減少 25%,在移動端的平臺支持上也很全面,支持 24 位 RGB 色;缺點(diǎn)是資源體積比較大,而且使用的軟解效率低下,低端機(jī)上有明顯卡頓問題。
AlphaPlayer
相比于上面提到的幾個(gè)方案,AlphaPlayer 的接入體積極?。ㄖ挥?0KB左右),而且對動畫資源的還原程度極高,資源制作時(shí)不用考慮特效是否支持的問題,對開發(fā)者和設(shè)計(jì)師都非常友好。通過接入ExoPlayer或者自研播放器可以解決系統(tǒng)播放器在部分機(jī)型上可能存在的兼容性問題,且能帶來更好的解碼性能。
運(yùn)行效果
基本原理
主要有兩個(gè)核心,一個(gè)是IMediaPlayer,負(fù)責(zé)視頻解碼,支持外部自行實(shí)現(xiàn);另一個(gè)是VideoRenderer,負(fù)責(zé)將解析出來的每一幀畫面進(jìn)行透明度混合,再輸出到GLTextureView或者GLSurfaceView上。
大致的混合過程可以看下圖示例
原素材的畫面中左邊部分使用RGB通道存儲了原透明視頻的Alpha值,右邊部分使用RGB通道存儲了原透明視頻的RGB值,然后在端上通過OpenGL重新將每個(gè)像素點(diǎn)的Alpha值和RGB值進(jìn)行組合,重新得到ARGB視頻畫面,實(shí)現(xiàn)透明視頻的動畫效果。
混合過程的詳細(xì)代碼可以見?frag.sh
和vertex.sh
,
快速接入
iOS
添加依賴
pod 'BDAlphaPlayer'
初始化View
BDAlphaPlayerMetalView *metalView = [[BDAlphaPlayerMetalView alloc] initWithDelegate:self]; [self.view addSubview:metalView];
播放動畫視頻
BDAlphaPlayerMetalConfiguration *configuration = [BDAlphaPlayerMetalConfiguration defaultConfiguration]; NSString *testResourcePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"TestResource"]; NSString *directory = [testResourcePath stringByAppendingPathComponent:@"heartbeats"]; configuration.directory = directory; configuration.renderSuperViewFrame = self.view.frame; configuration.orientation = BDAlphaPlayerOrientationPortrait; [self.metalView playWithMetalConfiguration:configuration];
Android
添加依賴
allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.bytedance:AlphaPlayer:1.0.4' }
初始化PlayerController
val config = Configuration(context, lifecycleOwner) // 支持GLSurfaceView&GLTextureView, 默認(rèn)使用GLSurfaceView config.alphaVideoViewType = AlphaVideoViewType.GL_TEXTURE_VIEW // 也可以設(shè)置自行實(shí)現(xiàn)的Player, demo中提供了基于ExoPlayer的實(shí)現(xiàn) val playerController = PlayerController.get(config, DefaultSystemPlayer()) playerController.setPlayerAction(object: IPlayerAction { override fun onVideoSizeChanged(videoWidth: Int, videoHeight: Int, scaleType: ScaleType) { } override fun startAction() { } override fun endAction() { } }) playController.setMonitor(object: IMonitor { override fun monitor(result: Boolean, playType: String, what: Int, extra: Int, errorInfo: String) { } })
將PlayerController綁定到ViewGroup
playerController.attachAlphaView(mVideoContainer)
播放動畫視頻
fun startVideoAnimation() { val baseDir = "your video file base dir" val portraitFileName = "portrait.mp4" val portraitScaleType = 2 val landscapeFileName = "landscape.mp4" val landscapeScaleType = 2 val dataSource = DataSource().setBaseDir(baseDir) .setPortraitPath(portraitFileName, portraitScaleType) .setLandscapePath(landscapeFileName, landscapeScaleType) .setLooping(false) // 可設(shè)置該視頻是否循環(huán)播放 if (dataSource.isValid()) { playerController.start(dataSource) } }
資源釋放
fun releasePlayerController() { playerController.detachAlphaView(mVideoContainer) playerController.release() }
GLSurfaceView & GLTextureView
SurfaceView和TextureView都是用來顯示視頻畫面的,主要差異在于性能和層級,SurfaceView的性能要優(yōu)于TextureView,但是層級限制在最頂層,TextureView則沒有層級限制??梢酝ㄟ^如下方式指定alphaVideoViewType來設(shè)置。
val config = Configuration(context, lifecycleOwner) // 支持GLSurfaceView&GLTextureView, 默認(rèn)使用GLSurfaceView config.alphaVideoViewType = AlphaVideoViewType.GL_TEXTURE_VIEW val playerController = PlayerController.get(config, DefaultSystemPlayer())
高級特性
動畫對齊方式
為了解決不同屏幕尺寸的兼容問題和支持半屏動畫視頻的指定位置播放,我們提供了多種視頻裁剪對齊方式,詳細(xì)可見ScaleType.kt
/BDAlphaPlayerDefine.h
。
對齊模式 | 描述 |
---|---|
ScaleToFill | 拉伸鋪滿全屏 |
ScaleAspectFitCenter | 等比例縮放對齊全屏,居中,屏幕多余部分留空 |
ScaleAspectFill | 等比例縮放鋪滿全屏,居中,裁剪視頻多余部分 |
TopFill | 等比例縮放鋪滿全屏,頂部對齊 |
BottomFill | 等比例縮放鋪滿全屏,底部對齊 |
LeftFill | 等比例縮放鋪滿全屏,左邊對齊 |
RightFill | 等比例縮放鋪滿全屏,右邊對齊 |
TopFit | 等比例縮放至屏幕寬度,頂部對齊,底部留空 |
BottomFit | 等比例縮放至屏幕寬度,底部對齊,頂部留空 |
LeftFit | 等比例縮放至屏幕高度,左邊對齊,右邊留空 |
RightFit | 等比例縮放至屏幕高度,右邊對齊,左邊留空 |
提供多種動畫對齊方式的目的有二:一是需要對不同屏幕尺寸的設(shè)備進(jìn)行兼容;二是希望盡量減少屏幕中視頻動畫的渲染區(qū)域(這對GPU功耗有線性收益),所以如果局部渲染可以滿足動畫表現(xiàn)需求,建議盡量使用局部渲染,即減少mVideoContainer
的布局大小。
Alpha通道壓縮方案
為了進(jìn)一步減少視頻動畫文件的體積,我們做了很多方向的嘗試,包括透明畫面像素點(diǎn)冗余channel的復(fù)用和整體尺寸壓縮,可以期待后續(xù)更新。
GLSurfaceView & GLTextureView
SurfaceView和TextureView都是用來顯示視頻畫面的,主要差異在于性能和層級,SurfaceView的性能要優(yōu)于TextureView,但是層級限制在最頂層,TextureView則沒有層級限制??梢酝ㄟ^如下方式指定alphaVideoViewType來設(shè)置。
val config = Configuration(context, lifecycleOwner) // 支持GLSurfaceView&GLTextureView, 默認(rèn)使用GLSurfaceView config.alphaVideoViewType = AlphaVideoViewType.GL_TEXTURE_VIEW val playerController = PlayerController.get(config, DefaultSystemPlayer())
素材制作工具
素材制作的方式有兩種:
一種是直接使用AE導(dǎo)出成品素材,大致流程就是后期在AE上完成動畫效果后,分離出Alpha通道視頻,然后在同一個(gè)AE合成里左邊帶Alpha通道后邊帶正常動畫,一起渲染導(dǎo)出。如果還是不理解,還是讓設(shè)計(jì)師去代勞吧,專業(yè)的人做專業(yè)的事。
第二種方式,在AE上完成動畫后期效果后,直接輸出視頻序列幀,然后使用我們提供的素材制作腳本?convertAlphaVideo.py
?進(jìn)行處理也可以直接得出成品素材視頻,腳本的大致原理如下:
素材制作工具
素材制作的方式有兩種:
一種是直接使用AE導(dǎo)出成品素材,大致流程就是后期在AE上完成動畫效果后,分離出Alpha通道視頻,然后在同一個(gè)AE合成里左邊帶Alpha通道后邊帶正常動畫,一起渲染導(dǎo)出。如果還是不理解,還是讓設(shè)計(jì)師去代勞吧,專業(yè)的人做專業(yè)的事。
第二種方式,在AE上完成動畫后期效果后,直接輸出視頻序列幀,然后使用我們提供的素材制作腳本?convertAlphaVideo.py
?進(jìn)行處理也可以直接得出成品素材視頻,腳本的大致原理如下:
可以看到通道分離和畫面拼接是基于ffmpeg和ImageMagick兩套工具實(shí)現(xiàn)的,所以運(yùn)行前需要先配置ffmpeg和ImageMagick的環(huán)境。
執(zhí)行下面命令,等待成品素材生成。
?
- 小孔成像的原理圖 (視頻動畫) 0次下載
- 環(huán)面取線動畫視頻教程
- 環(huán)面取點(diǎn)動畫視頻教程
- 復(fù)合面取點(diǎn)動畫視頻教程
- 直線投影動畫視頻教程
- 直線上的點(diǎn)動畫視頻教程
- 投影面平行線動畫視頻教程
- 平面定點(diǎn)動畫視頻教程
- 平面表示動畫視頻教程
- 點(diǎn)在平面動畫視頻教程
- 點(diǎn)投影作圖動畫視頻教程
- 中心投影法動畫視頻教程
- 投影概念動畫視頻教程
- 平行投影法動畫視頻教程
- 點(diǎn)三面投影動畫視頻教程
- 如何在播放視頻過程中插入音頻 272次閱讀
- 視頻引擎初始化失敗怎么回事 1414次閱讀
- 【AWTK使用經(jīng)驗(yàn)】如何實(shí)現(xiàn)序列幀動畫 460次閱讀
- 26張電路原理動畫圖解 3474次閱讀
- 基于WebAssembly構(gòu)建Web端音視頻通話引擎 926次閱讀
- 在QML動畫設(shè)計(jì)中通過指定關(guān)鍵幀創(chuàng)建時(shí)間線動畫 2173次閱讀
- 如何使用屬性動畫實(shí)現(xiàn)簡單屬性變化的動畫效果 1455次閱讀
- 如何使用Arduino構(gòu)建一個(gè)電子動畫眼睛 2644次閱讀
- Lottie組件提升ArkUI開發(fā)框架的動畫能力 2044次閱讀
- 最全的機(jī)械動畫原理合集免費(fèi)下載 1.6w次閱讀
- 關(guān)于AI文本生成動畫模型的論文 4093次閱讀
- 怎樣選擇存儲引擎?MySQL存儲引擎怎么樣? 4793次閱讀
- 3D動畫中快速的動作捕捉,實(shí)現(xiàn)快速迭代和隨時(shí)可用的動畫文件的概述 1.1w次閱讀
- 數(shù)據(jù)庫引擎是什么 1.1w次閱讀
- 垂直搜索引擎是什么_垂直搜索引擎有哪些 7943次閱讀
下載排行
本周
- 1DD3118電路圖紙資料
- 0.08 MB | 1次下載 | 免費(fèi)
- 2AD庫封裝庫安裝教程
- 0.49 MB | 1次下載 | 免費(fèi)
- 3PC6206 300mA低功耗低壓差線性穩(wěn)壓器中文資料
- 1.12 MB | 1次下載 | 免費(fèi)
- 4網(wǎng)絡(luò)安全從業(yè)者入門指南
- 2.91 MB | 1次下載 | 免費(fèi)
- 5DS-CS3A P00-CN-V3
- 618.05 KB | 1次下載 | 免費(fèi)
- 6海川SM5701規(guī)格書
- 1.48 MB | 次下載 | 免費(fèi)
- 7H20PR5電磁爐IGBT功率管規(guī)格書
- 1.68 MB | 次下載 | 1 積分
- 8IP防護(hù)等級說明
- 0.08 MB | 次下載 | 免費(fèi)
本月
- 1貼片三極管上的印字與真實(shí)名稱的對照表詳細(xì)說明
- 0.50 MB | 103次下載 | 1 積分
- 2涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 89次下載 | 1 積分
- 3錦銳科技CA51F2 SDK開發(fā)包
- 24.06 MB | 43次下載 | 1 積分
- 4錦銳CA51F005 SDK開發(fā)包
- 19.47 MB | 19次下載 | 1 積分
- 5PCB的EMC設(shè)計(jì)指南
- 2.47 MB | 16次下載 | 1 積分
- 6HC05藍(lán)牙原理圖加PCB
- 15.76 MB | 13次下載 | 1 積分
- 7802.11_Wireless_Networks
- 4.17 MB | 12次下載 | 免費(fèi)
- 8蘋果iphone 11電路原理圖
- 4.98 MB | 6次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191390次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81588次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論