2013-02-25 19 views
12

Sto cercando di creare video da immagini utilizzando AVAssetWriter. codice implementato funziona bene la maggior parte del tempo, ma in momenti casuali non v'è problema con lo scrittoreErrore sconosciuto AVAssetWriter

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

errore ricevuto è:

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

immagini di scrittura:

-(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"); 
    } 
} 

c'è qualcuno con il problema come questo?

+0

puoi pubblicare il codice in cui carichi gli asset dal file? – nsgulliver

+0

Non carico risorse da file, sto scrivendo dati in tempo reale, metodo aggiornato per l'aggiunta di immagini. –

risposta

22

Ho trovato il problema, stava mettendo due frame allo stesso frame time.

+2

Puoi elaborare? Sto ricevendo questo errore e non riesco a capirlo. Molto frustrante. – rrbrambley

+1

A volte c'era una situazione in cui aggiungevo due immagini diverse esattamente nello stesso momento. È possibile accedere a presentTime e vedere se si ha la stessa situazione. [adattatore appendPixelBuffer: buffer withPresentationTime: presentTime]; –

+3

Penso di essermi imbattuto nello stesso problema. Questo ha davvero aiutato! Se solo l'errore fosse più specifico ... Stavo usando "finishWritingWithCompletionHandler" e ho scoperto che il gestore di completamento non era nemmeno in esecuzione in questa situazione, il che rendeva il debug ancora più difficile. – bsirang

3

Se si dà un sampleBuffer al AVAssetWriter, poi distruggere l'associato AVAssetReader, AVAssetReaders futuri potrebbero cercare di riutilizzare il sampleBuffer prima AVAssetWriter è finito con esso. Ciò è in contraddizione con la documentazione AVAssetWriter in AVAssetWriterInput.h e, per quanto ne so, non c'è modo di essere certi che AVAssetWriter sia terminato finché non si ottiene la richiamata in finishWritingWithCompletionHandler, ma ciò può provocare l'errore OSStatus -12633.

@method appendSampleBuffer:

Il ricevitore manterrà la CMSampleBuffer finché non viene fatto con esso, e quindi rilasciarlo. Non modificare un CMSampleBuffer o il suo contenuto dopo averlo passato a questo metodo.

3

Può anche accadere se spinto frame è fuori ordine

+0

C'è qualche documentazione che dice che non puoi aggiungere i buffer fuori servizio? – RSully

+0

Nessuno. L'ho capito con la pratica. Ma è piuttosto logico perché i dati dovrebbero scorrere in ordine. – AlexeyVMP

+0

Chiedo perché sto aggiungendo con successo una manciata di buffer fuori uso e ricevo solo un errore di scrittura dopo un po 'di tempo (non il primo o il secondo buffer out-of-order, più come il 10 o il 20). Ho a che fare con molti errori non documentati mentre passo in questo territorio, essendo OSStatus -12717 uno di loro. Non riesco a determinare se questo è dovuto a buffer fuori servizio, ma sto lavorando per il debug. – RSully

9

diretto da DTS

errore -12.633 è un InvalidTimestamp

+0

Che cos'è DTS e puoi fornire un link alla pagina pertinente? –

+0

@StanJames Supporto tecnico per sviluppatori Apple, che ho contattato via email. Come sviluppatore iOS/Mac registrato hai 2 incidenze gratuite incluse nel tuo abbonamento, ma per il resto è un supporto a pagamento. – RSully

+6

hahahaha, odio i documenti Apple. Devi contattare il supporto per sapere cosa significa un codice di errore. Abbiamo bisogno di qualcuno che licenzi l'intero settore della documentazione da Apple. – SpaceDog

0

mi è stato sempre lo stesso errore quando il l'immagine nel mio buffer di pixel non aveva le stesse dimensioni di larghezza/altezza che l'adattatore del buffer dei pixel di input si aspetta in base a cosa si imposta sourcePixelBufferAttributes a (kCVPixelBufferWidthKey, kCVPixelBufferHeightKey). Assicurati che il buffer dei pixel abbia le stesse dimensioni. Nel mio caso, a volte la mia applicazione stava disegnando un'immagine 1x1 perché intendevo disegnare un'immagine a tinta unita, ma ho trascurato di adattare quel pixel monocromatico alla dimensione massima.

Problemi correlati