iOS培训-斗鱼直播APP之切换镜头&聚焦&写入文件
五年级 记叙文 2450字 84人浏览 shx198903195

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

作者:小码哥教育

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

切换步骤

给切换过程添加动画

获取当前摄像头是前置还是后置

取出相反的摄像头(之前是前置,这次取出后置)

通过新摄像头重新获取设备(AVCaptureDevice )

通过设备(AVCaptureDevice )创建新的输入(AVCaptureDeviceInput )

移除旧input&添加新的input

注意:修改session 配置之前先调用开启修改配置选项,配置完成后,调用提交修改配置选项 session?.beginConfiguration()

session?.commitConfiguration()

保存新的input

图例解析:

代码如下: 1.

@IBAction func switchScene(){ 2.

// 0.执行动画 3.

let rotaionAnim =CATransition () 4.

rotaionAnim. type ="oglFlip" 5.

rotaionAnim. subtype ="fromLeft" 6.

rotaionAnim. duration =0.5 7.

view. layer . add (rotaionAnim , forKey:nil ) 8.

9.

// 1.校验videoInput 是否有值 10.

guard

let videoInput = videoInput else {return } 11.

12.

// 2.获取当前镜头 13.

let position :AVCaptureDevicePosition = videoInput. device . position ==.front ?. back :.front 14.

15.

// 3.创建新的input 16. guard let devices

=AVCaptureDevice . devices (withMediaType :AVMediaTypeVideo ) as ?[AVCaptureDe vice ]else {return }

17.

guard let newDevice = devices. filter ({$0. position == position }).first else {return } 18.

guard let newVideoInput =try ? AVCaptureDeviceInput (device : newDevice ) else {return } 19.

20.

// 4.移除旧输入,添加新输入 21.

session?. beginConfiguration () 22.

session?. removeInput (videoInput ) 23.

session?. addInput (newVideoInput ) 24.

session?. commitConfiguration () 25.

26.

// 5.保存新输入 27.

self . videoInput = newVideoInput 28. }

写入文件

写入文件步骤

创建AVCaptureMovieFileOutput 对象

用于将音频视频写入文件

将movieFileOutput 对象,添加到session 的输出中 写入文件也是一种输出

设置视频的稳定模式

不设置可能会出现视频跳帧等问题

通常设置为自动即可

开始写入

录制完成,停止写入即可

代码解析

代码如下:

创建、添加、设置代码 1.

// 添加文件输出 2.

let movieFileoutput =AVCaptureMovieFileOutput () 3.

self . movieFileOutput = movieFileoutput 4.

session. addOutput (movieFileoutput ) 5.

// 获取视频的connection 6. let connection =

movieFileoutput . connection

(withMediaType :AVMediaTypeVideo )

7. // 设置视频的稳定模式

8. connection?. preferredVideoStabilizationMode =.auto 9.

10. // 开始写入视频

11.

movieFileoutput. startRecording (toOutputFileURL : outputFileURL , recordingDelegate:self ) 停止写入代码

1.

// 0.停止写入 2. self . movieFileOutput ?. stopRecording ()

在代理方法中监听开始、结束事件 1. extension ViewController :AVCaptureFileOutputRecordingDelegate { 2. func capture(_ captureOutput:AVCaptureFileOutput !,

didStartRecordingToOutputFileAt fileURL: URL!, fromConnections connections :[Any ]!){

3. print (" 开始录制" )

4. } 5.

6. func capture(_ captureOutput:AVCaptureFileOutput !,

didFinishRecordingToOutputFileAt outputFileURL: URL!, fromConnections connections :[Any ]!, error:Error !){

7. print (" 停止录制" )

8. }

9.

}