0%

高帧率视频捕捉

视频缩放功能的实现中介绍了通过捕捉设备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()
        }
    }
}