我正在使用此代码使用AVAssetWriter从不同的uiimages创建电影。代码工作得很好,但问题是当我将图像添加到编写器时,Alpha通道已经消失。我无法弄清楚CVPixelBufferRef中是否存在alpha或AVAssetWriter无法处理。
我的最终结果不是具有Alpha通道但是多个图像相互叠加并且合并在电影文件中的电影。我可以在一帧中将图像放在其他图像的顶部,但所有图像(像素缓冲区)都有黑色背景......
- (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image andSize:(CGSize) size {
@autoreleasepool {
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width,
size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
&pxbuffer);
NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata != NULL);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
NSParameterAssert(context);
CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}
}
答案 0 :(得分:0)
这永远不会起作用,因为h.264不支持alpha通道。您无法使用内置的iOS逻辑(故事结束)使用Alpha通道对电影进行编码。但是,可以在编码之前合成图层。也可以使用支持alpha通道的第三方库编写编码。有关详细信息,请参阅this question。