如何使用AVAssetWriter为视频添加静态和动态叠加层?

时间:2016-02-15 22:12:40

标签: ios avfoundation avassetwriter

将图像叠加层添加到使用AVAssetWriter创建的视频的正确方法是什么?

使用AVAssetExportSession可以这样做,但是这个问题是关于如何使用AVAssetWriter这样做,因此可以更好地控制质量和输出。

有两种情况:

1)简单:添加在视频的整个持续时间内出现的单个叠加层(类似于水印)。

2)复杂:添加不同的叠加层,在不同时间为视频设置动画效果(类似于使用AVVideoCompositionCoreAnimationTool)。

1 个答案:

答案 0 :(得分:6)

对此有很多不同的方法,正确的答案将取决于您的用例。

在较高的层面上,这里有三种方法:

  1. 您似乎已经熟悉AVVideoCompositionCoreAnimationTool。您可以将其与AVAssetWriter一起使用。查看https://github.com/rs/SDAVAssetExportSession这是AVAssetExportSession的替代品,它允许您传递您正在寻找的AVAssetWriter设置(因为它在内部使用AVAssetWriter)。
  2. 如果您想将类似WaterMark的内容合成到实时视频中(如此问题Simulate AVLayerVideoGravityResizeAspectFill: crop and center video to mimic preview without losing sharpness),那么您实际上可以修改AVCaptureVideoDataOutputSampleBufferDelegate传递给captureOutput函数的样本缓冲区。这里的典型方法是将CMSampleBuffer转换为CIImage,然后执行您喜欢的任何操作,最后将CIImage BACK转换为CMSampleBuffer并将其写出来。在链接的问题中,CMSampleBuffer只是在没有任何操作的情况下传递。 NB从CIImage回到CMSampleBuffer的步骤相对较低,但StackOverflow上有很多例子,尽管在Swift中并不多。这是一个实现(但对于OSX)Adding filters to video with AVFoundation (OSX) - how do I write the resulting image back to AVWriter?
  3. 根据您需要做的复杂情况,您可以通过创建符合https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVVideoCompositing_Protocol/的类并在AVVideoComposition中引用来实现自己的自定义合成器。这很复杂且(可能)过度 - 如果您不知道为什么需要这样做,那么可能不需要一个。如果您开始挣扎于“如何在视频中的不同轨道上创建多个动画层而不是在一条轨道上”或“如何在图像帧中旋转,缩放和动画移动视频 - 就像旋转的宝丽来”之类的问题当视频在框架中播放时“......这就是你需要研究的内容。
  4. 如果您需要更多信息,那么如果您对要尝试的内容添加一些说明,我可以扩展此答案以添加有关适当方法的更多详细信息。