如标题所述。
我用谷歌和 Stackoverflow 搜索,所有资源都用于 UIImage 转换,或者从 CVPixelBufferRef 转换 NSImage。现在我想做的是将 JPEG 原始数据转换为 CVPixelBufferRef,这样我就可以生成带有实时 jpeg 流的电影文件。
如标题所述。
我用谷歌和 Stackoverflow 搜索,所有资源都用于 UIImage 转换,或者从 CVPixelBufferRef 转换 NSImage。现在我想做的是将 JPEG 原始数据转换为 CVPixelBufferRef,这样我就可以生成带有实时 jpeg 流的电影文件。
您可以使用以下方法将 from 转换NSImage
为CVPixelBufferRef
:
- (CVPixelBufferRef)newPixelBufferFromNSImage:(NSImage*)image
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
NSDictionary* pixelBufferProperties = @{(id)kCVPixelBufferCGImageCompatibilityKey:@YES, (id)kCVPixelBufferCGBitmapContextCompatibilityKey:@YES};
CVPixelBufferRef pixelBuffer = NULL;
CVPixelBufferCreate(kCFAllocatorDefault, [image size].width, [image size].height, k32ARGBPixelFormat, (__bridge CFDictionaryRef)pixelBufferProperties, &pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
void* baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
CGContextRef context = CGBitmapContextCreate(baseAddress, [image size].width, [image size].height, 8, bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst);
NSGraphicsContext* imageContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:imageContext];
[image compositeToPoint:NSMakePoint(0.0, 0.0) operation:NSCompositeCopy];
[NSGraphicsContext restoreGraphicsState];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CFRelease(context);
CGColorSpaceRelease(colorSpace);
return pixelBuffer;
}
生成的缓冲区可以附加到AVAssetWriter
viaAVAssetWriterInputPixelBufferAdaptor
的appendPixelBuffer::