我有一个视图控制器,用于记录用户的(正面)视频。使用以下代码:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = [paths objectAtIndex:0];
NSString *outputPath = [[NSString alloc] initWithFormat:@"%@", [basePath stringByAppendingPathComponent:@"output.mp4"]];
if ([[NSFileManager defaultManager] isDeletableFileAtPath:outputPath])
[[NSFileManager defaultManager] removeItemAtPath:outputPath error:NULL];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
self.outputURL = outputURL;
其中movieFileOutput
是AVCaptureMovieFileOutput
个对象。我可以向您展示摄像机配置/设置代码(这不是图像选择器控制器或任何Apple UI;它在用户在完全不同的屏幕上进行交互时在背景中拍摄)但总的来说,我知道它有效。
然后,调用[movieFileOutput stopRecording];
并将用户导航到新屏幕,在该屏幕中播放刚刚发生的录制。我将outputURL
对象传递给此新初始化的视图控制器,VC使用以下代码播放它:
self.player = [[MPMoviePlayerController alloc] initWithContentURL:self.outputURL];
self.player.view.frame = CGRectMake(0, 0, self.view.frame.size.width, 320);
self.player.movieSourceType = MPMovieSourceTypeFile;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.player];
self.player.controlStyle = MPMovieControlStyleNone;
self.player.shouldAutoplay = YES;
[self.player setFullscreen:YES animated:NO];
[self.player prepareToPlay];
[self.view addSubview:[self.player view]];
[self.player play];
所以,第一次,一切正常。应用程序记录视频,然后显示下一个屏幕,并显示视频。但是,如果你点击" Discard"按钮,一直回到应用程序的开头,并再次完成整个过程,它不工作,而播放器显示黑屏。话虽如此,我打印出路径上的数据长度,并且总是一个大数字(因此在该路径上存在某些东西)。
奇怪的是,我决定只打印 NSData 对象本身:
NSLog(@"%@", [NSData dataWithContentsOfURL:self.outputURL]);
确实打印了一大串字符(可能是字节?不确定)。 然而,出于某种原因,现在一切正常......当我添加此NSLog()时,错误不再发生。当我删除它,它再次发生!我已经严格测试了 。
但是在播放三次黑屏后,仍然会有一些奇怪的时间包含这个NSLog()。我很困惑为什么会出现这个错误,以及如何在地球上包含NSLog()可以改变任何行为。
有什么想法吗?
答案 0 :(得分:1)
我的猜测是你需要等待文件保存。
AVCaptureFileOutput
的文档说:
通过调用此方法停止录制,通过更改 使用
startRecordingToOutputFileURL:recordingDelegate:
的文件,或 由于错误,需要包含的剩余数据 该文件将在后台写入。因此,在使用之前 在文件中,您必须等到指定的委托 全部通知startRecordingToOutputFileURL:recordingDelegate:
数据已经使用了写入文件captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error:
方法强>