iphone - 如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTime 的水印

标签 iphone ios objective-c avfoundation

我正在使用 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,然后添加到另一个层以与 animationTool 合并:

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 vid 数万亿次,但它缺乏深度。

当我更改指令的 timeRange 时,它​​不会导出,因为持续时间(范围)必须与 AVAssetTrack 的持续时间相同。我一直在尝试插入多条指令,但到目前为止没有成功。

最佳答案

AVMutableVideoCompositionLayerInstruction 有一个方法 [setOpacityRampFromStartOpacity: toEndOpacity: timeRange:],你可以为不同的片段设置它(每个 layerInstruction 不重叠)。不是最好的解决方案是创建两个视频轨道 - 一个是原始视频,另一个是在需要时带有水印和渐变不透明度(在某些片段上仅显示原始视频,而在其他片段上显示带有水印)。

关于iphone - 如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTime 的水印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166433/

相关文章:

c++ - 将 OpenGL 基元转换为 OpenGLES

objective-c - 无法从我的 Info.plist 文件中获取多个键数组

ios - 在 Storyboard 中更改 iphone 4 和 iphone 5 之间的背景图像?

iphone - NSUserDefaults - 存储基本设置

ios - 向方法添加@objc 标志时出现 Xcode 编译器错误

iphone - 如何从 Mac 上的终端检查 iPhone 是否越狱?

ios - Objective-C ARC : strong vs retain and weak vs assign

ios - NSDate从字符串错误转换

iphone - 小视频播放

iphone - 如何处理用户数据在不同时间到达的多个推送通知?