2010-09-20 14 views
14

Chciałbym przekonwertować CGImage na CMSampleBufferRef i dołączyć go do AVAssetWriterInput przy użyciu metody appendSampleBuffer:. Udało mi się uzyskać CMSampleBufferRef przy użyciu następującego kodu, ale appendSampleBuffer: po prostu zwraca NO, gdy dostarczam wynikową CMSampleBufferRef. Co ja robię źle?Jak przekonwertować plik CGImage na 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. Wiem, że w tym kodzie są wycieki pamięci, pominąłem część kodu dla prostoty.

Odpowiedz

7

Aha, całkowicie pominąłem klasę AVAssetWriterInputPixelBufferAdaptor, która została stworzona specjalnie do wyprowadzania buforów pikseli do zapisu na pisarzu. Teraz kod działa, nawet bez bałaganu.

+3

Cześć, możesz napisać kod, który sprawi, że zadziała? – Ondrej

+2

Ktoś wymyślił rozwiązanie :-) – DogCoffee

+0

HI! czy możesz podzielić się z nami tym kodem? –

Powiązane problemy