添加依赖
pod'BDAlphaPlayer'初始化View
BDAlphaPlayerMetalView*metalView=[[BDAlphaPlayerMetalViewalloc]initWithDelegate:self];[self.viewaddSubview:metalView];播放动画视频
BDAlphaPlayerMetalConfiguration*configuration=[BDAlphaPlayerMetalConfigurationdefaultConfiguration];NSString*testResourcePath=[[[NSBundlemainBundle]bundlePath]stringByAppendingPathComponent:@"TestResource"];NSString*directory=[testResourcePathstringByAppendingPathComponent:@"heartbeats"];configuration.directory=directory;configuration.renderSuperViewFrame=self.view.frame;configuration.orientation=BDAlphaPlayerOrientationPortrait;[self.metalViewplayWithMetalConfiguration:configuration];Android添加依赖
allprojects{repositories{...maven{url'https://jitpack.io'}}}dependencies{implementation'com.github.bytedance:AlphaPlayer:1.0.4'}初始化PlayerController
valconfig=Configuration(context,lifecycleOwner)//支持GLSurfaceView&GLTextureView,默认使用GLSurfaceViewconfig.alphaVideoViewType=AlphaVideoViewType.GL_TEXTURE_VIEW//也可以设置自行实现的Player,demo中提供了基于ExoPlayer的实现valplayerController=PlayerController.get(config,DefaultSystemPlayer())playerController.setPlayerAction(object:IPlayerAction{overridefunonVideoSizeChanged(videoWidth:Int,videoHeight:Int,scaleType:ScaleType){}overridefunstartAction(){}overridefunendAction(){}})playController.setMonitor(object:IMonitor{overridefunmonitor(result:Boolean,playType:String,what:Int,extra:Int,errorInfo:String){}})将PlayerController绑定到ViewGroup
playerController.attachAlphaView(mVideoContainer)播放动画视频
funstartVideoAnimation(){valbaseDir="yourvideofilebasedir"valportraitFileName="portrait.mp4"valportraitScaleType=2vallandscapeFileName="landscape.mp4"vallandscapeScaleType=2valdataSource=DataSource().setBaseDir(baseDir).setPortraitPath(portraitFileName,portraitScaleType).setLandscapePath(landscapeFileName,landscapeScaleType).setLooping(false)//可设置该视频是否循环播放if(dataSource.isValid()){playerController.start(dataSource)}}资源释放
funreleasePlayerController(){playerController.detachAlphaView(mVideoContainer)playerController.release()}GLSurfaceView&GLTextureViewSurfaceView和TextureView都是用来显示视频画面的,主要差异在于性能和层级,SurfaceView的性能要优于TextureView,但是层级限制在最顶层,TextureView则没有层级限制。可以通过如下方式指定alphaVideoViewType来设置。valconfig=Configuration(context,lifecycleOwner)//支持GLSurfaceView&GLTextureView,默认使用GLSurfaceViewconfig.alphaVideoViewType=AlphaVideoViewType.GL_TEXTURE_VIEWvalplayerController=PlayerController.get(config,DefaultSystemPlayer())高级特性动画对齐方式为了解决不同屏幕尺寸的兼容问题和支持半屏动画视频的指定位置播放,我们提供了多种视频裁剪对齐方式,详细可见ScaleType.kt/BDAlphaPlayerDefine.h。对齐模式描述ScaleToFill拉伸铺满全屏ScaleAspectFitCenter等比例缩放对齐全屏,居中,屏幕多余部分留空ScaleAspectFill等比例缩放铺满全屏,居中,裁剪视频多余部分TopFill等比例缩放铺满全屏,顶部对齐BottomFill等比例缩放铺满全屏,底部对齐LeftFill等比例缩放铺满全屏,左边对齐RightFill等比例缩放铺满全屏,右边对齐TopFit等比例缩放至屏幕宽度,顶部对齐,底部留空BottomFit等比例缩放至屏幕宽度,底部对齐,顶部留空LeftFit等比例缩放至屏幕高度,左边对齐,右边留空RightFit等比例缩放至屏幕高度,右边对齐,左边留空提供多种动画对齐方式的目的有二:一是需要对不同屏幕尺寸的设备进行兼容;二是希望尽量减少屏幕中视频动画的渲染区域(这对GPU功耗有线性收益),所以如果局部渲染可以满足动画表现需求,建议尽量使用局部渲染,即减少mVideoContainer的布局大小。Alpha通道压缩方案为了进一步减少视频动画文件的体积,我们做了很多方向的尝试,包括透明画面像素点冗余channel的复用和整体尺寸压缩,可以期待后续更新。GLSurfaceView&GLTextureViewSurfaceView和TextureView都是用来显示视频画面的,主要差异在于性能和层级,SurfaceView的性能要优于TextureView,但是层级限制在最顶层,TextureView则没有层级限制。可以通过如下方式指定alphaVideoViewType来设置。valconfig=Configuration(context,lifecycleOwner)//支持GLSurfaceView&GLTextureView,默认使用GLSurfaceViewconfig.alphaVideoViewType=AlphaVideoViewType.GL_TEXTURE_VIEWvalplayerController=PlayerController.get(config,DefaultSystemPlayer())素材制作工具素材制作的方式有两种:一种是直接使用AE导出成品素材,大致流程就是后期在AE上完成动画效果后,分离出Alpha通道视频,然后在同一个AE合成里左边带Alpha通道后边带正常动画,一起渲染导出。如果还是不理解,还是让设计师去代劳吧,专业的人做专业的事。第二种方式,在AE上完成动画后期效果后,直接输出视频序列帧,然后使用我们提供的素材制作脚本 convertAlphaVideo.py 进行处理也可以直接得出成品素材视频,脚本的大致原理如下:素材制作工具素材制作的方式有两种:一种是直接使用AE导出成品素材,大致流程就是后期在AE上完成动画效果后,分离出Alpha通道视频,然后在同一个AE合成里左边带Alpha通道后边带正常动画,一起渲染导出。如果还是不理解,还是让设计师去代劳吧,专业的人做专业的事。第二种方式,在AE上完成动画后期效果后,直接输出视频序列帧,然后使用我们提供的素材制作脚本 convertAlphaVideo.py 进行处理也可以直接得出成品素材视频,脚本的大致原理如下:可以看到通道分离和画面拼接是基于ffmpeg和ImageMagick两套工具实现的,所以运行前需要先配置ffmpeg和ImageMagick的环境。执行下面命令,等待成品素材生成。pythonconvertAlphaVideo.py--dir'yourpicturesparentfilepath'
评论