iOS 录制视频时,添加水印
iOS 录制视频时,添加水印
AVAsset:素材库里的素材;AVAssetTrack:素材的轨道;AVMutableComposition:一个用来合成视频的工程文件;AVMutableCompositionTrack:工程文件中的轨道,有音频轨、视频轨等,里面可以插入各种对应的素材;AVMutableVideoCompositionLayerInstruction:视频轨道中的一个视频,可以缩放、旋转等;AVMutableVideoCompositionInstruction:一个视频轨道,包含了这个轨道上的所有视频素材;AVMutableVideoComposition:管理所有视频轨道,可以决定最终视频的尺寸,裁剪需要在这里进行;AVAssetExportSession:配置渲染参数并渲染。复制代码
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {NSLog(@"开始触摸");if ([[touches anyObject] view] == self.progressView) {if (!self.capture) { // 表示是否正在录制double delayInSeconds = 0.5; // 长按0.5s触发录制事件dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));dispatch_after(popTime, dispatch_get_main_queue(), ^(void){[self startCapture]; // 开始录制});}else {[self startCapture];}}}复制代码
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(LongPressProgressView:)];longPress.minimumPressDuration = 0.5;[progressView addGestureRecognizer:longPress];复制代码
- (void)LongPressProgressView:(UILongPressGestureRecognizer *)gestureRecognizer {if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {[self startCapture];}else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {if ([self.mediaCaptureDelegate respondsToSelector:@selector(stopCapture)]) {self.capture = NO;self.bgView.hidden = YES;[self.mediaCaptureDelegate stopCapture];[self.progressView clearProgress];}}}复制代码
CALayer *imgLayer = [CALayer layer];imgLayer.contents = (id)img.CGImage;imgLayer.frame = CGRectMake(0, 0, size.width, size.height);复制代码
//把文字和图标都添加到layerCALayer *overlayLayer = [CALayer layer];[overlayLayer addSublayer:imgLayer];overlayLayer.frame = CGRectMake(0, 0, size.width, size.height);[overlayLayer setMasksToBounds:YES];[overlayLayer addSublayer:imgLayer];CALayer *parentLayer = [CALayer layer];CALayer *videoLayer = [CALayer layer];parentLayer.frame = CGRectMake(0, 0, size.width, size.height);parentLayer.backgroundColor = [UIColor redColor].CGColor;videoLayer.frame = CGRectMake(0, 0, size.width, size.height);[parentLayer addSublayer:videoLayer];[parentLayer addSublayer:overlayLayer];composition.animationTool = [AVVideoCompositionCoreAnimationToolvideoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];复制代码
__block NSString *createdAssetID =nil;//唯一标识,可以用于图片资源获取NSError *error =nil;[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{createdAssetID = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;} error:&error];复制代码
NSString *path = [SNSImageEngine getRealHouseVideoPathWithVideoPath:videoPath];if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(path)) {UISaveVideoAtPathToSavedPhotosAlbum(path , self, @selector(video:didFinishSavingWithError:contextInfo:), nil);}else {[MBProgressHUD showMessage:@"保存失败"];}// 视频保存回调- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {if (error == nil) {[MBProgressHUD showMessage:@"已保存至手机"];}else {[MBProgressHUD showMessage:@"保存失败"];}}复制代码
[[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{PHAssetChangeRequest *changeAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];PHAssetCollection *targetCollection = [[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]lastObject];PHAssetCollectionChangeRequest *changeCollectionRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:targetCollection];PHObjectPlaceholder *assetPlaceholder = [changeAssetRequest placeholderForCreatedAsset];[changeCollectionRequest addAssets:@[assetPlaceholder]];} completionHandler:^(BOOL success,NSError * _Nullable error) {NSLog(@"finished adding");}];复制代码
问题所在:AVCaptureMovieFileOutput他有默认的时间限制,默认值是 10 秒
更改办法:设置 AVCaptureMovieFileOutput 的 movieFragmentInterval 属性为 kCMTimeInvalid,视频录制就不会受到限制
-(AVCaptureMovieFileOutput *)movieFileOutput{if (!_movieFileOutput) {_movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];/* 默认的录制视频时间是10秒,如果视频大于10秒必须禁用他,否则录制的视频将会没有声音*/_movieFileOutput.movieFragmentInterval = kCMTimeInvalid;}return _movieFileOutput;}复制代码