Ios 使用AVFoundation录制后无法播放视频

Ios 使用AVFoundation录制后无法播放视频,ios,avfoundation,Ios,Avfoundation,我使用AVFoundation来录制视频,录制完成后此视频将自动运行。 这是录制视频的代码: - (IBAction)captureVideo:(id)sender { if (!isRecording) { isRecording = YES; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docume

我使用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]行中放置断点时。当程序到达这个断点时,我继续运行它。它运行良好。
我不知道为什么。
如有任何帮助或建议,将不胜感激。谢谢。

查看,我们可以看到有一个名为
captureOutput:DidFinishRedingToOutputFileAttribute:fromConnections:error:
的AVCaptureFileOutputRecordingDelegate方法

因此,看起来您正在尝试播放尚未写入磁盘的视频。磁盘写入是异步完成的,因此当执行下一行(
[player play]
)时,视频肯定不会写入

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

完成后,只需实现
captureOutput:didFinishRedingToOutputFileATURL: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);
    }

}
查看,我们可以看到有一个名为
captureOutput:didFinishRedingToOutputFileAttribute:fromConnections:error:
的AVCaptureFileOutputRecordingDelegate方法

因此,看起来您正在尝试播放尚未写入磁盘的视频。磁盘写入是异步完成的,因此当执行下一行(
[player play]
)时,视频肯定不会写入

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

完成后,只需实现
captureOutput:didFinishRedingToOutputFileATURL: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);
    }

}
我解决了我的问题。 而不是调用
[自播放视频]停止录制后。我在
AVCaptureMovieFileOutput
的委托上调用它

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error{
    if ([error code] == noErr) {
        [self playVideo];
    }
}
我解决了我的问题。 而不是调用
[自播放视频]停止录制后。我在
AVCaptureMovieFileOutput
的委托上调用它

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

我认为在录制到缓冲区/缓存或其他临时位置时,您应该进行存储,而不是对文件进行存储。这将使您的视频有机会被录制,任何操作系统或处理框架都有机会在保存到文件之前完成它的工作。断点指向那个方向,因为它停止了,所以它有机会完成对文件的写入。具体请参见此链接中关于
AVCaptureDataOutput
AVAssetWriter
的部分。我认为在记录到缓冲区/缓存或其他临时位置时,应该存储,而不是直接记录到文件。这将使您的视频有机会被录制,任何操作系统或处理框架都有机会在保存到文件之前完成它的工作。断点指向该方向,因为它停止了,这使它有机会完成对文件的写入。具体请参见此链接中关于
AVCaptureDataOutput
AVAssetWriter