2011-06-20 13 views
8

Estoy usando pixelBufferPool dentro de un AVAssetWriterInputPixelBufferAdaptor para crear memorias intermedias de píxeles para usar con el método append. Después de crear 4 búferes, la propiedad pixelBufferPool pasa a ser NULL;AVAssetWriterInputPixelBufferAdaptor pixelBufferPool va NULL después de algún tiempo

configuración que mi escritor, y el adaptador de entrada como esta:

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

y les reparto buffers de píxeles con esto:

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

cuando he terminado de pasar el búfer de píxeles para appendPixelBuffer i suelte el buffer de píxeles con CVPixelBufferRelease. En ningún momento antes de que esto pase a NULL llamo markAsFinished, endSessionAtSourceTime o finishWriting. Además, el adaptador en sí no pasa a NULL.

La mayoría de las publicaciones que he leído hablan sobre la ausencia de la agrupación desde el principio debido a un adaptador mal configurado, sin embargo, el mío está ahí, pero solo por un corto tiempo. ¿Alguien más ha visto este comportamiento?

+0

¿Alguna vez pudo rastrear esto? Tener el mismo problema ahora. – RSully

+0

Hubo un error interno. Ha pasado tanto tiempo ahora que no recuerdo lo que era. Gracias. – davidbitton

+0

Mi solución hacky es recodificar el primer buffer de píxeles que leí antes de agregarlo, lo que parece solucionar el problema interno del adaptador/grupo. Todavía estoy probando otros métodos porque no me gusta eso. – RSully

Respuesta

3

Puede suceder en caso de un error del adaptador de memoria intermedia de píxeles. El adaptador de memoria intermedia de píxeles puede pasar al estado de error debido a que los marcos están fuera de servicio o con el mismo tiempo de presentación.

+0

Gracias. Este es exactamente mi error. En mi refactorización de mi base de código, estaba haciendo referencia a una variable que ya no se está actualizando para el tiempo de presentación y el resultado es que el adaptador devuelve un valor nulo para el grupo de búferes de píxeles. – Shiun

4

Tuve el mismo problema. Como descubrí, esto sucede, si algunos de los CMTime s, pones en appendPixelBuffer:withPresentationTime:, son iguales. Esto puede suceder, por ejemplo, si usa CMTimeMakeWithSeconds con una escala de tiempo demasiado gruesa.

Cuestiones relacionadas