AVAssetWriter finishWritingWithCompletionHandler错误,未知错误

时间:2013-02-08 04:48:33

标签: ios6 avfoundation grand-central-dispatch avassetwriter

我一直在努力解决这个问题一个多星期。我希望有人看到我做错了什么。我试图使用finishWritingWithCompletionHandler:方法,因为现在不推荐使用finishWriting方法。我没有使用新方法取得任何成功。它失败,出现未知错误-11800。我可以使用弃用的方法保存我的MOV文件,但是当我使用新方法创建等效文件时,它每次都会失败。

这是我的原始代码:

dispatch_async(movieWritingQueue, ^{
    if ([self.assetWriter finishWriting]) {
        self.assetWriterAudioIn = nil;
        self.assetWriterVideoIn = nil;
        //[assetWriter release];  ARC will not allow this line.
        self.assetWriter = nil;

        self.readyToRecordVideo = NO;
        self.readyToRecordAudio = NO;

        [self.delegate movieReadyToSaveForMovieProcessor:self];
    }
    else {
        [self displayError:[assetWriter error]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self resumeCaptureSession];
        });
    }
}];

我的新方法如下:

dispatch_async(movieWritingQueue, ^{
    [self.assetWriter finishWritingWithCompletionHandler:^{
        if (self.assetWriter.status != AVAssetWriterStatusFailed && self.assetWriter.status == AVAssetWriterStatusCompleted) {
            self.assetWriterAudioIn = nil;
            self.assetWriterVideoIn = nil;
            self.assetWriter = nil;

            self.readyToRecordAudio = NO;
            self.readyToRecordVideo = NO;

            [self.delegate movieReadyToSaveForMovieProcessor:self];
        } else {
            [self displayError:self.assetWriter.error];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self resumeCaptureSession];
            });
        }
    }];
}];

我认为我没有错过任何东西,而且我从它抛出的错误中得不到多少。任何帮助将不胜感激。

谢谢, 罗布

3 个答案:

答案 0 :(得分:21)

我终于找到了答案。 finishWritingWithCompletionHandler:失败了,因为我没有在markAsFinished对象上运行AVAssetWriterInput。在markAsFinished 之前运行finishWritingWithCompletionHandler:方法之后,该过程就可以完成而不会出错。

答案 1 :(得分:11)

我有类似的问题,发现处理程序没有被调用,因为我在调用AVAssetWriter后立即释放finishWritingWithCompletionHandler:,例如。

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
}]

self.assetWriter = nil;

要修复它,只需将释放线移动到完成处理程序内部:

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
    self.assetWriter = nil;
}]

答案 2 :(得分:0)

答案是让我删除通话finishWritingWithCompletionHandler。显然这个功能已被调用过一次。