这个问题让我快要发疯了——我已经到处查找并尝试了所有我能想到的方法。
我正在制作一个使用AVFoundation的iPhone应用程序,具体来说是使用iPhone相机捕获视频。
我需要在录制中包含覆盖在视频上的自定义图像。
到目前为止,我已经设置好了AVCapture会话,可以显示视频源,访问帧,将其保存为UIImage,并将覆盖图像合并到其中。然后将这个新的UIImage转换为CVPixelBufferRef。最后,为了确保bufferRef工作正常,我将其转换回UIImage,它仍然可以正常显示。
当我尝试将CVPixelBufferRef转换为CMSampleBufferRef以附加到AVCaptureSessions assetWriterInput时,问题就开始了。每当我尝试创建它时,CMSampleBufferRef总是返回NULL。
这里是-(void)captureOutput函数
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
UIImage *botImage = [self imageFromSampleBuffer:sampleBuffer];
UIImage *wheel = [self imageFromView:wheelView];
UIImage *finalImage = [self overlaidImage:botImage :wheel];
//[previewImage setImage:finalImage]; <- works -- the image is being merged into one UIImage
CVPixelBufferRef pixelBuffer = NULL;
CGImageRef cgImage = CGImageCreateCopy(finalImage.CGImage);
CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
int status = CVPixelBufferCreateWithBytes(NULL,
self.view.bounds.size.width,
self.view.bounds.size.height,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
if(status == 0){
OSStatus result = 0;
CMVideoFormatDescriptionRef videoInfo = NULL;
result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
NSParameterAssert(result == 0 && videoInfo != NULL);
CMSampleBufferRef myBuffer = NULL;
result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,
pixelBuffer, true, NULL, NULL, videoInfo, NULL, &myBuffer);
NSParameterAssert(result == 0 && myBuffer != NULL);//always null :S
NSLog(@"Trying to append");
if (!CMSampleBufferDataIsReady(myBuffer)){
NSLog(@"sampleBuffer data is not ready");
return;
}
if (![assetWriterInput isReadyForMoreMediaData]){
NSLog(@"Not ready for data :(");
return;
}
if (![assetWriterInput appendSampleBuffer:myBuffer]){
NSLog(@"Failed to append pixel buffer");
}
}
}
另一个我经常听到的解决方案是使用AVAssetWriterInputPixelBufferAdaptor,它消除了需要进行混乱的CMSampleBufferRef封装的必要性。然而,我已经搜索了Stacked和苹果开发者论坛以及文档,但无法找到清晰的描述或示例来设置它或如何使用它。如果有人有它的工作示例,请向我展示或帮助我解决上述问题-我已经不停地工作了一个星期,现在快崩溃了。
如果您需要其他信息,请告诉我。
提前致谢,
迈克尔