2

我正在编写一个简单的类似视频信使的应用程序,因此我需要获得一些折衷尺寸的帧,以便能够适应可用带宽,并且仍然使捕获的图像不失真。

要检索帧,我正在使用 QTCaptureVideoPreviewOutput 类,并且我成功地在 didOutputVideoFrame 回调中获取帧。(我需要原始帧 - 主要是因为我使用的是自定义编码器,所以我只想获得“原始位图”)。

问题是,对于这些新的 iSight 相机,我得到了巨大的帧。

幸运的是,这些用于捕获原始帧的类 (QTCaptureVideoPreviewOutput) 提供了 setPixelBufferAttributes 方法,该方法允许指定我想要获取的帧类型。如果我有幸猜到相机支持的某个帧大小,我可以指定它,QTKit 会将相机切换到这个指定的模式。如果我不走运 - 我会得到一个模糊的图像(因为它被拉伸/收缩),而且很可能是不成比例的。

我一直在搜索 list.apple.com 和 stackoverflow.com,答案是“Apple 目前不提供检索相机原生帧大小的功能”。好吧,我对此无能为力。

也许我应该在设置中提供最常见的框架尺寸,用户必须尝试它们才能看到什么对他有用?但是这些常见的框架尺寸是多少?我在哪里可以获得 UVC 相机通常生成的框架尺寸列表?

为了测试我的应用程序,我使用的是符合 UVC 的相机,但不是 iSight。我假设不是每个用户都在使用 iSight,而且我确信即使在不同型号的 iSight 相机之间也有不同的框架尺寸。

或者,也许,我应该将相机切换到默认模式,生成几帧,看看它生成了什么尺寸,至少我会有一些比例?这看起来像一个真正的黑客,似乎并不自然。并且图像很可能会再次模糊。

你能帮我吗,你是如何处理这个问题的?我确信我不是第一个面对它的人。你会选择什么方法?谢谢你,詹姆斯

4

1 回答 1

0

你是对的,iSight 相机产生巨大的帧。但是,我怀疑您可以通过设置像素缓冲区属性将相机切换到不同的模式。您更有可能在 QTCaptureVideoPreviewOutput 中设置处理帧的模式。如果您还没有这样做,请查看 QTCaptureDecompressedVideoOutput。我们还使用样本缓冲区来获取帧大小。所以,我不会说这是一个黑客。一种更自然的方法是制作您自己的 Quicktime 组件来实现您的自定义编码算法。在这种情况下,Quicktime 将能够在捕获会话期间在 QTCaptureMovieFileOutput 内部使用。这将是一种正确的方式,但也是一种艰难的方式。

于 2011-08-26T05:29:29.210 回答