繁体   English   中英

CaptureOutput委托函数以与AVCaptureDevice的帧速率一样快的速度运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM