## AlphaPlayer
> Powered by ByteDance Live.
AlphaPlayer是直播中台使用的一个视频动画特效SDK,可以通过制作Alpha通道分离的视频素材,再在客户端上通过OpenGL ES重新实现Alpha通道和RGB通道的混合,从而实现在端上播放带透明通道的视频。
这套方案对设计师而言明显降低了特效的制作成本,对于客户端而言有着更可靠的性能和稳定性,且相比cocos2d引擎有着更低的入门门槛和维护成本,为复杂动画的实现提供了一种全新的方式,新的复杂动画开发将会变得更加简单高效。
### 背景
在直播项目的原有礼物动画实现效果是通过cocos引擎实现的,大部分动画都是通过一系列的旋转平移缩放组合而成,能实现的动画效果较简单且开发成本较高。为了丰富动画的表现形式,降低开发成本,我们引入了AlphaPlayer的动画实现方案。
### 方案对比
目前较常见的动画实现方案有原生动画、帧动画、gif/webp、lottie/SVGA、cocos引擎,对于复杂动画特效的实现做个简单对比
| 方案 | 实现成本 | 上手成本 | 还原程度 | 接入成本 |
| ----------- | ------------------------------------ | -------- | ------------------ | -------- |
| 原生动画 | 复杂动画实现成本高 | 低 | 中 | 低 |
| 帧动画 | 实现成本低,但资源消耗大 | 低 | 中 | 低 |
| gif/webp | 实现成本低,但资源消耗大 | 低 | 只支持8位颜色 | 低 |
| Lottie/SVGA | 实现成本低,部分复杂特效不支持 | 低 | 部分复杂特效不支持 | 低 |
| cocos2d引擎 | 实现成本高 | 高 | 较高 | 较高 |
| AlphaPlayer | 开发无任何实现成本,一次接入永久使用 | 低 | 高 | 低 |
**而在复杂动画特效高效实现的场景中,我们的备选方案会更少一些,可以将讨论集中在Cocos2d、Lottie、Webp和本文的AlphaPlayer上。**
#### Lottie
Lottie是非常优选的多平台动画效果解决方案,其简单原理是将AE动画导出的json文件解析成每个layer层级对象,再绘制成对应的Drawable,最后显示在View上。在不涉及mask和mattes等特性时性能非常优选,主要耗时基本集中在Canvas#draw()上而已,json解析时通过流读取的方式避免一次性加载全部json数据带来的OOM问题。
但是也存在部分不足:
1. 如果动画涉及到mask或mattes等特性时,需要生成2~3个临时bitmap实现动画效果,容易引起内存抖动,且涉及的canvas#saveLayer()和canvas#drawBitmap()会带来额外的耗时;
2. 如果动画中还直接使用了图片,在ImageAssetManager首次对图片解码是在主线程进行的(据了解在iOS的版本上,使用图片导致内存和CPU的性能消耗会更大);
3. 主要耗时还是在draw()上,绘制区域越大耗时越长;
4. 目前支持的AE特性还有待完善,此外有一些特性在低版本上可能还会没有效果,设计资源时需要规避。([Supported After Effect Features](http://airbnb.io/lottie/#/supported-features))
实际使用过程中,最常见的首启全屏引导动画基本都会包含上面提到的前三点不足,这种情况下性能其实是大幅退化的。因此对于直播场景的复杂特效动画而言,Lottie就不是一个很合适的实现方案了。
#### Cocos2d-x
Cocos2d-x支持非常多的游戏功能,诸如精灵、动作、动画、粒子特效、骨骼动画等等,可以供开发者自由实现各种姿势的动画效果,再加上自身具备跨平台能力和轻量级,同时支持Lua作为开发语言,可以说是非常适合植入移动端作为动画效果实现方案的游戏引擎。
但实际使用维护中会面临很多问题:
1. 体积大,即使经过裁剪也还有2M左右的大小,如果不是核心场景需要基本很难允许接入;
2. 对开发者的技术栈有较高要求;
3. 无法满足快速迭代;
4. 维护难度大,尤其是在Android机型兼容的问题上。
#### Webp
Webp相比PNG和JPEG格式体积可以减少25%,在移动端的平台支持上也很全面,支持24位RGB色;缺点是资源体积比较大,而且使用的软解效率低下,低端机上有明显卡顿问题。
#### AlphaPlayer
相比于上面提到的几个方案,AlphaPlayer的接入体积极小(只有40KB左右),而且对动画资源的还原程度极高,资源制作时不用考虑特效是否支持的问题,对开发者和设计师都非常友好。通过接入ExoPlayer或者自研播放器可以解决系统播放器在部分机型上可能存在的兼容性问题,且能带来更好的解码性能。
### 运行效果
![demo](./image/demo.gif)
### 基本原理
主要有两个核心,一个是IMediaPlayer,负责视频解码,支持外部自行实现;另一个是VideoRenderer,负责将解析出来的每一帧画面进行透明度混合,再输出到GLTextureView或者GLSurfaceView上。
大致的混合过程可以看下图示例
<img src="./image/introduction.png" alt="introduction" style="zoom:75%;" />
原素材的画面中左边部分使用RGB通道存储了原透明视频的Alpha值,右边部分使用RGB通道存储了原透明视频的RGB值,然后在端上通过OpenGL重新将每个像素点的Alpha值和RGB值进行组合,重新得到ARGB视频画面,实现透明视频的动画效果。
混合过程的详细代码可以见 `frag.sh`和`vertex.sh`,
### 快速接入
#### iOS
##### 添加依赖
`pod 'BDAlphaPlayer'`
##### 初始化View
```objective-c
BDAlphaPlayerMetalView *metalView = [[BDAlphaPlayerMetalView alloc] initWithDelegate:self];
[self.view addSubview:metalView];
```
##### 播放动画视频
```objective-c
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
##### 添加依赖
```kotlin
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.bytedance:AlphaPlayer:1.0.4'
}
```
##### 初始化PlayerController
```kotlin
val config = Configuration(context, lifecycleOwner)
// 支持GLSurfaceView&GLTextureView, 默认使用GLSurfaceView
config.alphaVideoViewType = AlphaVideoViewType.GL_TEXTURE_VIEW
// 也可以设置自行实现的Player, demo中提供了基于ExoPlayer的实现
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
```kotlin
playerController.attachAlphaView(mVideoContainer)
```
##### 播放动画视频
```kotlin
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, portraitSca
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MP4 透明背景 礼物播放库 (169个子文件)
gradlew.bat 2KB
demo.gif 309KB
.gitignore 2KB
.gitignore 208B
.gitignore 38B
.gitignore 7B
.gitignore 7B
.gitkeep 0B
.gitkeep 0B
build.gradle 1KB
build.gradle 1KB
build.gradle 687B
settings.gradle 68B
gradlew 5KB
BDAlphaPlayerMetalView.h 2KB
BDAlphaPlayerDefine.h 1KB
BDAlphaPlayerResourceModel.h 1KB
BDAlphaPlayerAssetReaderOutput.h 1KB
BDAlphaPlayerMetalShaderType.h 925B
BDAlphaPlayerMetalRenderer.h 829B
BDAlphaPlayerMetalConfiguration.h 743B
BDAlphaPlayerResourceInfo.h 636B
BDAlphaPlayerUtility.h 561B
BDAlphaPlayer.h 558B
AppDelegate.h 232B
ViewController.h 171B
gradle-wrapper.jar 53KB
GLTextureView.java 70KB
TextureCropUtil.java 6KB
ShaderUtil.java 3KB
JsonUtil.java 2KB
PermissionUtils.java 1KB
Contents.json 2KB
config.json 137B
config.json 123B
Contents.json 123B
Contents.json 63B
PlayerController.kt 14KB
VideoRenderer.kt 11KB
ExoPlayerImpl.kt 4KB
AlphaVideoGLSurfaceView.kt 4KB
AlphaVideoGLTextureView.kt 4KB
VideoGiftView.kt 3KB
IMediaPlayer.kt 3KB
DefaultSystemPlayer.kt 3KB
MainActivity.kt 3KB
ScaleType.kt 2KB
DataSource.kt 2KB
IRender.kt 1KB
AbsPlayer.kt 1KB
IAlphaVideoView.kt 1KB
IPlayerAction.kt 806B
IMonitor.kt 780B
IPlayerController.kt 757B
ExampleInstrumentedTest.kt 688B
ConfigModel.kt 462B
Configuration.kt 429B
ExampleUnitTest.kt 360B
PlayerState.kt 229B
IPlayerControllerExt.kt 226B
VideoInfo.kt 157B
LICENSE 11KB
Podfile.lock 296B
BDAlphaPlayerMetalRenderer.m 9KB
BDAlphaPlayerUtility.m 8KB
BDAlphaPlayerMetalView.m 6KB
BDAlphaPlayerResourceModel.m 3KB
ViewController.m 3KB
AppDelegate.m 2KB
BDAlphaPlayerMetalConfiguration.m 532B
main.m 448B
BDAlphaPlayerResourceInfo.m 407B
README.md 14KB
bd_shaders.metal 2KB
BDAlphaPlayerAssetReaderOutput.mm 6KB
demo_video.mp4 2.9MB
heartbeats.mp4 1.91MB
.name 16B
project.pbxproj 17KB
Info.plist 2KB
introduction.png 490KB
tools.png 29KB
ic_launcher_round.png 15KB
ic_launcher_round.png 10KB
ic_launcher.png 9KB
ic_launcher_round.png 7KB
hotsoon.png 6KB
ic_launcher.png 6KB
toutiao.png 6KB
xigua.png 6KB
douyin.png 5KB
ic_launcher_round.png 5KB
ic_launcher.png 4KB
ic_launcher.png 3KB
ic_launcher_round.png 3KB
ic_launcher.png 2KB
Podfile 293B
BDAlphaPlayer.podspec 756B
proguard-rules.pro 751B
proguard-rules.pro 751B
共 169 条
- 1
- 2
资源评论
恋兔de木子
- 粉丝: 56
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 官网下载的VSCode和中文语言包, VSCodeUserSetup-x64-1.92.2.exe
- 全国高校计算机能力挑战赛往届真题整理.zip
- HandyDoc:HandyControl 的离线文档
- 202210120219+朱羡彬+软件工程实验一.docx
- C# 工厂模式开发示例,详细展示三种工厂模式
- Python大作业:基于OpenCV模板匹配的数字识别
- AI 绘画工具 Stable Diffusion 的换脸插件ReActor所使用的codeformer.pth 权重文件
- RDC小计的材料等等等等
- 振宇日语·最好用最好记15000日语单词随身背 (李晓东) (Z-Library).epub
- led-tcp-mastc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功