连续调用startRecordingToOutputFileURL:

时间:2012-06-02 00:11:47

标签: iphone ios avfoundation avcam

The Apple docs似乎表示在将视频录制到文件时,应用可以动态更改网址,没有任何问题。但我看到了一个问题。当我尝试这个时,录制代理被调用错误...

  

操作无法完成。 (OSStatus错误-12780。)信息   字典是:{       AVErrorRecordingSuccessfullyFinishedKey = 0; }

(“不能”的时髦单引号来自记录[error localizedDescription])

这是代码,基本上是对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]生成文件网址,如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];
    }
}

当这个运行时,文件-0被写入,然后我们在将url更改为file-5,文件-10被写入,然后出现错误,然后好了,等等之后立即看到错误-12780。

似乎暂时更改网址不起作用,但它会停止写入,从而允许下一次网址更改生效。

3 个答案:

答案 0 :(得分:8)

感谢大家,对此进行了审核并提出了很好的想法。这是Apple DTS的一句话......

  

我与我们的AV基金会工程师交谈,这绝对是一个错误   因为这种方法没有按照文档所说的那样做   (“在调用此方法之前,您无需调用stopRecording   另一个录音正在进行中。“)。请提交错误报告   使用Apple Bug Reporter(http://developer.apple.com/bugreporter/)   所以团队可以调查。确保并包括你的最小   项目在报告中。

我已经向Apple提交了这个错误11632087

答案 1 :(得分:1)

在文档中说明了这一点:

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

您确定检查nextUrl是不存在的文件名吗?

答案 2 :(得分:0)

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

你可以阅读here

  

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