![](/img/trans.png)
[英]Setting a low frame rate of AVCaptureDevice in AVCaptureSession in Swift
[英]CaptureOutput delegate function to run as fast as AVCaptureDevice's frame rate
目前,我有一个带有AVCaptureVideoDataOutput的AVCaptureSession。 据我了解,每次相机捕获一帧时都会调用captureOutput委托函数。 默认情况下,这意味着将以30fps的速度调用captureOutput函数。
我还有一个CMMotionManager,用于在手机移动时存储数据。 运动管理器的运行速度约为90-100fps。
无论如何,我是否可以提高相机在帧中拍摄的fps,以便以与motionManager大致相同的速度调用captureOutput函数?
任何帮助,将不胜感激。
来自Apple 文档
以下代码示例说明了如何选择iOS设备的最高可能帧频
- (void)configureCameraForHighestFrameRate:(AVCaptureDevice *)device
{
AVCaptureDeviceFormat *bestFormat = nil;
AVFrameRateRange *bestFrameRateRange = nil;
for ( AVCaptureDeviceFormat *format in [device formats] ) {
for ( AVFrameRateRange *range in format.videoSupportedFrameRateRanges ) {
if ( range.maxFrameRate > bestFrameRateRange.maxFrameRate ) {
bestFormat = format;
bestFrameRateRange = range;
}
}
}
if ( bestFormat ) {
if ( [device lockForConfiguration:NULL] == YES ) {
device.activeFormat = bestFormat;
device.activeVideoMinFrameDuration = bestFrameRateRange.minFrameDuration;
device.activeVideoMaxFrameDuration = bestFrameRateRange.minFrameDuration;
[device unlockForConfiguration];
}
}
}
为了解决此问题,我更改了AVCaptureDevice的帧速率,就像本文中的最后一个答案一样: AVCapture捕获并在iOS 7中以60 fps的速度获取帧缓冲
为了使captureOutput函数以与摄像机相同的速度运行,您必须在更改AVCaptureDevice的帧频之前添加AVCaptureDeviceInput。
这就是Swift 3的代码最终外观:
do{
input = try AVCaptureDeviceInput(device: backCamera)
if (error == nil && (captureSession?.canAddInput(input))!)
{
captureSession?.addInput(input)
}
var finalFormat = AVCaptureDeviceFormat()
var maxFPS: Double = 0
for vformat in (backCamera?.formats)!{
var ranges = (vformat as AnyObject).videoSupportedFrameRateRanges as! [AVFrameRateRange]
let frameRates = ranges[0]
if frameRates.maxFrameRate >= maxFPS && frameRates.maxFrameRate <= 120.0{
maxFPS = frameRates.maxFrameRate
finalFormat = vformat as! AVCaptureDeviceFormat
}
}
if maxFPS != 0{
let timeValue = Int64(1200.0 / maxFPS)
let timeScale: Int64 = 1200
try backCamera!.lockForConfiguration()
backCamera!.activeFormat = finalFormat
//print("CAMER FPS: \(backCamera?.activeFormat.videoSupportedFrameRateRanges.description)\n")
backCamera!.activeVideoMinFrameDuration = CMTimeMake(timeValue, Int32(timeScale))
backCamera!.activeVideoMaxFrameDuration = CMTimeMake(timeValue, Int32(timeScale))
backCamera!.focusMode = AVCaptureFocusMode.autoFocus
backCamera!.unlockForConfiguration()
}
}catch{
print("Problem setting FPS\n")
exit(0)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.