2011-06-20 11 views
8

Używam pixelBufferPool w ramach AVAssetWriterInputPixelBufferAdaptor do tworzenia buforów pikseli do użycia z metodą append. Po utworzeniu 4 buforów, właściwość pixelBufferPool staje się NULL;AVAssetWriterInputPixelBufferAdaptor pixelBufferPool po pewnym czasie przechodzi NULL

konfiguracja I mój pisarz, wejście i adapter tak:

- (BOOL) setupRecorder { 
    NSError *error = nil; 
    if([[NSFileManager defaultManager] fileExistsAtPath:[[self tempFileURL] path]]) 
     [[NSFileManager defaultManager] removeItemAtURL:[self tempFileURL] error:&error]; 


    assetWriter = [[AVAssetWriter alloc] initWithURL: [self tempFileURL] 
              fileType:AVFileTypeQuickTimeMovie 
               error:&error]; 
    if (error) { 
     NSLog(@"Error creating asset writer: %@", error); 
     [assetWriter release]; 
     return NO; 
    } 
    // writer 

    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
            AVVideoCodecH264, AVVideoCodecKey, 
            [NSNumber numberWithInt:videoWidth], AVVideoWidthKey, 
            [NSNumber numberWithInt:videoHeight], AVVideoHeightKey, 
            nil]; 

    assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo 
                 outputSettings:videoSettings]; 

    NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, 
             nil]; 

    adaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:assetWriterInput sourcePixelBufferAttributes:bufferAttributes]; 
    [adaptor retain]; 
    assetWriterInput.expectsMediaDataInRealTime = YES; 
    [assetWriter addInput:assetWriterInput]; 

    return YES; 
} 

i rozdać bufory pikseli z tym:

- (CVPixelBufferRef) createPixelBufferRef { 
    CVPixelBufferPoolRef pixelBufferPool = adaptor.pixelBufferPool; 
    CVPixelBufferRef pixelBuffer = NULL; 
    CVReturn cvReturn = CVPixelBufferPoolCreatePixelBuffer(NULL, pixelBufferPool, &pixelBuffer); 
    if(cvReturn != kCVReturnSuccess) 
     NSLog(@"CVPixelBuffePoolCreatePixelBuffer: %d", cvReturn); 
    bufferCreatedCount++; 
    return pixelBuffer; 
} 

kiedy skończę przekazując bufor pikseli do appendPixelBuffer í zwolnij bufor pikseli za pomocą CVPixelBufferRelease. W żadnym momencie przed tym przejściem NULL nie nazywam markAsFinished, endSessionAtSourceTime lub finishWriting. Co więcej, sam adapter nie przechodzi NULL.

Większość przeczytanych przeze mnie wpisów mówi o tym, że pula jest nieobecna od początku z powodu źle skonfigurowanego adaptera, jednak mój jest tam, ale tylko przez krótki czas. Ktoś jeszcze widział to zachowanie?

+0

Czy kiedykolwiek byłeś w stanie to wykryć? Mając ten sam problem teraz. – RSully

+0

Wystąpił błąd wewnętrzny. Od tak dawna nie pamiętam, co to było. Dzięki. – davidbitton

+0

Moje hackowate rozwiązanie polega na ponownym zakodowaniu pierwszego bufora pikselowego, który czytałem przed jego dołączeniem, co wydaje się naprawić wewnętrzny problem, który miał adapter/pula. Próbuję jeszcze innych metod, ponieważ mi się to nie podoba. – RSully

Odpowiedz

3

Może się to zdarzyć w przypadku błędu adaptera bufora pikseli. Adapter bufora pikseli może przejść w stan błędu, ponieważ ramki są wypychane poza kolejnością lub w tym samym czasie prezentacji.

+0

Dziękuję. To jest dokładnie mój błąd. Podczas refaktoryzacji mojej bazy kodowej odwoływałem się do zmiennej, która nie jest już aktualizowana dla czasu prezentacji i skutkowała zwróceniem przez adapter wartości zerowej dla puli buforów pikseli. – Shiun

4

Miałem ten sam problem. Jak się zorientowałem, tak się dzieje, jeśli niektóre z CMTime s, wstawia się do appendPixelBuffer:withPresentationTime:, są równe. Może się tak zdarzyć na przykład, jeśli używasz CMTimeMakeWithSeconds ze zbyt grubą skalą czasową.

Powiązane problemy