2013-02-25 13 views
12

Próbuję utworzyć wideo z obrazów za pomocą AVAssetWriter. Kod wdrożone działa dobrze przez większość czasu, ale w losowych momentach nie ma problemu z pisarzemAVAssetWriter nieznany błąd

AVAssetWriter *videoWriter; 
... 
[videoWriter finishWriting]; 
NSLog(@"videoWriter error %@",videoWriter.error); 

odebrane błędu:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" 
UserInfo=0x1f839cd0 {NSLocalizedDescription=The operation could not be completed, 
NSUnderlyingError=0x1e59efb0 "The operation couldn’t be completed. (OSStatus error -12633.)", 
NSLocalizedFailureReason=An unknown error occurred (-12633)} 

Pisanie zdjęcia:

-(void)writeFrame:(WriteableFrame*)wF 
{ 
    if([writerInput isReadyForMoreMediaData]) 
    { 
     CMTime presentTime = CMTimeMake(wF.frameTime, 1000); 
     CGImageRef tmpImgRef = [wF.currentImage CGImage]; 
     buffer = [self pixelBufferFromCGImage:tmpImgRef]; 
     if(buffer) 
     { 
      [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; 
      CVPixelBufferRelease(buffer); 
     } 
    } 
    else 
    { 
     NSLog(@"error"); 
    } 
} 

Czy jest ktoś z problemem lubię to?

+0

Czy możesz opublikować kod, w którym ładujesz zasoby z pliku? – nsgulliver

+0

Nie ładuję zasobów z pliku, piszę dane w czasie rzeczywistym, zaktualizowano metodę dołączania obrazów. –

Odpowiedz

22

Znalazłem problem, kładąc dwie klatki w tym samym czasie klatki.

+2

Czy możesz opracować? Otrzymuję ten błąd i nie mogę go rozwiązać. Bardzo frustrujące. – rrbrambley

+1

Czasami zdarzało się, że dołączałem dwa różne obrazy dokładnie w tym samym momencie. Możesz zalogować presentTime i sprawdzić, czy masz taką samą sytuację. [adapter appendPixelBuffer: buffer withPresentationTime: presentTime]; –

+3

Myślę, że wpadłem na ten sam problem. To naprawdę pomogło! Gdyby tylko błąd był bardziej szczegółowy ... Używałem 'finishWritingWithCompletionHandler' i stwierdziłem, że procedura zakończenia nie była nawet wykonywana w tej sytuacji, co utrudniło debugowanie. – bsirang

3

Jeśli dasz sampleBuffer do AVAssetWriter, a następnie zniszczyć powiązanych AVAssetReader przyszłe AVAssetReaders może próbować ponownie wykorzystać sampleBuffer przed AVAssetWriter zakończeniu z nim. Jest to sprzeczne z dokumentacją AVAssetWriter w AVAssetWriterInput.h i, o ile mi wiadomo, nie ma możliwości upewnienia się, że AVAssetWriter jest zakończone, dopóki nie otrzymasz wywołania zwrotnego w finishWritingWithCompletionHandler, ale może to spowodować błąd OSStatus -12633.

@method appendSampleBuffer:

Odbiornik zachowa CMSampleBuffer aż to się robi z nim, a następnie zwolnij go. Nie modyfikuj CMSampleBuffer ani jego zawartości po przekazaniu go do tej metody.

3

Może się również zdarzyć, jeśli pchnął ramek jest nieczynna

+0

Czy istnieje dokumentacja, która mówi, że nie można dołączać buforów w kolejności? – RSully

+0

Brak. Zrozumiałem to przez praktykę. Ale jest to całkiem logiczne, ponieważ dane powinny płynąć w kolejności. – AlexeyVMP

+0

Pytam, ponieważ pomyślnie dołączam garść buforów, które nie działają, a po pewnym czasie pojawia się błąd zapisu (nie pierwszy lub drugi z bufora poza kolejnością, bardziej jak 10 lub 20). Mam do czynienia z wieloma nieudokumentowanymi błędami, kiedy wkraczam na to terytorium, gdzie OSStatus -12717 jest jednym z nich. Nie mogę do końca określić, czy jest to spowodowane buforami poza kolejnością, ale pracuję nad debugowaniem. – RSully

9

Bezpośrednio z DTS

Błąd -12633 jest InvalidTimestamp

+0

Co to jest DTS i czy możesz podać link do odpowiedniej strony? –

+0

@StanJames Wsparcie techniczne dla programistów Apple, z którym skontaktowałem się przez e-mail. Jako zarejestrowany programista iOS/Mac otrzymujesz 2 bezpłatne abonamenty uwzględnione w subskrypcji, ale w przeciwnym razie jest to płatna pomoc techniczna. – RSully

+6

hahahaha, nienawidzę dokumentacji Apple. Musisz skontaktować się z pomocą techniczną, aby dowiedzieć się, co oznacza kod błędu. Potrzebujemy kogoś, kto zwolni cały sektor dokumentacji od Apple. – SpaceDog

0

ja otrzymuję ten sam błąd, gdy obraz w moim buforze pikselowym nie miał tej samej wielkości/wysokości, której oczekuje adapter bufora pikseli wejściowych na podstawie tego, do czego ustawiono parametr sourcePixelBufferAttributes na (kCVPixelBufferWidthKey, kCVPixelBufferHeightKey). Upewnij się, że bufor pikseli ma te same wymiary. W moim przypadku, moja aplikacja czasami rysowała obraz w formacie 1x1, ponieważ zamierzałem narysować jednolity kolorowy obraz, ale zaniedbałem przeskalowanie tego jednokolorowego piksela do pełnego rozmiaru.

Powiązane problemy