11

我已经为这个问题苦苦挣扎了一个多星期。我希望有人看到我做错了什么。我正在尝试使用 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];
            });
        }
    }];
}];

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

谢谢,罗伯

4

3 回答 3

23

我终于找到了答案。finishWritingWithCompletionHandler:失败是因为我没有在对象markAsFinished上运行。AVAssetWriterInput一旦我在之前运行这些markAsFinished方法,该过程就能够完成而没有错误。finishWritingWithCompletionHandler:

于 2013-02-11T03:55:48.213 回答
11

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

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

self.assetWriter = nil;

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

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
    self.assetWriter = nil;
}]
于 2013-06-20T05:39:46.357 回答
3

答案是让我删除 call finishWritingWithCompletionHandler。显然该函数已经被调用过一次。

于 2015-05-30T13:29:29.667 回答