0%

视频缩放

设备的缩放效果是通过居中裁剪由摄像头捕捉到的图片来实现的.AVCaptureDevice提供了一个videoZoomFactor属性,用于控制捕捉设备的缩放等级.该属性最小值为1.0,即不能进行缩放.最大值由捕捉设备的activeFormat值决定,它是AVCaptureDeviceFormat的一个实例.这个类定义了活动捕捉格式的细节,其中就包括videoMaxZoomFactor.

本文将实现在Kcamera上实现视频缩放的功能.

实现

在PreViewDelegate中增加一个方法:

//缩放
func zoomVedio(factor:CGFloat) -> Void

在PreView的setupView()方法中增加缩放手势:

//6. 添加缩放手势
let pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
self.addGestureRecognizer(pinchRecognizer)

并实现handlePinch(_:)方法如下:

//视频缩放
func handlePinch(pinch:UIPinchGestureRecognizer) -> Void {
    self.delegate?.zoomVedio(pinch.scale)
}    

然后在ViewController中实现代理方法如下:

func zoomVedio(factor: CGFloat) {
    self.captureModel.zoomVedio(factor)
}

其中CaptureModel的zoomVedio()方法实现如下:

//MARK: - 视频缩放
func zoomVedio(scale:CGFloat) -> Void {
    //1. 判断是否支持缩放
    if !self.cameraSupportsZoom() {
        return
    }
    //2. 判断缩放比例,最大的缩放比例为device.activeFormat.videoMaxZoomFactor,但这里只进行最多4倍缩放
    let device = self.activeVideoInput.device
    let zoomFactor = scale * device.videoZoomFactor
    if zoomFactor > 4 || zoomFactor < 1 {
        return
    }
    //3. 锁定配置并修改
    if ((try? device.lockForConfiguration()) != nil) {
        device.videoZoomFactor = zoomFactor
        //4. 解锁配置
        device.unlockForConfiguration()
    }
    
}

//是否可以进行缩放
func cameraSupportsZoom() -> Bool {
    return self.activeVideoInput.device.activeFormat.videoMaxZoomFactor > 1.0
}

}

测试

编译运行最新的Kcamera应用,使用缩放手势观察视频缩放.