如何使用叠加视图录制视频

时间:2014-07-01 06:53:36

标签: ios overlay avfoundation video-processing camera-overlay

您好我正在尝试使用叠加效果录制视频。

我写道:

-(void)addOvelayViewToVideo:(NSURL *)videoURL

在录制的视频上添加叠加视图但不起作用。

我使用viewDidLoad编写了使用AVCaptureSession//In ViewDidLoad //CONFIGURE DISPLAY OUTPUT self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; [self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; self.previewLayer.frame = self.view.frame; [self.view.layer addSublayer:self.previewLayer]; -(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { if(error.code != noErr) { id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey]; if(value) { isSuccess = [value boolValue]; } } if(isSuccess) { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; if([assetsLibrary videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) { [self addOverviewToVideo:outputFileURL]; } else{ NSLog(@"could not saved to photos album."); } } } -(void)addOvelayViewToVideo:(NSURL *)videoURL { AVAsset *asset = [AVAsset assetWithURL:videoURL]; AVMutableComposition *composition = [[AVMutableComposition alloc] init]; AVMutableCompositionTrack *compositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; [compositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; AVMutableVideoCompositionInstruction *compositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; compositionInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); AVMutableVideoCompositionLayerInstruction *videoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionTrack]; AVAssetTrack *assetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; UIImageOrientation videoAssetOrientation_ = UIImageOrientationUp; BOOL isVideoAssetPortrait_ = NO; CGAffineTransform videoTransform = assetTrack.preferredTransform; if (videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) { videoAssetOrientation_ = UIImageOrientationRight; isVideoAssetPortrait_ = YES; } if (videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) { videoAssetOrientation_ = UIImageOrientationLeft; isVideoAssetPortrait_ = YES; } if (videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0) { videoAssetOrientation_ = UIImageOrientationUp; } if (videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0) { videoAssetOrientation_ = UIImageOrientationDown; } [videoLayerInstruction setTransform:assetTrack.preferredTransform atTime:kCMTimeZero]; [videoLayerInstruction setOpacity:0.0 atTime:asset.duration]; compositionInstruction.layerInstructions = [NSArray arrayWithObject:videoLayerInstruction]; AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; CGSize naturalSize = CGSizeMake(assetTrack.naturalSize.height, assetTrack.naturalSize.width); float renderWidth, renderHeight; renderWidth = naturalSize.width; renderHeight = naturalSize.height; videoComposition.renderSize = CGSizeMake(renderWidth, renderHeight); videoComposition.instructions = [NSArray arrayWithObject:compositionInstruction]; videoComposition.frameDuration = CMTimeMake(1, 30); CALayer *overlayLayer = [CALayer layer]; UIImage *overlayImage = [UIImage imageNamed:@"sampleHUD"]; [overlayLayer setContents:(id)[overlayImage CGImage]]; overlayLayer.frame = CGRectMake(0, 0, naturalSize.width, naturalSize.height); [overlayLayer setMasksToBounds:YES]; CALayer *parentLayer = [CALayer layer]; CALayer *videoLayer = [CALayer layer]; parentLayer.frame = CGRectMake(0, 0, naturalSize.width, naturalSize.height); videoLayer.frame = CGRectMake(0, 0, naturalSize.width, naturalSize.height); [parentLayer addSublayer:videoLayer]; [parentLayer addSublayer:overlayLayer]; videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; NSLog(@"renderSize:%f,%f", videoComposition.renderSize.width, videoComposition.renderSize.height); AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; exportSession.outputURL = videoURL; exportSession.outputFileType = AVFileTypeQuickTimeMovie; exportSession.shouldOptimizeForNetworkUse = YES; exportSession.videoComposition = videoComposition; [exportSession exportAsynchronouslyWithCompletionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ //save the video in photos album }); }]; } 中录制视频的代码。

{{1}}

我仍然无法弄清楚这里出了什么问题。需要有关此的指导。

录制视频时可以添加叠加效果吗?

任何帮助将不胜感激。

0 个答案:

没有答案