如何使用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和另一个需要水印和斜坡不透明(只显示某些段的原始和其他水印)。