我正在编写一个简单的类似视频信使的应用程序,因此我需要获得一些折衷大小的帧,以便能够适应可用带宽,并且仍然要使捕获的图像不失真。
为了检索帧,我正在使用QTCaptureVideoPreviewOutput类,并且我成功地在didOutputVideoFrame回调中获取帧。(我需要原始帧 - 主要是因为我使用的是自定义编码器,所以我只想获得"原始位图")。
问题是,对于这些新的iSight相机,我得到了巨大的框架。
幸运的是,这些用于捕获原始帧的类(QTCaptureVideoPreviewOutput)提供了方法setPixelBufferAttributes,该方法允许指定我想获得的帧类型。如果我有幸猜到相机支持的一些帧大小,我可以指定它,QTKit 会将相机切换到此指定模式。如果我运气不好 - 我得到一个模糊的图像(因为它被拉伸/缩小),而且很可能是不成比例的。
我一直在搜索 lists.apple.com,stackoverflow.com,答案是"Apple目前不提供检索相机本机帧尺寸的功能"。好吧,我对此无能为力。
也许我应该在设置中提供最常见的帧尺寸,用户必须尝试它们才能看到什么对他有用?但是这些常见的框架尺寸是什么?我在哪里可以获得UVC相机通常生成的框架尺寸列表?
为了测试我的应用程序,我使用的是符合UVC标准的相机,而不是iSight。我假设也不是每个用户都在使用iSight,而且我确信即使在不同型号之间,iSight相机也具有不同的框架尺寸。
或者,也许,我应该将相机切换到默认模式,生成几帧,看看它生成什么尺寸,至少我会有一些比例?这看起来像是一个真正的黑客,似乎并不自然。而且图像很可能会再次模糊。
你能帮帮我吗,你是如何处理这个问题的?我相信我不是第一个面对它的人。你会选择什么方法?谢谢詹姆斯
你是对的,iSight 相机会产生巨大的帧。但是,我怀疑您可以通过设置像素缓冲区属性将相机切换到其他模式。您更有可能在 QTCaptureVideoPreviewOutput 中设置处理帧的模式。看看QTCaptureDecompressedVideoOutput,如果你还没有这样做。我们还使用样本缓冲区来获取帧大小。所以,我不会说这是一个黑客。更自然的方法是制作自己的 Quicktime 组件来实现您的自定义编码算法。在这种情况下,Quicktime可以在捕获会话期间在QTCaptureMovieFileOutput中使用。这将是一条适当的方式,但也是一种艰难的方式。