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