我一直在努力解决这个问题一个多星期。我希望有人看到我做错了什么。我试图使用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];
});
}
}];
}];
我认为我没有错过任何东西,而且我从它抛出的错误中得不到多少。任何帮助将不胜感激。
谢谢, 罗布
答案 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
。显然这个功能已被调用过一次。