我正在从网络摄像头录制。相机在 PhotoBooth 中看起来很棒。但是,当我在我的程序中使用 QTCaptureView 预览它,或者将它记录到文件中时,它非常非常慢。原因是 QuickTime 为我提供了 1600x1200 的最大可能分辨率。如何为我的 QTCaptureView 和我的录制文件强制一个更合理的大小?
3 回答
如此处所述,您可以在 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 能力进行编码。
上面的解决方案 (setPixelBufferAttributes:) 确实正确设置了预览大小,但是一旦电影录制开始,如果您设置了(几乎)任何压缩选项,预览图像将恢复为原始值(我的 MBP 上为 1280 x 1024) .
如果这只是在电影录制期间,那将是一回事,但是一旦录制完成,对 setPixelBufferAttributes 的进一步调用将无效。
因此,只要您不打算进行任何实际的压缩电影录制,您就可以更改预览图像的大小。
这是在 10.5.8/9L30、MBP 和 GeForce 8600M 上。除无压缩或 QTCompressionOptionsSD240SizeH264Video 中断之外的任何压缩选项,如上所述。
rdar://7447812
要添加有关该主题的更多信息:
您不能直接在捕获端指定定义。相反,这是定义定义的捕获会话的输出。例如
- 如果你捕捉到一个 QtCaptureDecompressedVideoOutput,你应该在这个对象上指定定义。