2009-10-03 55 views
7

我正在实施一个软件来捕捉来自网络摄像头的视频。我在苹果开发中看到了MyRecorder示例,它工作正常。来自网络摄像头的可可捕捉框架

我试图添加一个按钮把从视频快照与此代码:

- (IBAction)addFrame:(id)sender 
{ 
    CVImageBufferRef imageBuffer; 
    @synchronized (self) { 
     imageBuffer = CVBufferRetain(mCurrentImageBuffer); 
    } 
    if (imageBuffer) { 
    [ bla bla bla ]  
    } 
} 

但mCurrentImageBuffer总是空空的。我怎样才能从我的摄像头采取当前帧,并把mCurrentImageBuffer?

我试着使用

(void)captureOutput:(QTCaptureOutput *)captureOutput 
        didOutputVideoFrame:(CVImageBufferRef)videoFrame 
        withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
        fromConnection:(QTCaptureConnection *)connection 
{ 
    CVImageBufferRef imageBufferToRelease; 

    CVBufferRetain(videoFrame); 

    @synchronized (self) { 
     imageBufferToRelease = mCurrentImageBuffer; 
     mCurrentImageBuffer = videoFrame; 
    } 
    CVBufferRelease(imageBufferToRelease); 
} 

但它从来没有所谓。如何确定何时调用captureOutput委托方法? 有什么想法?

感谢, 安德烈

+0

我搬到了QTCaptureDecompressedVideoOutput定义代码视频初始化结束,现在mCurrentImageBuffer不是空的,但没有视频被保存在磁盘上 – 2009-10-03 14:49:16

+0

的[imagesnap(http://iharder.sourceforge.net/current/ macosx/imagesnap /)开源项目是一个客观的C命令行工具,用于拍摄摄像头图片。 – 2012-12-12 07:02:56

回答

3

它看起来像你试图使用QTKit Capture API从你的摄像头捕捉视频。 MyRecorder示例应用程序几乎是使用此API可以实现的最简单的功能视频捕获程序。从您的描述中不清楚,但您需要确保您遵循他们的示例,并以与在MyRecorderController中的-awakeFromNib方法中相同的方式初始化您的视频会话。如果你不这样做,你将不会获得任何视频。

就您尝试使用的方法而言,-captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:QTCaptureDecompressedVideoOutput的委托方法。 MyRecorder示例中没有此类的实例,因为该示例仅将压缩视频记录到磁盘。要使用它,您需要创建一个QTCaptureDecompressedVideoOutput的实例,使用-addOutput:error:将其附加到您的QTCaptureSession,并将QTCaptureDecompressedVideoOutput实例的代理设置为您的类。

有关QTKit如何处理这类事情的更多信息,请参阅QTKit Application Programming GuideQTKit Capture部分。

+0

我已经在-awakeFromNib方法中声明了QTCaptureDecompressedVideoOutput,并将其添加到QTCaptureSession中,但在这种情况下,图像捕获工作正常,视频不保存在磁盘上。 – 2009-10-04 11:02:14

+0

问题是我有2种类型的addOutput:QTCaptureDecompressedVideoOutput来保存图像和mCaptureMovieFileOutput来存储视频。可能有2个输出或有我定义2 QTCaptureSession? – 2009-10-04 11:13:21

+0

您应该可以通过一路视频输入获得两路输出。 Apple在上面链接的QTKit指南中显示了此流程图。图像捕捉如何处理器密集?也许它不能从委托方法中快速返回,以便进行视频录制。默认情况下,视频捕捉使用H.264编码,这非常重要。您可以尝试将视频设置为QTCompressionOptions240SizeMPEG4Video并查看会发生什么情况。 – 2009-10-05 12:57:03

3

我试着使用

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
           didOutputVideoFrame:(CVImageBufferRef)videoFrame 
           withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
           fromConnection:(QTCaptureConnection *)connection 

但它从来没有所谓。

实现此方法的对象是捕获输出对象的委托吗?

+1

这是我的问题,我不明白这一步。 – 2009-10-04 10:36:17

+0

您需要成为捕获输出对象的代表。请参阅http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html和捕获输出对象的'setDelegate:'方法。 – 2009-10-04 18:37:29

+0

完美,我见过苹果示例(非常有用)谢谢! – 2009-10-05 07:55:27