在 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 中已被弃用。
相反,我显然需要使用AVCaptureConnection
的video.minFrameDuration
。所以我有我的输入,我的输出,我将它们都添加到捕获会话中 - 我在哪里可以访问捕获连接?我认为它是由会话为我创建的,但是在哪里?
我可以尝试使用addInputWithNoConnections
和addOutputWithNoConnections
添加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 videoMinFrameDuration
和 videoMaxFrameDuration
设置为相同的值才能成功钳制帧速率——在iPhone 4s。这似乎没有记录在案。
乔什
【讨论】:
太棒了!谢谢乔希。而且我还发现在 iPhone 4 和 4S 上都需要设置 videoMinFrameDuration 和 videoMaxFrameDuration。 我希望我能给你10分!旧的不推荐使用的方法在 4.3 中可以正常工作,我在找到这个线程之前浪费了很多时间!如果有人想复制它,我只是一个错误报告:Bug ID# 10524664。 请注意,检查是否支持videoMinFrameDuration
和videoMinFrameDuration
的正确方法是使用[AVCaptureConnection isVideoMinFrameDurationSupported]
和[AVCaptureConnection isVideoMaxFrameDurationSupported]
我正在使用 iOS SDK 5.1:[AVCaptureConnection isVideoMinFrameDurationSupported]
和 [AVCaptureConnection isVideoMaxFrameDurationSupported]
不存在,而是属性 conn.isVideoMinFrameDurationSupported
和 conn.isVideoMaxFrameDurationSupported
。【参考方案2】:
AVCaptureConnection
videoMinFrameDuration
已弃用。使用AVCaptureDevice
activeVideoMinFrameDuration
/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 中录制音频?