16

我是 AVCaptureSession 的新手,希望更好地了解如何使用它。所以我设法将视频流捕获为单独的 CIImages 并将它们转换为 UIImages。现在我希望能够获得每秒捕获的帧数,并且最好能够设置它。

知道怎么做吗?

4

4 回答 4

21

AVCaptureConnection's videoMinFrameDuration已弃用。

您可以使用AVCaptureDevice属性来检测支持的视频帧速率范围,并可以使用属性分配最小和最大帧速率。

device.activeFormat.videoSupportedFrameRateRanges返回设备支持的所有视频帧率范围。

device.activeVideoMinFrameDuration并可device.activeVideoMaxFrameDuration用于指定帧持续时间。

于 2016-05-26T06:09:25.617 回答
13

您可以使用AVCaptureConnection'videoMinFrameDuration访问器来设置值。

请参阅AVCaptureConnection 文档

考虑output成为AVCaptureVideoDataOutput对象。

AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];

if (conn.isVideoMinFrameDurationSupported)
    conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (conn.isVideoMaxFrameDurationSupported)
    conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);

更多信息,请参阅我在这个SO 问题中的回答

于 2012-12-26T10:55:52.630 回答
11

要设置捕获会话帧速率,您必须在设备上使用device.activeVideoMinFrameDurationdevice.activeVideoMaxFrameDuration(如有必要)进行设置。

Swift 4中,您可以执行以下操作:

extension AVCaptureDevice {
    func set(frameRate: Double) {
    guard let range = activeFormat.videoSupportedFrameRateRanges.first,
        range.minFrameRate...range.maxFrameRate ~= frameRate
        else {
            print("Requested FPS is not supported by the device's activeFormat !")
            return
    }

    do { try lockForConfiguration()
        activeVideoMinFrameDuration = CMTimeMake(value: 1, timescale: Int32(frameRate))
        activeVideoMaxFrameDuration = CMTimeMake(value: 1, timescale: Int32(frameRate))
        unlockForConfiguration()
    } catch {
        print("LockForConfiguration failed with error: \(error.localizedDescription)")
    }
  }
}

并称它为

device.set(frameRate: 60)
于 2019-02-11T16:40:23.100 回答
1

像这样做

if let frameSupportRange = currentCamera.activeFormat.videoSupportedFrameRateRanges.first {
    captureSession.beginConfiguration()
    // currentCamera.activeVideoMinFrameDuration = CMTimeMake(1, Int32(frameSupportRange.maxFrameRate))
    currentCamera.activeVideoMinFrameDuration = CMTimeMake(1, YOUR_FPS_RATE)
    captureSession.commitConfiguration()
}
于 2018-08-01T07:22:08.327 回答