在iOS 5中使用AVFoundation设置最大帧速率

时间:2011-11-12 00:25:49

标签: ios avfoundation

我相信过去常常使用captureOutput.minFrameDuration。但是,这在iOS 5中已弃用。

相反,我显然需要使用AVCaptureConnection' s video.minFrameDuration。所以我有我的输入,我的输出,我将它们添加到捕获会话 - 我在哪里可以访问捕获连接?我认为它是由会议创建的,但在哪里?

我可以尝试使用addInputWithNoConnectionsaddOutputWithNoConnections添加I / O,然后手动创建连接。但是,设置最大帧速率似乎有点麻烦。此外,Xcode抱怨这些方法不存在。

4 个答案:

答案 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 *值中的视频帧速率已正确设置,上面的代码“记得”。

请注意,您需要将 videoMinFrameDurationvideoMaxFrameDuration设置为相同的值才能成功锁定帧速率 - 单独设置min似乎不起作用在iPhone 4s上测试时。这似乎没有记录。

约什

答案 1 :(得分:5)

AVCaptureConnection videoMinFrameDuration已弃用。使用AVCaptureDevice activeVideoMinFrameDuration / activeVideoMaxFrameDurationAVCaptureDevice类引用中的第一个代码段回答了这个问题。

答案 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);