【发布时间】:2010-10-02 15:19:29
【问题描述】:
我要疯了 - 到处找,尝试了所有我能想到的东西。
我正在制作一个使用 AVFoundation 的 iPhone 应用程序 - 特别是 AVCapture 以使用 iPhone 摄像头捕捉视频。
我需要在录制的视频源上叠加一个自定义图像。
到目前为止,我已经设置了 AVCapture 会话,可以显示提要、访问框架、将其保存为 UIImage 并将覆盖图像添加到上面。然后将这个新的 UIImage 转换为 CVPixelBufferRef。为了仔细检查 bufferRef 是否正常工作,我将它转换回 UIImage,它仍然可以正常显示图像。
当我尝试将 CVPixelBufferRef 转换为 CMSampleBufferRef 以附加到 AVCaptureSessionsassetWriterInput 时,问题就开始了。当我尝试创建 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 包装的需要。但是,我已经搜索了堆栈和苹果开发人员论坛和文档,但找不到关于如何设置或如何使用它的清晰描述或示例。如果有人有一个可行的例子,请给我看或帮我解决上述问题 - 一直在不停地研究这个问题一个星期,我束手无策。
如果您需要任何其他信息,请告诉我
提前致谢,
迈克尔
【问题讨论】:
-
很抱歉缺少代码格式——在预览中看起来很好:S
标签: iphone xcode avfoundation avcapturesession avcapture