在做iOS視頻相關(guān)的開發(fā)的時(shí)候咽斧,遇到了一點(diǎn)點(diǎn)坑注整。
iOS視頻添加水印篷牌,你首先會(huì)想到使用 animationTool?, 蘋果官方是這樣寫的
A video composition describes, for any time in the aggregate time range of its instructions, the number and IDs of video tracks that are to be used in order to produce a composed video frame corresponding to that time. When AV Foundation’s built-in video compositor is used, the instructions an AVVideoComposition comprises can specify a spatial transformation, an opacity value, and a cropping rectangle for each video source, and these can vary over time via simple linear ramping functions.
然后就按照步驟實(shí)現(xiàn)就可以了
// 1 - set up the overlay
CALayer *overlayLayer = [CALayer layer];
[overlayLayer setContents:(id)[image CGImage]];
overlayLayer.frame = CGRectMake(0, 0, size.width, size.height);
[overlayLayer setMasksToBounds:YES];
// 2 - set up the parent layer
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:overlayLayer];
// 3 - apply magic
composition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer
但是在iOS 10下發(fā)現(xiàn)绒北,有時(shí)候這個(gè)方法導(dǎo)出的視頻不能立即播放替蔬,要等一會(huì)兒視頻才能播放艺晴,于是就使用了下面的這個(gè)接口
CIFilter *watermarkFilter = [CIFilter filterWithName:@"CISourceOverCompositing"];
mainVideoComposition= [AVMutableVideoComposition videoCompositionWithAsset:mixComposition applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) {
CIImage *watermarkImage? =? [[CIImage alloc] initWithCGImage:image.CGImage];
CIImage *source = request.sourceImage;
[watermarkFilter setValue:source forKey:kCIInputBackgroundImageKey];
[watermarkFilter setValue:[watermarkImage imageByApplyingTransform:CGAffineTransformMakeScale(source.extent.size.width/watermarkImage.extent.size.width, source.extent.size.height/watermarkImage.extent.size.height)] forKey:kCIInputImageKey];
[request finishWithImage:watermarkFilter.outputImage context:nil];
}];