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

Posted

技术标签:

【中文标题】在 iOS 5 中使用 AVFoundation 设置最大帧速率【英文标题】:Set maximum frame rate with AVFoundation in iOS 5 【发布时间】:2011-11-12 00:25:49 【问题描述】:

我相信这曾经是通过 captureOutput.minFrameDuration 完成的。但是,这在 ios 5 中已被弃用。

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

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

【问题讨论】:

【参考方案1】:

克里斯,我想我已经解决了这个问题:

(编辑——请参阅下面 Tomas Camin 的评论,了解检查是否支持 videoMinFrameDuration videoMaxFrameDuration 的正确方法,尽管下面的代码在发布时工作正常)

下面的行允许访问与AVCaptureVideoDataOutput 对象关联的AVCaptureConnection 对象:

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

请注意,您需要将 both videoMinFrameDurationvideoMaxFrameDuration 设置为相同的值才能成功钳制帧速率——在iPhone 4s。这似乎没有记录在案。

乔什

【讨论】:

太棒了!谢谢乔希。而且我还发现在 iPhone 4 和 4S 上都需要设置 videoMinFrameDuration 和 videoMaxFrameDuration。 我希望我能给你10分!旧的不推荐使用的方法在 4.3 中可以正常工作,我在找到这个线程之前浪费了很多时间!如果有人想复制它,我只是一个错误报告:Bug ID# 10524664。 请注意,检查是否支持videoMinFrameDurationvideoMinFrameDuration 的正确方法是使用[AVCaptureConnection isVideoMinFrameDurationSupported][AVCaptureConnection isVideoMaxFrameDurationSupported] 我正在使用 iOS SDK 5.1:[AVCaptureConnection isVideoMinFrameDurationSupported][AVCaptureConnection isVideoMaxFrameDurationSupported] 不存在,而是属性 conn.isVideoMinFrameDurationSupportedconn.isVideoMaxFrameDurationSupported【参考方案2】:

AVCaptureConnection videoMinFrameDuration 已弃用。使用AVCaptureDeviceactiveVideoMinFrameDuration/activeVideoMaxFrameDuration。 AVCaptureDevice 类参考中的第一个代码 sn-p 回答了这个问题。

【讨论】:

AVCaptureConnection videoMinFrameDuration 在 OS X 10.9 上运行良好,没有警告。 @KareMorstol 这个问题的标题和标签都是 ios。不是osx。因此是 ios 特定的答案。更多信息请参见SO 问题。【参考方案3】:

假设有以下成员。

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 添加了多个输入,则可能需要将所需的输入显式加载到数组中。例如

ports = [NSArray arrayWithObject:videoInput];

然后将其传递给 AVCaptureConnection 的初始化程序。

【讨论】:

谢谢史蒂夫,我的编译器抱怨 AVCaptureConnection 的 initWithInputPorts? 我不知道为什么。我引用了AVCaptureConnection 文档。正如我所说,我没有测试这段代码。我只看文档就“盲目地”写了它。 joshgreifer 看起来有一个更清洁的解决方案。 AVCaptureVideoDataOutput 继承自具有 connectionWithMediaType 消息的 AVCaptureOutput @chris838 它在抱怨initWithInputPorts,因为该方法仅适用于 Mac OS X v10.7 及更高版本。【参考方案4】:

正如 Kiran 所说,AVCaptureConnection videoMinFrameDuration 自 iOS 7 以来已被弃用。

更具体地说,“更新”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);

【讨论】:

以上是关于在 iOS 5 中使用 AVFoundation 设置最大帧速率的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中使用 AVFoundation 切换相机后视频录制不起作用

IOS开发中AVFoundation中AVAudioPlayer的使用

有没有办法在不使用 AVFoundation 框架的情况下在 iOS 中录制音频?

使用 AVFoundation 裁剪 AVAsset 视频不工作 iOS 8

使用 AVFoundation 在 iOS 上录制音频样本

使用 AVFoundation 在单个界面中捕获多个图像