我相信过去常常使用captureOutput.minFrameDuration
。但是,这在iOS 5中已弃用。
相反,我显然需要使用AVCaptureConnection
' s video.minFrameDuration
。所以我有我的输入,我的输出,我将它们添加到捕获会话 - 我在哪里可以访问捕获连接?我认为它是由会议创建的,但在哪里?
我可以尝试使用addInputWithNoConnections
和addOutputWithNoConnections
添加I / O,然后手动创建连接。但是,设置最大帧速率似乎有点麻烦。此外,Xcode抱怨这些方法不存在。
答案 0 :(得分:28)
(编辑 - 请参阅下面的Tomas Camin评论关于是否支持videoMinFrameDuration videoMaxFrameDuration的正确方法,尽管以下代码在发布时工作正常)
以下行可以访问与AVCaptureConnection
对象关联的AVCaptureVideoDataOutput
对象:
AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
if (conn.isVideoMinFrameDurationSupported)
conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (conn.isVideoMaxFrameDurationSupported)
conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
如果您正在使用(我是)didOutputSampleBuffer
代理,您可以确认传入代理的fromConnection
AVCaptureConnection *值中的视频帧速率已正确设置,上面的代码“记得”。
请注意,您需要将 videoMinFrameDuration
和videoMaxFrameDuration
设置为相同的值才能成功锁定帧速率 - 单独设置min似乎不起作用在iPhone 4s上测试时。这似乎没有记录。
约什
答案 1 :(得分:5)
AVCaptureConnection
videoMinFrameDuration
已弃用。使用AVCaptureDevice
activeVideoMinFrameDuration
/ activeVideoMaxFrameDuration
。 AVCaptureDevice类引用中的第一个代码段回答了这个问题。
答案 2 :(得分:2)
假设以下成员。
AVCaptureConnection *videoConnection;
AVCaptureVideoDataOutput *videoOutput;
AVCaptureDeviceInput *videoInput;
然后你会做类似以下的事情。我没有测试过这个。这只是阅读文档的猜测。
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ( videoDevice ) {
NSError *error;
videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
[captureSession addInput:videoInput];
}
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
//setup video options
if ([captureSession canAddOutput:videoOutput])
[captureSession addOutput:videoOutput];
videoConnection = [[AVCaptureConnection alloc] initWithInputPorts:captureSession.inputs output:videoOutput];
videoConnection.videoMinFrameDuration = CMTimeMake(1, frameRate);
[captureSession addConnection:videoConnection];
我还没有把自己的代码转换成这个。当我进行转换时,我会回复工作代码。如果您在captureSession中添加了多个输入,则可能需要将所需的输入显式加载到数组中。 e.g。
ports = [NSArray arrayWithObject:videoInput];
然后将其传递给AVCaptureConnection的初始化器。
答案 3 :(得分:0)
如Kiran所述,自iOS 7以来,AVCaptureConnection videoMinFrameDuration
已被弃用。
更具体地说,'更新'Apple's example:
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = ... // Following the example
// ** Create and Configure the Video Data Output **
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
output.videoSettings = @{
(NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)
};
device.activeVideoMinFrameDuration = CMTimeMake(1, 15);