2016-02-03 52 views
1

我使用AVFoundation录制视频,录制完成后视频会自动运行。 这是码记录视频:使用AVFoundation录制后无法播放视频

- (IBAction)captureVideo:(id)sender { 
if (!isRecording) { 
    isRecording = YES; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"dd-MM-yyyy||HH:mm:SS"]; 
    NSDate *now = [[NSDate alloc] init]; 
    NSString *theDate = [dateFormat stringFromDate:now]; 

    NSString *videoPath = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%@/%@.mov",documentsDirectory,theDate]]; 
    outputURL = [NSURL fileURLWithPath:videoPath]; 
    [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 
} else{ 
    isRecording = NO; 
    [movieFileOutput stopRecording]; 

    [self playVideo]; 
} 
} 

播放视频:

AVPlayer *player = [AVPlayer playerWithURL:outputURL]; 
AVPlayerViewController *playerViewController = [AVPlayerViewController new]; 
playerViewController.player = player; 

playerViewController.view.frame = CGRectMake(0, 150, self.view.frame.size.width, 400); 
[self.view addSubview:playerViewController.view]; 
[player play]; 

奇怪的是,我不能记录后播放视频,但是当我把一个断点线AVPlayer *player = [AVPlayer playerWithURL:outputURL];。当程序遇到这个断点时,我继续运行它。它运行良好。 我不知道为什么。 任何帮助或建议,将不胜感激。谢谢。

+0

我想你应该记录到缓冲区/高速缓存或其他临时位置,而不是正确的文件时被存储。它会让你的视频有机会获得记录,任何操作系统或处理框架都有机会在保存到文件之前完成其工作。断点指向它停止的那个方向,它给它一个写完文件的机会。 – noobsmcgoobs

+0

查看此链接https://www.objc.io/issues/23-video/capturing-video/特别是有关'AVCaptureDataOutput'和'AVAssetWriter'的章节 – noobsmcgoobs

回答

0

看着Apple's documentation for the stopRecording method in AVCaptureFileOutput,我们可以看到有一个名为captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error:的AVCaptureFileOutputRecordingDelegate方法。

所以它看起来像你试图播放视频时,它没有写入磁盘。磁盘写入是异步完成的,因此当下一行([player play])正在执行时,视频肯定不会写入。

我不知道你在哪里初始化了你的对象,但你应该设置它的委托(它可以是视图控制器)。

完成后,只需实施captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error:方法(无论如何都需要),并且您可以将[player play]方法放在那里播放视频(在验证没有发生错误之后)。

下面是一个示例实现的方法:

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { 

    if ([error code] == noErr) { 
     [player play]; 
    } else { 
     //Let the user know something went wrong 
     NSLog(@"Error recording to output file: %@",error.localizedDescription); 
    } 

} 
0

我固定我的问题。 停止记录后,不要致电[self playVideo];。我把它放在AVCaptureMovieFileOutput的委托

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{ 
    if ([error code] == noErr) { 
     [self playVideo]; 
    } 
}