簡體   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