补一下上一篇文章中的视频动画。
上文://www.greatytc.com/p/fe3caca8a220
- AVMutableComposition会在最终合成的时候需要制定目标视频文件的宽高,那么hack思路就来了,如果我的AVasset的源视频大小和目标文件的大小不一样,我是不是可以只截取/显示源视频的一部分。
- 当前IOS版本不能直接访问AVasset所指向的源视频的宽高,不过可以变通:
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #00b1ff}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s3 {font-variant-ligatures: no-common-ligatures; color: #8b87ff}
AVAssetTrack * curTrack = [[curAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
由curTrack.naturalSize来获取到视频的真实宽高。
- 假设我创建了track1,track2来合成视频,对应于layer1,layer2,并且track1和2从开始到结束都是有画面的。那么所谓的videoAnimation其实就是layer的动画。
layer的可变属性有opacity,CGAffineTransform,CropRectangle
opacity,对用的方法
transform则对应一下方法
而所谓的CropRectangle指的是源视频的可见区域
仔细体味下上述三个可变属性,那么简单的视频动画也就出来了:
比如在特定的时间点将track1的透明度设置为0,而将track2的透明度设置为1,同时赋值一个小的时间段,也就有了淡入淡出的效果;
再比如适当的设置transform,可以使得两个不同的track并列显示或者重叠显示;
视窗那个属性比较有趣,大家有兴趣可以用我在上一篇文章中提到的代码试一试。
总结下关于直接使用AVMutableVideoCompositionLayerInstruction来构建视频动画的缺点:
- 在最初的时候我犯过的错误,如果我是简单补个水印(动态),而给目标视频加一个track-layer,还需要按照时间去计算变换的时间点,其实非常不值得。
- 上述的layer很多属性都无法修改,也就导致了可见区域始终是边角分明的,无法出现圆角之类的。
- 视频的最底层背景色为黑色,如果最底下的那个源视频没有覆盖整个屏幕,那么变换的过程会很丑。
- 所以上述的一些方法其实最适合的场景就是加一个静态的水印或者补一行文字什么的。
明天继续写,关于如何比较有效率的在视频中加入图片,并且动态的显示图片的思路。