在视频缩放功能的实现中介绍了通过捕捉设备activeFormat属性中的videoMaxZoomFactor来获取视频最大缩放倍数的方法.除此之外,还可以通过设备的formats属性获取设备所有支持的格式.formats是一个数组,其中的每个AVCaptureDeviceFormat实例都有一个videoSupportedFrameRateRanges属性,该属性包括了一个AVFrameRateRange数组,其中包含了格式所支持的最小帧率,最大帧率和时长信息.
使用高帧率捕捉就是找到设备最高的质量格式及相关帧时长,之后进行手动设置.具体的代码参见HighFPS.
核心代码
判断当前视频设备是否支持高帧率视频采集
extension AVCaptureDevice{
//如果当前设备是否支持高帧率捕捉,则返回对应的高帧率format
func maxFPSFormat() -> (AVCaptureDeviceFormat,AVFrameRateRange)? {
//1. 判断是否是视频设备
if !self.hasMediaType(AVMediaTypeVideo) {
return nil
}
//2. 遍历找到最大的支持帧率
var maxFrameRateRange:AVFrameRateRange!
var maxFormat:AVCaptureDeviceFormat!
for format in self.formats as! [AVCaptureDeviceFormat] {
let codecType = CMFormatDescriptionGetMediaSubType(format.formatDescription)
if codecType == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange {
let frameRateRanges = format.videoSupportedFrameRateRanges as! [AVFrameRateRange]
for range in frameRateRanges {
if range.maxFrameRate > maxFrameRateRange?.maxFrameRate {
maxFrameRateRange = range
maxFormat = format
}
}
}
}
if maxFrameRateRange.maxFrameRate > 30 {
return (maxFormat,maxFrameRateRange)
}
return nil
}
}
激活高帧率视频捕捉
//激活高帧率捕捉
func startHighFPSCapture() {
let device = self.videoInput.device
//6plus真机实测最高支持240FPS的视频录制
if let (maxFormat,maxFrameRateRange) = device.maxFPSFormat() {
if ((try? device.lockForConfiguration()) != nil) {
//处理帧时长数据,比如帧率为60FPS,则duration为1/60秒
let minFrameDuration = maxFrameRateRange.minFrameDuration
device.activeFormat = maxFormat
device.activeVideoMaxFrameDuration = minFrameDuration
device.activeVideoMinFrameDuration = minFrameDuration
device.unlockForConfiguration()
}
}
}