切换镜头&聚焦&写入文件
切换镜头(前置&后置摄像头)
-
切换步骤
- 给切换过程添加动画
- 获取当前摄像头是前置还是后置
- 取出相反的摄像头(之前是前置,这次取出后置)
- 通过新摄像头重新获取设备(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.5view.layer.add(rotaionAnim, forKey: nil)// 1.校验videoInput是否有值guard let videoInput = videoInput else { return }// 2.获取当前镜头let position : AVCaptureDevicePosition = videoInput.device.position == .front ? .back : .front// 3.创建新的inputguard 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 = movieFileoutputsession.addOutput(movieFileoutput)// 获取视频的connectionlet 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("停止录制")}}
本文介绍如何在iOS应用中实现前后置摄像头的平滑切换,并提供了详细的代码示例。此外,还介绍了如何利用AVFoundation框架进行视频录制及注意事项。
332

被折叠的 条评论
为什么被折叠?



