如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTimes 的水印
Posted
技术标签:
【中文标题】如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTimes 的水印【英文标题】:How to watermark your video with different images and different CMTimes using AVFoundation 【发布时间】:2013-04-16 11:53:36 【问题描述】:我正在使用 AVFoundation 在我的电影中添加水印。这适用于互联网和 Apple 上流传的代码。但我不想完整显示水印,我想在同一部电影中显示不同的水印。
我有一个 AVAsset:
NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"MOV"];
NSURL *url = [[NSURL alloc] initFileURLWithPath: path];
avasset_camera = [AVAsset assetWithURL:url];
AVMutableComposition:
AVMutableComposition *mix = [AVMutableComposition composition];
将 UIImage 转换为 CALayer,然后添加到另一个层以与动画工具合并:
UIImage *myImage = [UIImage imageNamed:@"watermark.png"];
CALayer *aLayer = [CALayer layer];
aLayer.contents = (id)myImage.CGImage;
aLayer.frame = CGRectMake(0, 0, 568, 320);
aLayer.opacity = 1.0;
CGSize videoSize = [avasset_camera naturalSize];
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height);
videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:aLayer];
比 AVMutableVideoComposition:
AVMutableVideoComposition* videoComp = [[AVMutableVideoComposition videoComposition] retain];
videoComp.renderSize = videoSize;
videoComp.frameDuration = CMTimeMake(1, 30);
AVVideoCompositionCoreAnimationTool *animationVideoTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
videoComp.animationTool = animationVideoTool;
VideoComposition的说明:
AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, avasset_camera.duration);
以及图层的说明:
AVAssetTrack *videoTrack = [[mix tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
videoComp.instructions = [NSArray arrayWithObject: instruction];
然后使用带有 VideoComposition 属性的 AVAssetExportSession 导出它
这将生成带有完整视频水印的视频。我想要实现的是来自相机的视频,前 5 秒带有水印。它会消失一段时间,然后显示另一个图像(也是水印)。
我被困住了...我已经在 AVFoundation 上观看了 WWDC 视频数万亿次,但它缺乏深入的视野。
当我更改指令的 timeRange 时,它不会导出,因为持续时间(范围)必须与 AVAssetTrack 的持续时间(范围)相同。我一直在尝试插入多条指令,但到目前为止没有成功。
【问题讨论】:
您找到解决方案了吗?我也面临同样的问题。 【参考方案1】:AVMutableVideoCompositionLayerInstruction 有一个方法 [setOpacityRampFromStartOpacity: toEndOpacity: timeRange:] 可以为不同的段设置(每个 layerInstruction 不重叠)。最好的解决方案不是创建两个视频轨道 - 一个原始视频,另一个在需要时带有水印和渐变不透明度(仅在某些片段上显示原始视频,在其他片段上显示水印)。
【讨论】:
要去试试这个。我已经有了制作两部电影并将它们与不透明度放在一起的想法。但这只是一个不同的水印有点复杂:-) 感谢您的回复以上是关于如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTimes 的水印的主要内容,如果未能解决你的问题,请参考以下文章
使用 AVFoundation / QTKit 一次录制多个视频
Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音