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

Cra*_*lot 5 avfoundation ios avassetwriter

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

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

有两种情况:

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

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

Tim*_*ull 6

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

从较高的层面来看,这里有三种方法:

  1. 您似乎已经熟悉AVVideoCompositionCoreAnimationTool.您可以将其与AVAssetWriter一起使用.查看https://github.com/rs/SDAVAssetExportSession,这是AVAssetExportSession的替代品,它允许您传递您正在寻找的AVAssetWriter设置(因为它在内部使用AVAssetWriter).
  2. 如果你想将像WaterMark这样的东西合成到实时视频中(比如在这个问题中模拟AVLayerVideoGravityResizeAspectFill:裁剪和居中视频以模仿预览而不会失去清晰度),那么你实际上可以修改由AVCaptureVideoDataOutputSampleBufferDelegate传递给captureOutput函数的样本缓冲区.这里的典型方法是将CMSampleBuffer转换为CIImage,然后执行您喜欢的任何操作,最后将CIImage BACK转换为CMSampleBuffer并将其写出来.在链接的问题中,CMSampleBuffer只是在没有任何操作的情况下传递.NB从CIImage回到CMSampleBuffer的步骤相对较低,但StackOverflow上有很多例子,尽管在Swift中并不多.这是一个实现(但对于OSX)使用AVFoundation(OSX)向视频添加过滤器 - 如何将生成的图像写回AVWriter?
  3. 根据您需要做的复杂情况,您可以通过创建符合https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVVideoCompositing_Protocol/的类来实现您自己的自定义合成器.并在AVVideoComposition中引用.这很复杂且(可能)过度 - 如果你不知道为什么需要这样做,那么你可能不需要一个.如果您开始挣扎于"如何在视频中的不同轨道上创建多个动画层而不是在一条轨道上"或"如何在图像帧中旋转,缩放和动画移动视频 - 就像旋转的宝丽来"之类的问题当视频在框架中播放时"......这就是你需要研究的内容.

如果您需要更多信息,那么如果您对要尝试的内容添加一些说明,我可以扩展此答案以添加有关适当方法的更多详细信息.