设备的缩放效果是通过居中裁剪由摄像头捕捉到的图片来实现的.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应用,使用缩放手势观察视频缩放.