Wie konvertiere ich eine CGImage zu CMSampleBufferRef?
Ich würde gerne konvertieren CGImage
zu CMSampleBufferRef
und fügen es ein AVAssetWriterInput
mit der appendSampleBuffer:
Methode. Ich habe es geschafft die CMSampleBufferRef
mit dem folgenden code, aber der appendSampleBuffer:
gibt einfach NO
wenn ich liefern die daraus resultierende CMSampleBufferRef
. Was mache ich falsch?
- (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ß, es gibt memory leaks in diesem code habe ich weggelassen, einige der code, der Einfachheit halber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aha, hab ich völlig verpasst den
AVAssetWriterInputPixelBufferAdaptor
Klasse, die speziell für das Pumpen des pixel-Puffer in ein writer-Eingang. Jetzt der code funktioniert, auch ohne die chaotischCMSampleBuffer
Zeug.