iOS AVCaptureSession - How to get/set the number of frames per second recorded?
To set the capture session frame rate, you have to set it on the device using device.activeVideoMinFrameDuration and device.activeVideoMaxFrameDuration (if necessary).
In Swift 4 you can do something like this:
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)")
}
}
}
And call it
device.set(frameRate: 60)
AVCaptureConnection's videoMinFrameDuration
is deprecated.
You can use AVCaptureDevice
properties to detect supported video frame rate ranges and can assign minimum and maximum frame rates using properties.
device.activeFormat.videoSupportedFrameRateRanges
return all video frame rates ranges supported by device.
device.activeVideoMinFrameDuration
and device.activeVideoMaxFrameDuration
can be used for specifying frame durations.
Do it like this
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()
}
You could use AVCaptureConnection
's videoMinFrameDuration
accessor to set the value.
See the AVCaptureConnection documentation
Consider output
be AVCaptureVideoDataOutput
object.
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);
More info, see my answer in this SO question