您的位置:首页 > 移动开发

第二十五篇玩转【斗鱼直播APP】之切换镜头&聚焦&写入文件

2016-10-24 09:34 337 查看


切换镜头&聚焦&写入文件


切换镜头(前置&后置摄像头)

切换步骤
给切换过程添加动画
获取当前摄像头是前置还是后置
取出相反的摄像头(之前是前置,这次取出后置)
通过新摄像头重新获取设备(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的输出中
写入文件也是一种输出

设置视频的稳定模式
不设置可能会出现视频跳帧等问题
通常设置为自动即可

开始写入
录制完成,停止写入即可

代码解析



代码如下:
创建、添加、设置代码
// 添加文件输出

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("停止录制")

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: