18

Apple 文档似乎表明,在将视频录制到文件时,应用程序可以动态更改 URL,没有问题。但我看到了一个问题。当我尝试这个时,录制委托被调用并出现错误......

手术无法完成。(OSStatus 错误 -12780。)信息字典为:{ AVErrorRecordingSuccessfullyFinishedKey = 0; }

(“无法”中的时髦单引号来自日志记录 [错误本地化描述])

这是代码,基本上是对 WWDC10 AVCam 示例的调整:

1) 开始录制。启动计时器以每隔几秒更改一次输出 URL

- (void) startRecording
{
    // start the chunk timer
    self.chunkTimer = [NSTimer scheduledTimerWithTimeInterval:5
                                                       target:self
                                                     selector:@selector(chunkTimerFired:)
                                                     userInfo:nil
                                                      repeats:YES];

    AVCaptureConnection *videoConnection = [AVCamCaptureManager connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]];
    if ([videoConnection isVideoOrientationSupported]) {
        [videoConnection setVideoOrientation:[self orientation]];
    }

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
    }

    NSURL *fileUrl = [[ChunkManager sharedInstance] nextURL];
    NSLog(@"now recording to %@", [fileUrl absoluteString]);
    [[self movieFileOutput] startRecordingToOutputFileURL:fileUrl recordingDelegate:self];
}

2)当定时器触发时,在不停止录制的情况下更改输出文件名

- (void)chunkTimerFired:(NSTimer *)aTimer {

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
    }

    NSURL *nextUrl = [self nextURL];
    NSLog(@"changing capture output to %@", [[nextUrl absoluteString] lastPathComponent]);

    [[self movieFileOutput] startRecordingToOutputFileURL:nextUrl recordingDelegate:self];
}

注意:[self nextURL] 生成文件 url,如 file-0.mov、file-5.mov、file-10.mov 等。

3) 每次文件更改时都会调用它,并且每次调用都是错误...

- (void)              captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
                    fromConnections:(NSArray *)connections
                              error:(NSError *)error
{
    id delegate = [self delegate];
    if (error && [delegate respondsToSelector:@selector(someOtherError:)]) {
        NSLog(@"got an error, tell delegate");
        [delegate someOtherError:error];
    }

    if ([self backgroundRecordingID]) {
        if ([[UIDevice currentDevice] isMultitaskingSupported]) {
            [[UIApplication sharedApplication] endBackgroundTask:[self backgroundRecordingID]];
        }
        [self setBackgroundRecordingID:0];
    }

    if ([delegate respondsToSelector:@selector(recordingFinished)]) {
        [delegate recordingFinished];
    }
}

当它运行时,file-0 被写入,然后我们在将 url 更改为 file-5 后立即看到错误 -12780,file-10 被写入,然后是一个错误,然后是好的,等等。

动态更改 URL 似乎不起作用,但它会停止写入,从而允许下一个 URL 更改起作用。

4

3 回答 3

8

谢谢大家,对此的评论和好的想法。这是来自 Apple DTS 的词...

我与我们的 AV Foundation 工程师进行了交谈,这绝对是一个错误,因为此方法没有按照文档中的说明进行操作(“当另一个录制正在进行时,您无需在调用此方法之前调用 stopRecording。”)。请使用 Apple Bug Reporter ( http://developer.apple.com/bugreporter/ )提交错误报告,以便团队进行调查。确保并在报告中包含您的最小项目。

我已将此作为错误 11632087 提交给 Apple

于 2012-06-09T15:26:34.103 回答
1

在文档中说明了这一点:

If a file at the given URL already exists when capturing starts, recording to the new file will fail.

你确定你检查的nextUrl是一个不存在的文件名吗?

于 2012-06-04T09:49:13.613 回答
0

根据文档,不支持连续调用 2 个 startRecordingToOutputFileURL。

你可以在这里阅读

在 iOS 中,不支持这种帧精确文件切换。您必须在再次调用此方法之前调用 stopRecording 以避免任何错误。

于 2013-01-24T14:30:12.930 回答