【问题标题】:QTKit capture: what frame size to use?QTKit 捕获:使用什么帧大小?
【发布时间】:2011-08-25 02:26:03
【问题描述】:

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

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

问题在于,对于这些新的 iSight 相机,我得到的画面确实很大。

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

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

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa qtkit


    【解决方案1】:

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

    【讨论】:

    • 我已经尝试过 QTCaptureVideoPreviewOutput 和 QTCaptureDecompressedVideoOutput。 QTKit '明智地'选择了相机的模式,至少这就是开发人员在他们的邮件列表上所说的:它足够聪明地设置相机模式,这需要最少的 cpu 功率来将其转换为请求的像素格式。你能解释一下你正在使用的这个“样本缓冲区”的想法吗?你是怎么做到的?谢谢。
    • 您可以访问单帧视频或音频数据包。查看 [QTCaptureFileOutput captureOutput:didOutputSampleBuffer:fromConnection:] 的文档。我们主要使用它来将捕获的视频切割成块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多