切换镜头&聚焦&写入文件
切换镜头(前置&后置摄像头)
-
切换步骤
- 给切换过程添加动画
- 获取当前摄像头是前置还是后置
- 取出相反的摄像头(之前是前置,这次取出后置)
- 通过新摄像头重新获取设备(AVCaptureDevice)
- 通过设备(AVCaptureDevice)创建新的输入(AVCaptureDeviceInput)
- 移除旧input&添加新的input
- 注意:修改session配置之前先调用开启修改配置选项,配置完成后,调用提交修改配置选项
- session?.beginConfiguration()
- session?.commitConfiguration()
- 保存新的input
-
图例解析:
- 代码如下:
@IBAction func switchScene() {
// 0.执行动画
let rotaionAnim = CATransition()
rotaionAnim.type = "oglFlip"
rotaionAnim.subtype = "fromLeft"
rotaionAnim.duration = 0.5
view.layer.add(rotaionAnim, forKey: nil)
// 1.校验videoInput是否有值
guard let videoInput = videoInput else { return }
// 2.获取当前镜头
let position : AVCaptureDevicePosition = videoInput.device.position == .front ? .back : .front
// 3.创建新的input
guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as? [AVCaptureDevice] else { return }
guard let newDevice = devices.filter({$0.position == position}).first else { return }
guard let newVideoInput = try? AVCaptureDeviceInput(device: newDevice) else { return }
// 4.移除旧输入,添加新输入
session?.beginConfiguration()
session?.removeInput(videoInput)
session?.addInput(newVideoInput)
session?.commitConfiguration()
// 5.保存新输入
self.videoInput = newVideoInput
}
写入文件
- 写入文件步骤
- 创建AVCaptureMovieFileOutput对象
- 用于将音频视频写入文件
- 将movieFileOutput对象,添加到session的输出中
- 写入文件也是一种输出
- 设置视频的稳定模式
- 不设置可能会出现视频跳帧等问题
- 通常设置为自动即可
- 开始写入
- 录制完成,停止写入即可
- 创建AVCaptureMovieFileOutput对象
- 代码解析
- 代码如下:
- 创建、添加、设置代码
// 添加文件输出
let movieFileoutput = AVCaptureMovieFileOutput()
self.movieFileOutput = movieFileoutput
session.addOutput(movieFileoutput)
// 获取视频的connection
let connection = movieFileoutput.connection(withMediaType: AVMediaTypeVideo)
// 设置视频的稳定模式
connection?.preferredVideoStabilizationMode = .auto
// 开始写入视频
movieFileoutput.startRecording(toOutputFileURL: outputFileURL, recordingDelegate: self)
- 停止写入代码
// 0.停止写入
self.movieFileOutput?.stopRecording()
- 在代理方法中监听开始、结束事件
extension ViewController : AVCaptureFileOutputRecordingDelegate {
func capture(_ captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections: [Any]!) {
print("开始录制")
}
func capture(_ captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections: [Any]!, error: Error!) {
print("停止录制")
}
}