原文轉載自:https://diablo4ever.wordpress.com/2017/05/16/avassetwriter報的那些錯
最近項目中用到了視訊壓縮的地方,查找到用AVFoundation的AVAssetReader等類可以解決視訊壓縮的碼率等問題,當我使用之後,一切都沒問題,但是一旦在壓縮的途中退出頁面,我沒有執行AVAssetWriter finishWritingWithCompletionHandler:這個方法超過3次以上,那麼拼接緩沖區視訊的方法[AVAssetWriterInput appendSampleBuffer:sampleBuffer];就會傳回NO,無法拼接緩沖區視訊,這就代表無法繼續壓縮視訊。
而且這個問題隻有退出APP重新進入才可以解決,從記憶體中銷毀AVAssetWriter對象,重新建立都無法解決這個問題,我列印出來AssetWriter這個類的error屬性,裡面是一堆中英混雜的錯誤資訊,我真是看的一臉懵逼,:
AssetWriter Error -12915
Error Domain=AVFoundationErrorDomain Code=-11840 “無法編碼”
UserInfo={NSUnderlyingError=0x170846330 {Error Domain=NSOSStatusErrorDomain Code=-12915 “(null)”},
NSLocalizedFailureReason=此媒體所需的編碼器正忙。
(The encoder required for this media is busy.),
NSLocalizedRecoverySuggestion=停止其他所有對媒體加密的操作,然後再試一次。
(stop any other actions that encode media and try again.),
NSLocalizedDescription=無法編碼}
直到遇到上面的大牛的Blog,裡面說明了遇到問題的情況,我才解決這個問題:
把AVAssetWriter設定為全局變量,確定在你退出頁面,或者任何奇奇怪怪操作的時候,首先執行AVAssetWriter 的finishWritingWithCompletionHandler方法!這樣再次執行[AVAssetWriterInput appendSampleBuffer:sampleBuffer]就不會報錯了,具體細節還需要花些時間去看,但這真是個令人蛋疼的問題