3

我正在从网络摄像头录制。相机在 PhotoBooth 中看起来很棒。但是,当我在我的程序中使用 QTCaptureView 预览它,或者将它记录到文件中时,它非常非常慢。原因是 QuickTime 为我提供了 1600x1200 的最大可能分辨率。如何为我的 QTCaptureView 和我的录制文件强制一个更合理的大小?

4

3 回答 3

7

如此处所述,您可以在 QTCaptureSession 的输出中设置像素缓冲区属性,以更改正在捕获的视频的分辨率。例如:

[[[myCaptureSession outputs] objectAtIndex:0] setPixelBufferAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                                [NSNumber numberWithInt:480], kCVPixelBufferHeightKey,
                                                                [NSNumber numberWithInt:640], kCVPixelBufferWidthKey, nil]];

将捕获会话中第一个输出的视频分辨率设置为 640x480。这也应该调整相机设置本身,使其返回该大小的图像帧(如果相机硬件支持)。

您可能还希望使用基本 MPEG4 编码而不是 h.264 来进行实时视频录制。这可以使用类似于以下的代码进行设置:

NSArray *outputConnections = [mCaptureMovieFileOutput connections];
QTCaptureConnection *connection;
for (connection in outputConnections)
{
    if ([[connection mediaType] isEqualToString:QTMediaTypeVideo])
            [mCaptureMovieFileOutput setCompressionOptions:[QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsSD480SizeMPEG4Video"] forConnection:connection];
}

h.264 编码,尤其是 Quicktime 实现,使用比基本 MPEG4 更多的 CPU 能力进行编码。

于 2009-04-29T18:21:41.073 回答
3

上面的解决方案 (setPixelBufferAttributes:) 确实正确设置了预览大小,但是一旦电影录制开始,如果您设置了(几乎)任何压缩选项,预览图像将恢复为原始值(我的 MBP 上为 1280 x 1024) .

如果这只是在电影录制期间,那将是一回事,但是一旦录制完成,对 setPixelBufferAttributes 的进一步调用将无效。

因此,只要您不打算进行任何实际的压缩电影录制,您就可以更改预览图像的大小。

这是在 10.5.8/9L30、MBP 和 GeForce 8600M 上。除无压缩或 QTCompressionOptionsSD240SizeH264Video 中断之外的任何压缩选项,如上所述。

rdar://7447812

于 2009-12-06T18:09:28.753 回答
0

要添加有关该主题的更多信息:

您不能直接在捕获端指定定义。相反,这是定义定义的捕获会话的输出。例如

  • 如果你捕捉到一个 QtCaptureDecompressedVideoOutput,你应该在这个对象上指定定义。
于 2011-05-13T21:42:57.703 回答