2010-09-20 14 views
14

Me gustaría convertir un CGImage en CMSampleBufferRef y anexarlo a un AVAssetWriterInput utilizando el método appendSampleBuffer:. Logré obtener el CMSampleBufferRef usando el siguiente código, pero el appendSampleBuffer: simplemente devuelve NO cuando proporciono el resultado CMSampleBufferRef. ¿Qué estoy haciendo mal?¿Cómo convierto un CGImage a CMSampleBufferRef?

- (void) appendCGImage: (CGImageRef) frame 
{ 
    const int width = CGImageGetWidth(frame); 
    const int height = CGImageGetHeight(frame); 

    // Create a dummy pixel buffer to try the encoding 
    // on something simple. 
    CVPixelBufferRef pixelBuffer = NULL; 
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width, height, 
     kCVPixelFormatType_32BGRA, NULL, &pixelBuffer); 
    NSParameterAssert(status == kCVReturnSuccess && pixelBuffer != NULL); 

    // Sample timing info. 
    CMTime frameTime = CMTimeMake(1, 30); 
    CMTime currentTime = CMTimeAdd(lastSampleTime, frameTime); 
    CMSampleTimingInfo timing = {frameTime, currentTime, kCMTimeInvalid}; 

    OSStatus result = 0; 

    // Sample format. 
    CMVideoFormatDescriptionRef videoInfo = NULL; 
    result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, 
     pixelBuffer, &videoInfo); 
    NSParameterAssert(result == 0 && videoInfo != NULL); 

    // Create sample buffer. 
    CMSampleBufferRef sampleBuffer = NULL; 
    result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, 
     pixelBuffer, true, NULL, NULL, videoInfo, &timing, &sampleBuffer); 
    NSParameterAssert(result == 0 && sampleBuffer != NULL); 

    // Ship out the frame. 
    NSParameterAssert(CMSampleBufferDataIsReady(sampleBuffer)); 
    NSParameterAssert([writerInput isReadyForMoreMediaData]); 
    BOOL success = [writerInput appendSampleBuffer:frame]; 
    NSParameterAssert(success); // no go :(
} 

P.S. Sé que hay filtraciones de memoria en este código. He omitido parte del código por simplicidad.

Respuesta

7

Aha, me he perdido por completo la clase AVAssetWriterInputPixelBufferAdaptor que está hecha especialmente para conectar los búferes de píxeles en una entrada de escritor. Ahora el código funciona, incluso sin las cosas desordenadas CMSampleBuffer.

+3

Hola, ¿podrías postear el código que lo hace funcionar? – Ondrej

+2

Cualquier persona alguna vez encontrar una solución :-) – DogCoffee

+0

HI! ¿puedes compartir el código con nosotros? –