Objective c 来自网络摄像头的cocoa捕获帧

Objective c 来自网络摄像头的cocoa捕获帧,objective-c,cocoa,macos,video-capture,Objective C,Cocoa,Macos,Video Capture,我正在实施一个软件,从网络摄像头caputre视频。我在Apple Dev中看到了MyRecorder示例,它运行良好 我尝试添加一个按钮,用以下代码从视频中拍摄快照: - (IBAction)addFrame:(id)sender { CVImageBufferRef imageBuffer; @synchronized (self) { imageBuffer = CVBufferRetain(mCurrentImageBuffer); } i

我正在实施一个软件,从网络摄像头caputre视频。我在Apple Dev中看到了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委托方法? 有什么想法吗

谢谢, 安德烈

我试着用

- (void)captureOutput:(QTCaptureOutput *)captureOutput 
                                didOutputVideoFrame:(CVImageBufferRef)videoFrame 
                                withSampleBuffer:(QTSampleBuffer *)sampleBuffer 
                                fromConnection:(QTCaptureConnection *)connection
但从来没有人打过电话


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

看起来您正试图使用QTKit捕获API从网络摄像头捕获视频。MyRecorder示例应用程序是使用此API可以制作的功能最简单的视频捕获程序。您的描述并不清楚,但您需要确保遵循他们的示例,并按照MyRecorderController中的
-awakeFromNib
方法初始化视频会话。如果你不这样做,你将不会得到任何被捕获的视频

就您尝试使用的方法而言,
-captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:
QTcaptureDecompressedDVideOutput
的委托方法。MyRecorder示例中不存在此类的实例,因为该示例仅将压缩视频录制到磁盘。要使用此方法,您需要创建
qtcapturedcompresseddvideoutput
的实例,使用
-addOutput:error:
将其附加到
qtcapturedcompresseddvideoutput
会话中,并将
qtcapturedevideoutput
实例的委托设置为您的类


有关QTKit如何处理此类问题的更多信息,请参阅。

我已在视频初始化结束时移动了QTCaptureDecompressedDVideOutput定义代码,现在mCurrentImageBuffer不是空的,但是没有视频保存在磁盘上。开源项目是一个objective-C命令行工具,用于拍摄网络摄像头图片。这是我的问题,我不太理解这一步。你需要成为捕获输出对象的代表。请参阅和捕获输出对象的
setDelegate:
方法。在我的情况下,在调用
setDelegate:
之前,我忘记创建
qtcapturedcompressedvideooutput
对象。如下所示:
videOutput=[[qtcapturedcompresseddvideoutput alloc]init];[VideoOutput setDelegate:self]我已经声明了qtcapturedcompresseddvideoutput on-awakeFromNib方法,并将其添加到QTCaptureSession中,但在这种情况下,图像捕获工作正常,视频无法保存在磁盘上。问题是我有两种类型的添加输出:qtcapturedcompresseddvideoutput保存图像和mCaptureMovieFileOutput存储视频。可以有2个输出,还是我需要定义2个QTCaptureSession?一个视频输入应该可以有两个输出。苹果在上面链接的QTKit指南中显示了这方面的流程图。图像捕获的处理器密集度如何?可能它从委托方法返回的速度不够快,无法进行视频录制。默认情况下,视频捕获使用相当繁重的H.264编码。您可以尝试将视频设置为QTCompressionOptions 240SizeTempeg4Video,然后看看会发生什么。我已经修改了初始化-awakeFromNib过程,现在可以使用2个输出。我已经为QTCaptureDecompressedDVideOutput实现了委托,但处理器是60/70%,因为每个帧都调用委托方法。但结果是可以接受的。仅当按下捕获键时才可以调用委托?为什么不使用一个布尔实例变量,当按下捕获键时该变量被设置为“是”?您可以在委托方法中检查此实例变量,并仅在该变量设置为“是”时运行捕获代码。