AVAssetWriter可以使用透明度编写文件吗?

我用AVAssetWriter编写的每个文件都有一个黑色背景,如果我包含的图像不填充整个渲染区域。 有没有办法用透明度来书写? 这里是我用来获取像素缓冲区的方法:

- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image { CGSize size = self.renderSize; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; CVPixelBufferRef pxbuffer = NULL; CVPixelBufferPoolCreatePixelBuffer(NULL, self.adaptor.pixelBufferPool, &pxbuffer); CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer); if (status != kCVReturnSuccess){ NSLog(@"Failed to create pixel buffer"); } CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst); CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; } 

和AVAssetWriter代码:

 NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt:self.renderSize.width], AVVideoWidthKey, [NSNumber numberWithInt:self.renderSize.height], AVVideoHeightKey, nil]; AVAssetWriterInput* videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_32ARGB], kCVPixelBufferPixelFormatTypeKey, nil]; self.adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput sourcePixelBufferAttributes:bufferAttributes]; buffer = [self pixelBufferFromCGImage:[stickerImage CGImage]]; BOOL append_ok = YES; int j = 0; while (append_ok && j < totalFrames) { if (self.adaptor.assetWriterInput.readyForMoreMediaData) { CMTime frameTime = CMTimeMake(frameCount,(int32_t) fps); append_ok = [self.adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; if(!append_ok){ NSError *error = self.assetWriter.error; if(error!=nil) { NSLog(@"Unresolved error %@,%@.", error, [error userInfo]); } } } else { printf("adaptor not ready %d, %d\n", frameCount, j); [NSThread sleepForTimeInterval:0.1]; } j++; frameCount++; } if (!append_ok) { printf("error appending image %d times %d\n, with error.", frameCount, j); } 

总之,这是不可能的。 AVAssetWriter使用h264video编解码器输出。 h264video编解码器不支持alpha通道,所以你不幸的是运气不好。

更多涉及的解决scheme将涉及将alpha通道(透明度)渲染成灰度h264编码的video,并在查看时将擦除和alpha信息合并到一起。