2010-09-20 8 views
14

Ich möchte eine CGImage in CMSampleBufferRef konvertieren und an eine AVAssetWriterInput unter Verwendung der appendSampleBuffer: Methode anhängen. Ich habe es geschafft, die CMSampleBufferRef mit dem folgenden Code zu bekommen, aber die appendSampleBuffer: gibt einfach NO zurück, wenn ich die resultierende CMSampleBufferRef liefern. Was mache ich falsch?Wie konvertiere ich ein CGImage zu 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. Ich weiß, dass es in diesem Code Speicherlecks gibt, ich habe einiges aus Gründen der Einfachheit weggelassen.

Antwort

7

Aha, ich habe die Klasse AVAssetWriterInputPixelBufferAdaptor komplett verpasst, die speziell dafür gemacht wurde, die Pixelpuffer in einen Writer-Eingang zu leiten. Jetzt funktioniert der Code, auch ohne die unordentlichen CMSampleBuffer Sachen.

+3

Hallo, könnten Sie bitte den Code poste, der es funktioniert? – Ondrej

+2

Wer jemals eine Lösung herausfinden :-) – DogCoffee

+0

HI! Kannst du den Code bitte mit uns teilen? –