VideoFlint / Cabbage

A video composition framework build on top of AVFoundation. It's simple to use and easy to extend.
MIT License
1.52k stars 221 forks source link

技术解决方案探讨 #19

Open xhzengAIB opened 5 years ago

xhzengAIB commented 5 years ago

你好!

我们在你的中文说明当中看到以下信息: 对 CALayer 的支持,可以把 CALayer 所支持的所有 CoreAnimation 动画带入到视频画面中。比如使用 Lottie,设计师在 AE 中导出的动画配置,客户端用配置生成 CALayer 类,添加到 AVVideoCompositionCoreAnimationTool 中就可以很方便的实现视频中做贴纸动画的功能。

能否提供1~2个相应使用Lottie导出的动画配置做的视频合成的例子吗?

Jack WeChat:15915895880

vitoziv commented 5 years ago

最近比较忙,没有时间搞这个 demo。

用 AVVideoCompositionCoreAnimationTool 只能离线下使用,如导出、截图的情况。使用 AVPlayerItem 做实时预览需要把 lottie 的 layer 添加到 AVSynchronizedLayer 上,AVSynchronizedLayer 再添加到播放视图上进行预览。

这个方案的实现方式比较蛋疼,渲染和预览需要走两套逻辑,所以我就没在项目里面写。

zhengrush commented 3 years ago

也可以通过继承Resource,然后重写open override func image(at time: CMTime, renderSize: CGSize) -> CIImage?来获取每一帧的画面, Lottie里面有提供方法来获取每一帧的画面

vitoziv commented 3 years ago

继承的 resource 建议放到 Timeline 的 passingThroughVideoCompositionProvider 去过效果,如果是放到 videoChannel 下,会占用轨道资源

zhengrush commented 3 years ago

谢谢大佬回复,我是放在passingThroughVideoCompositionProvider来处理浮层,比如文字,静态图片,动态贴纸,其实你说AVSynchronizedLayer的那种实现方案应该更符合项目的需求,因为在预览的过程中可能会调整layer层的展示效果,比如调整大小,旋转角度之类的

MQZHot commented 3 years ago

也可以通过继承Resource,然后重写open override func image(at time: CMTime, renderSize: CGSize) -> CIImage?来获取每一帧的画面, Lottie里面有提供方法来获取每一帧的画面

Lottie有获取方法么

zhengrush commented 3 years ago

也可以通过继承Resource,然后重写open override func image(at time: CMTime, renderSize: CGSize) -> CIImage?来获取每一帧的画面, Lottie里面有提供方法来获取每一帧的画面

Lottie有获取方法么

要改写下Lottie的代码,通过time计算出动画的progress,然后渲染layer,最后把layer变成CIImage,具体参考https://github.com/lvpengwei/LottieInVideo