ios - 如何在 iOS 中为任何定向视频添加水印?
问题描述
我需要为视频添加水印,但不同方向的视频。当我向纵向视频添加水印时,下面的代码对我有用,但此代码不适用于横向视频,水印变得有压力。
UIImage *myImage;
myImage =[UIImage imageNamed:@"twinbitWaterMark"];
CALayer *layerCa = [CALayer layer];
layerCa.contents = (id)myImage.CGImage;
float newX = videosize.width - imagesize.width;
float newY = videosize.height - imagesize.height;
layerCa.frame = CGRectMake(newX, newY, videosize.width*2, videosize.height*2);
layerCa.opacity = 1.0;
[layerCa setMasksToBounds:YES];
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:layerCa];
composition.animationTool = [AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
请帮忙。
解决方案
在本地保存文件之前,创建一个 CATextLayer 并将其附加到视频。我相信这段代码会帮助你,我为我的应用程序编写的代码。
- (void)applyVideoEffectsToComposition:(AVMutableVideoComposition *)composition size:(CGSize)size
{
NSArray *fieldsArray = overlayFieldsArray;
// 1 - Set up the text layer
CATextLayer *subtitle1Text = [[CATextLayer alloc] init];
subtitle1Text.wrapped=YES;
subtitle1Text.alignmentMode = kCAAlignmentLeft;
[subtitle1Text setFont:@"Helvetica-Bold"];
[subtitle1Text setFontSize:textSize];
[subtitle1Text setFrame:CGRectMake(0, 0, size.width, fieldsArray.count*textSize+20) ];
NSMutableString *layerText = [NSMutableString stringWithCapacity:0];
for(NSDictionary *fieldDictionary in fieldsArray){
[layerText appendFormat:@" %@ :",[[fieldDictionary allKeys] objectAtIndex:0]];
[layerText appendFormat:@" %@ \n",[_candidateDictionary valueForKey:[[fieldDictionary allValues] objectAtIndex:0]]];
}
[subtitle1Text setString:layerText];
[subtitle1Text setForegroundColor:[[UIColor colorForText] CGColor]];
// 2 - The usual overlay
CALayer *overlayLayer = [CALayer layer];
overlayLayer.backgroundColor = [UIColor colorForLayer].CGColor;
overlayLayer.opacity=0.5f;
CGSize maximumSize = CGSizeMake(600, 600);
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:textSize];
CGSize layerTextSize = [layerText sizeWithFont:myFont
constrainedToSize:maximumSize
lineBreakMode:UILineBreakModeWordWrap];
overlayLayer.frame = CGRectMake(10, 0, layerTextSize.width*1.1, fieldsArray.count*textSize+20);
[overlayLayer setMasksToBounds:YES];
[overlayLayer addSublayer:subtitle1Text];
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
parentLayer.frame = CGRectMake(10, 0, layerTextSize.width*1.1, fieldsArray.count*textSize+20);
[parentLayer addSublayer:overlayLayer];
composition.animationTool = [AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
}
推荐阅读
- python - 是否有一种 R 方法可以从 Python 中的函数中检索多个变量?
- reactjs - 上传图片的输入类型不适用于material-ui对话框,如何解决?
- python - 为什么 os.startfile 没有打开请求的文件
- ios - 按升序删除tableView行时删除不正确的tableView行(从下到上)
- python - 将元素列表映射到另一个列表中的元素范围以创建唯一矩阵
- reactjs - ChartJs 功能组件即使在 forceUpdate 时也不刷新
- c++ - 如何修复 Boost::Asio Client Http 请求错误?
- reactjs - 内部带有日期选择器的 Material UI 自动完成不会弹出
- python - torch.float32 与 numpy 的 float32 不同吗?
- mongodb - MONGODB 聚合查询以按元素给出数组字段的 $min 值