如何使用AVAssetWriter将静态和dynamic叠加添加到video?

什么是正确的方式来添加一个图像叠加到AVAssetWriter创build的video?

有可能用AVAssetExportSession这样做,但是这个问题是关于如何用AVAssetWriter这样做的,所以对质量和输出有更多的控制。

有两种情况:

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

2)复杂:添加不同的覆盖,在不同的时间进出video(类似于使用AVVideoCompositionCoreAnimationTool)。

有很多不同的方法,正确的答案将取决于你的用例是什么。

高层次,这里有三种方法:

  1. 您似乎已经熟悉AVVideoCompositionCoreAnimationTool。 你可以在AVAssetWriter中使用它。 查看https://github.com/rs/SDAVAssetExportSession这是一个替代AVAssetExportSession,允许您传递您正在寻找的AVAssetWriter设置(因为它在内部使用AVAssetWriter)的下降。
  2. 如果你想像水印一样的东西组合到现场video中(就像在这个问题中一样) 模拟AVLayerVideoGravityResizeAspectFill:裁剪和中心video模仿预览,而不会失去清晰度 ),那么你实际上可以修改AVCaptureVideoDataOutputSampleBufferDelegate传递给captureOutput函数的采样缓冲区。 这里的典型方法是将CMSampleBuffer转换为CIImage,然后做任何你喜欢的操作,最后把CIImage BACK转换成一个CMSampleBuffer并写出来。 在链接的问题,CMSampleBuffer只是简单地传递,没有任何操纵。 NB从CIImage到CMSampleBuffer的步骤相对较低,但是在StackOverflow上有很多例子,尽pipe在Swift中并不多。 这里有一个实现(对OSX来说)然后用AVFoundation(OSX ) 添加filter到video – 我怎么把结果图像写回AVWriter?
  3. 具体取决于你需要做的是多么复杂,你可以通过创build一个符合https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVVideoCompositing_Protocol/的类实现自己的自定义合成器并在AVVideoComposition中引用。 这是复杂的(可能)矫枉过正 – 如果你不知道为什么你需要这样做,那么你可能不需要一个 。 如果您开始努力解决“我怎么能在video中的不同轨道上有多个animation层,而不是全部在一个轨道上”,或者“我怎样在图像帧内旋转,缩放和animation移动video – 就像旋转的宝丽来在video在框架中播放“…这是你需要看的东西。

如果你需要更多的信息,那么如果你对你要做的事情做一些澄清,我可以扩展这个答案,在适当的方法上增加更多的细节。