AVAssetWriter finishWritingWithCompletionHandler错误,未知错误

Rob*_*Rob 9 avfoundation grand-central-dispatch avassetwriter ios6

一个多星期以来,我一直在努力解决这个问题.我希望有人看到我做错了什么.我试图使用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];
        });
    }
}];
Run Code Online (Sandbox Code Playgroud)

我的新方法如下:

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];
            });
        }
    }];
}];
Run Code Online (Sandbox Code Playgroud)

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

谢谢,罗布

Rob*_*Rob 22

我终于找到了答案.将finishWritingWithCompletionHandler:是失败的,因为我没有运行markAsFinishedAVAssetWriterInput对象.有一次,我跑了markAsFinished方法之前finishWritingWithCompletionHandler:,这个过程能够无差错完成.


Kha*_*yen 11

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

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

self.assetWriter = nil;
Run Code Online (Sandbox Code Playgroud)

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

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
    self.assetWriter = nil;
}]
Run Code Online (Sandbox Code Playgroud)