Comment puis-je convertir un CGImage à CMSampleBufferRef?
-
04-10-2019 - |
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é.
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