Question

Je voudrais convertir un CGImage à CMSampleBufferRef et l'ajouter à un AVAssetWriterInput en utilisant la méthode de appendSampleBuffer:. J'ai réussi à obtenir le CMSampleBufferRef en utilisant le code suivant, mais le appendSampleBuffer: retourne simplement NO quand je l'offre la CMSampleBufferRef résultant. Qu'est-ce que je fais mal?

- (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. Je sais qu'il ya des fuites de mémoire dans ce code, j'ai omis une partie du code pour la simplicité.

Était-ce utile?

La solution

Aha, je l'ai complètement raté AVAssetWriterInputPixelBufferAdaptor classe qui est fait spécialement pour canalisant les tampons de pixels dans une entrée d'écrivain. Or, les œuvres de code, même sans les trucs de CMSampleBuffer désordre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top