如何使用AVFoundation为您的video添加不同的图像和不同的CMTime

我正在使用AVFoundation在我的电影中加水印。 这与在互联网和苹果公司正在进行的代码运行良好。 但是我不想在完整的时间显示水印,我想在同一部电影中显示不同的水印。

我有一个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]; 

并且用AVComsetExportSession和VideoComposition的属性导出它

这将导致带有完整video水印的video。 我想要实现的是从相机的video与水印的前5秒。 它比消失一段时间,并显示另一个图像(也是一个水印)。

我卡住了……我已经看过WWDC在AVFoundation上的数万亿次的video,但是它缺乏深入的视野。

当我更改指令的时间范围时,它不会导出,因为持续时间(范围)必须与AVAssetTrack的时间范围相同。 我一直试图插入多个指令,但迄今为止没有成功。

AVMutableVideoCompositionLayerInstruction有一个方法[setOpacityRampFromStartOpacity:toEndOpacity:timeRange:],您可以为不同的片段设置(每个layerInstruction不重叠)。 不是最好的解决scheme是创build两个video轨道 – 一个原始video和另一个需要水印和斜坡不透明(只显示某些段的原始和其他水印)。