2013-10-31 17 views
2

我想从多个图像创建视频并在图像之间添加交叉消解效果。添加交叉消解效果 - 创建iOS视频

这怎么办?我知道图像可以写入视频文件,但我看不到应用效果的位置。应该将每幅图像转换为视频,然后将视频写入带有过渡效果的填充视频中?

我已经四处搜索,无法找到有关如何完成这方面的许多信息,例如,如何使用AVMutableComposition以及如果可以创建包含单个图像的视频,然后应用交叉消解效果。

任何信息将不胜感激。

回答

2

如果你想在AVFoundation的这种情况的肠子周围挖,我强烈建议你take a look at this presentation, especially starting at slide 74准备做大量的工作,拉这一关......

如果您想获得业务要快好几个数量级,而且不介意加入第三方库,我会很高兴recommend you try GPUImage

你会发现把图像压入视频并随意交换出来很简单,就像以及将任意数量的混合滤波器应用于转换,只需在转换发生的时候改变混合滤波器的单个混合属性即可。

+0

谢谢瑞安。这些幻灯片几乎是我在它上面找到的唯一信息,看起来好像还有很多信息缺失,无法完全理解它。我实际上在这个应用程序中使用GPUImage来将滤镜应用于图像,但我从不知道视频的过渡效果。如何在录制视频时使用混合滤镜? – jarryd

+0

我会将两个不同的GPUImagePicture送入您的混合(GPUImageDissolveBlend也许?),然后设置一个NSTimer,每隔0.1秒钟滴答一次,并在每个滴答上增加/减少混合过滤器的.mix属性。我还会回收GPUImagePicture对象并根据需要更换它们的图像,而不是每次都设置并拆除新的GPUImagePictures。这会招致一点addTarget/removeTarget startProcessing/stop舞蹈,但应该感觉用户无缝。 –

+0

哦,你会在你的界面中同时定位一个GPUImageView,并且你的dissolveBlend过滤器会同时定位一个GPUImageMovieWriter。然后您可以同时获得用户回放和录制文件。如果遇到任何障碍,请随意私下ping我。联系信息在ryancumley dot com –

2

我目前正在执行此操作。为了简化:您需要一个AVPlayer,您可以将其放置为空的AVPlayerItem。然后,您需要将AVPlayerItemforwardPlaybackEndTime设置为动画的持续时间。然后,您创建一个AVPlayerLayer,通过AVPlayer启动。 (其实你可能不需要AVPlayerLayer,如果你不会把视频放入你的动画中,那么重要的一点是,你创建一个AVSynchronizedLayer,你以前的AVPlayerItem,这个AVSynchronizedLayer和它所拥有的任何子图层将与你的AVPlayerItem同步。然后,您可以创建一些简单的CALayer(通过contents属性并将您的CAKeyframeAnimation添加到opacity属性中的图层上,现在这些子图层上的任何动画都将按照您的AVPlayerItem的时间开始动画,只需致电play即可您的AVPlayer。这是播放的理论。如果你想导出这个动画在MP4中,你将需要使用AVVideoCompositionCoreAnimationTool,但它非常相似。

代码示例请参阅code snippet to create animation

+0

感谢尼古拉斯,我已经制定了一个更简单的方式来显示使用UIView + transitionFromView:toView:duration:options:completion:我再看看AVVideoCompositionCoreAnimationTool,但可能会像Ryan提到的那样使用GPUImage。 – jarryd

+0

@NicolasManzini forwardPlaybackEndTime不起作用,它是否适合你 – onmyway133

+0

事实上,它不适用于AVSynchronizedLayer,你需要有一个具有动画所需持续时间的播放器项目,否则它将不会移动。 –