2013-02-08 139 views
8

AVAssetWriter finishWritingWithCompletionHandler的错误,我一直在努力解决这个问题了一个多星期。我希望有人看到我做错了什么。我试图使用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]; 
      }); 
     } 
    }]; 
}]; 

我不认为我错过了什么,我没有从错误中也越来越多抛出。任何帮助将不胜感激。

感谢, 罗布

回答

21

我终于找到了答案。该finishWritingWithCompletionHandler:是失败的,因为我没有上运行AVAssetWriterInput对象markAsFinished。有一次,我在以前finishWritingWithCompletionHandler:markAsFinished方法,这个过程能够无差错完成。

+3

我将其标记为完成,它仍然会崩溃...... – SpaceDog

11

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

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

self.assetWriter = nil; 

要解决它,只需释放线移动到完成处理程序中:

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

啊!辉煌! THX – Bastek

+0

作为一个额外的元素,如果你正在使用ARC,你有assetWriter作为一个局部变量,而不是你可以用__block声明它的属性。 –

0

答案对我来说,除去呼叫finishWritingWithCompletionHandler。显然这个函数已经被调用过一次了。