2013-02-08 29 views
8

Tôi đã đấu tranh với vấn đề này trong hơn một tuần. Tôi hy vọng ai đó nhìn thấy những gì tôi đang làm sai. Tôi đang cố sử dụng phương thức finishWritingWithCompletionHandler: vì phương thức finishWriting hiện không được chấp nhận nữa. Tôi đã không có bất kỳ thành công bằng cách sử dụng phương pháp mới. Nó không thành công với một lỗi không xác định -11800. Tôi có thể lưu tập tin MOV của tôi bằng cách sử dụng phương pháp không được chấp nhận tốt, nhưng khi tôi tạo ra tương đương với phương pháp mới nó không thành công mỗi lần.AVAssetWriter finishWritingWithCompletionHandler lỗi với lỗi không xác định

Đây là mã ban đầu của tôi:

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]; 
     }); 
    } 
}]; 

phương pháp mới của tôi là như sau:

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]; 
      }); 
     } 
    }]; 
}]; 

Tôi không nghĩ rằng tôi đã bỏ lỡ bất cứ điều gì và tôi không nhận được nhiều từ các lỗi nó ném. Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

Cảm ơn, Rob

Trả lời

21

tôi cuối cùng đã tìm thấy câu trả lời. finishWritingWithCompletionHandler: không thành công vì tôi không chạy markAsFinished trên các đối tượng AVAssetWriterInput. Khi tôi chạy các phương pháp markAsFinishedtrướcfinishWritingWithCompletionHandler:, quá trình này có thể hoàn tất mà không có lỗi.

+3

Tôi đánh dấu nó là hoàn thành và nó vẫn đang bị treo ... – SpaceDog

11

Tôi gặp sự cố tương tự và nhận thấy rằng trình xử lý không được gọi vì tôi đã phát hành AVAssetWriter ngay sau khi gọi finishWritingWithCompletionHandler:, ví dụ:

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

self.assetWriter = nil; 

Để khắc phục nó, chỉ cần di chuyển các dòng giải phóng vào bên trong xử lý hoàn thành:

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

ah !!! rực rỡ! thx – Bastek

+0

Là một phần tử bổ sung nếu bạn đang sử dụng ARC và bạn có assetWriter làm biến cục bộ thay vì thuộc tính bạn có thể khai báo nó bằng __block. –

0

Câu trả lời là cho tôi để loại bỏ kêu gọi finishWritingWithCompletionHandler. Rõ ràng chức năng đã được gọi một lần.

Các vấn đề liên quan