2013-02-08 12 views
8

Mam problem z tym problemem od ponad tygodnia. Mam nadzieję, że ktoś widzi, co robię źle. Próbuję użyć metody finishWritingWithCompletionHandler:, ponieważ metoda finishWriting jest teraz przestarzała. Nie miałem żadnego sukcesu przy użyciu nowej metody. Nie powiedzie się z nieznanym błędem -11800. Mogę zapisać mój plik MOV przy użyciu nieaktualnej metody, ale gdy utworzę ekwiwalent z nową metodą, to za każdym razem się nie uda.AVAssetWriter finishWritingWithCompletionHandler error with unknown error

Oto mój oryginalny kod:

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

Moja nowa metoda jest następująca:

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

Nie sądzę brakowało mi niczego, a ja nie dostaję dużo z nim błędu rzuca. Każda pomoc zostanie bardzo doceniona.

Dzięki Rob

Odpowiedz

21

końcu znalazłem odpowiedź. finishWritingWithCompletionHandler: zawodzi, ponieważ nie uruchomiłem obiektów markAsFinished na obiektach . Po przeprowadzeniu markAsFinished metod finishWritingWithCompletionHandler:, proces był w stanie ukończyć bez błędów.

+3

Oznaczam to jako wykończenie i nadal się zawiesza ... – SpaceDog

11

Miałem podobny problem i odkryłem, że program obsługi nie został wywołany, ponieważ zwolniłem AVAssetWriter natychmiast po wywołaniu finishWritingWithCompletionHandler:, np.

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

self.assetWriter = nil; 

Aby go naprawić, wystarczy przesunąć linię uwalniający do wewnątrz przewodnika realizacji:

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

ah !!! znakomity! thx – Bastek

+0

Jako dodatkowy element, jeśli używasz ARC i masz assetWriter jako zmienną lokalną zamiast właściwości, możesz ją zadeklarować za pomocą __block. –

0

Odpowiedź była dla mnie usunąć wywołanie finishWritingWithCompletionHandler. Podobno funkcja została już raz wywołana.