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

关于过渡动画 #13

Closed gofey closed 5 years ago

gofey commented 5 years ago

你好,我很想了解您的自定义过渡动画的实现原理,到底是如何实现的,如果我想自己设置过渡动画样式,又如何实现呢?

vitoziv commented 5 years ago

自定义视频画面转场。实现 VideoTransition 协议,TrackItem 类中可以设置转场,表示这个 TrackItem 和时间顺序的下一个 TrackItem 之间的转场 自定义音频转场。实现 AudioTransition 协议,设置方式同上。

demo

let item1: TrackItem = ...
let item2: TrackItem = ...

// 为 item1 设置转场
let transitionDuration = CMTime(seconds: 2, preferredTimescale: 600)
item1.videoTransition = PushTransition(duration: transitionDuration)
item1.audioTransition = FadeInOutAudioTransition(duration: transitionDuration)

let timeline = Timeline()
timeline.videoChannel = [item1, item2]
timeline.audioChannel = [item1, item2]

try! Timeline.reloadVideoStartTime(providers: timeline.videoChannel)

let compositionGenerator = CompositionGenerator(timeline: timeline)
compositionGenerator.renderSize = CGSize(width: 1920, height: 1080)
let playerItem = compositionGenerator.buildPlayerItem()

简单来说就是两个画面同时显示在画面,然后分别对两个图像进行效果处理。具体可以参考已经实现的几个转场效果,自己写一个试试。

https://github.com/VideoFlint/Cabbage/blob/master/Cabbage/Sources/Core/Model/VideoTransition.swift

gofey commented 5 years ago

设置转场这部分代码我理解,但我疑惑的是您是在哪里对这两个图像进行的处理,您是怎么从视频的timerange获取到的图像,如何将过渡动画应用到视频上的呢?

vitoziv commented 5 years ago
  1. 根据转场时间和视频素材时间排布好时间线。
  2. 真正渲染的时候,根据当前播放时间获取两个图像。
  3. 使用实现了 VideoTransition 的对象对两个图像做转场效果。

具体可以看看源码。