Mid*_* MP 12 video xcode ios 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 );
}
Run Code Online (Sandbox Code Playgroud)
但问题是上面的代码会显示苹果的视频编辑器控件,用户可以对该视图进行一些操作.我不想显示此视图,因为我已经显示了视频MPMoviePlayer并接收了用户输入(开始时间和结束时间)以在自定义控件上修剪视频.如何在不显示视频的情况下修剪视频UIVideoEditorController?
Mid*_* MP 17
最后我找到了解决方案.
我们可以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]);
}
}
Run Code Online (Sandbox Code Playgroud)
此方法修剪视频
- (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 name],[e reason]);
}
}
Run Code Online (Sandbox Code Playgroud)
此方法检查修剪的状态:
- (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;
}
}];
}
Run Code Online (Sandbox Code Playgroud)
我splitVideo从导出按钮操作方法调用方法,并将输出URL作为参数传递.