【问题标题】:Recorded video sometimes displaying, sometimes not录制的视频有时显示,有时不显示
【发布时间】:2015-12-13 15:54:09
【问题描述】:

我有一个视图控制器,用于记录用户的(正面)视频。使用如下代码:

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;

其中movieFileOutputAVCaptureMovieFileOutput 对象。我可以向您展示相机配置/设置代码(这不是图像选择器控制器或任何 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];

所以,第一次,一切正常。应用程序录制视频,然后显示下一个屏幕,并显示视频。但是,如果您单击“放弃”按钮,该按钮会一直回到应用程序的开头,然后再次执行整个过程,它确实不起作用,而是播放器显示黑色屏幕。话虽如此,我打印出路径上的数据长度,它总是很大(因此该路径上存在某些东西)。

奇怪的是,我决定像这样打印 NSData 对象本身:

NSLog(@"%@", [NSData dataWithContentsOfURL:self.outputURL]);

确实打印了一个非常大的字符串(也许是字节?不确定)。 然而,由于某种原因,现在一切正常...当我添加此 NSLog() 时,该错误不再出现。当我删除它时,它再次发生!我已经严格对此进行了测试。

但是仍然有一些奇怪的时间包含这个 NSLog() 时,在播放了三遍黑屏之后。我很困惑为什么会出现这个错误,以及包含 NSLog() 究竟如何改变任何行为。

有什么想法吗?

【问题讨论】:

    标签: ios objective-c iphone avfoundation


    【解决方案1】:

    我的猜测是你需要等待文件被保存。

    AVCaptureFileOutput 的文档说:

    当通过调用此方法停止录制时,通过更改 使用startRecordingToOutputFileURL:recordingDelegate: 的文件,或 由于出现错误,需要包含的剩余数据 该文件将在后台写入。因此,在使用之前 该文件,您必须等到指定的委托 startRecordingToOutputFileURL:recordingDelegate: 收到通知 数据已使用 captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: 方法。

    【讨论】:

    • 同意 - 您需要确保设置了 movieFileOutput 的委托,并且您实现了这些委托方法并在那里等待确认一切正常。各种事情都可能出错,一个经典的事情是你在中途用完了磁盘空间。您需要实现这些方法、处理错误并相应地使用成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多