目前,我正在处理一个处理视频的应用程序.
在我的应用程序中,用户可以修剪视频,我有一个自定义控件来选择开始时间和结束时间.我需要通过这两个值修剪视频.我试过UIVideoEditorController如下.
在我的应用程序中,用户可以修剪视频,我有一个自定义控件来选择开始时间和结束时间.我需要通过这两个值修剪视频.我试过UIVideoEditorController如下.
UIVideoEditorController* videoEditor = [[[UIVideoEditorController alloc] init] autorelease]; videoEditor.delegate = self; NSString* videoPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"MOV"]; if ( [UIVideoEditorController canEditVideoAtPath:videoPath] ) { videoEditor.videoPath = videoPath; [self presentModalViewController:videoEditor animated:YES]; } else { NSLog( @"can't edit video at %@",videoPath ); }
但是问题是上面的代码将显示苹果的视频编辑器控件,用户可以对该视图进行一些操作.我不想显示此视图,因为我已经在MPMoviePlayer上显示了视频,并收到用户输入(开始时间和结束时间)以修改自定义控件上的视频.
如何在不显示UIVideoEditorController的情况下修剪视频?
解决方法
最后我找到了解决方案.
我们可以使用AVAssetExportSession修剪视频而不显示UIVideoEditorController.
我的代码如下:
- (void)splitVideo:(NSString *)outputURL { @try { NSString *videoBundleURL = [[NSBundle mainBundle] pathForResource:@"Video_Album" ofType:@"mp4"]; AVAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoBundleURL] options:nil]; NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:asset]; if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) { [self trimVideo:outputURL assetObject:asset]; } videoBundleURL = nil; [asset release]; asset = nil; compatiblePresets = nil; } @catch (NSException * e) { NSLog(@"Exception Name:%@ Reason:%@",[e name],[e reason]); } }
该方法修剪视频
- (void)trimVideo:(NSString *)outputURL assetObject:(AVAsset *)asset { @try { AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:asset presetName:AVAssetExportPresetLowQuality]; exportSession.outputURL = [NSURL fileURLWithPath:outputURL]; exportSession.outputFileType = AVFileTypeQuickTimeMovie; CMTime start = CMTimeMakeWithSeconds(splitedDetails.startTime,1); CMTime duration = CMTimeMakeWithSeconds((splitedDetails.stopTime - splitedDetails.startTime),1); CMTimeRange range = CMTimeRangeMake(start,duration); exportSession.timeRange = range; exportSession.outputFileType = AVFileTypeQuickTimeMovie; [self checkExportSessionStatus:exportSession]; [exportSession release]; exportSession = nil; } @catch (NSException * e) { NSLog(@"Exception Name:%@ Reason:%@",[e reason]); } }
此方法检查修剪的状态:
- (void)checkExportSessionStatus:(AVAssetExportSession *)exportSession { [exportSession exportAsynchronouslyWithCompletionHandler:^(void) { switch ([exportSession status]) { case AVAssetExportSessionStatusCompleted: NSLog(@"Export Completed"); break; case AVAssetExportSessionStatusFailed: NSLog(@"Error in exporting"); break; default: break; } }]; }