Objective c 来自网络摄像头的cocoa捕获帧
我正在实施一个软件,从网络摄像头caputre视频。我在Apple Dev中看到了MyRecorder示例,它运行良好 我尝试添加一个按钮,用以下代码从视频中拍摄快照: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
- (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%,因为每个帧都调用委托方法。但结果是可以接受的。仅当按下捕获键时才可以调用委托?为什么不使用一个布尔实例变量,当按下捕获键时该变量被设置为“是”?您可以在委托方法中检查此实例变量,并仅在该变量设置为“是”时运行捕获代码。