QRVideoRecord 视频录制

视频捕获逻辑?

•	摄像头和麦克风授权
•	建立Session会话
•	添加Input
•	添加Output
•	正式开始视频捕捉
•	视频结果的处理
  • 摄像头和麦克风授权

访问相机和麦克风需要获得用户授权,授权状态包括用户未授权、用户想要授权却没权限(家长控制)、用户已授权、用户拒绝授权。
1、用户未授权:只要创建一个AVCaptureDeviceInput对象时,系统会自动弹出原生对话框请求用户授权;
AVCaptureDeviceInput是AVCaptureInput子类,AVCaptureInput提供了将捕获输入源联结到AVCaptureSession会话的接口。
2、用户同意授权:go on the next logic。
3、用户拒绝授权,或者无权限授权:通过AVCaptureDevice调用类方法requestAuidoAccessWithHandler,重新弹出请求授权对话框,回调失败则pop销毁当前控制器,并提示“设置-通用-隐私-更改”。

  • 建立AVCaptureSession会话对象session

AVCaptureSession是AVFoundtion的中心枢纽,它可以不断的执行将数据流从AVCaptureInput输入端到AVCaptureOutput输出端的流转,为了执行事实流转捕获,客户端可以使用session,并添加适当的AVCaptureInput(如AVCaptureDeviceInput)和AVCaptureOutput,执行[AVCaptureSession startRunning]启动从输入到输出数据流,而[AVCaptureSession stopRunning]停止该流。客户端可以设置sessionPreset属性来定制输出的质量级别或比特率。

  • 添加Input

AVCaptureSession会话的输入由一个或多个AVCaptureInput对象组成,AVCaptureDeviceInput是AVCaptureInput子类,AVCaptureInput提供了将捕获输入源联结到AVCaptureSession会话的接口。可以使用[AVCaptureSession addInput:] 的方法将诸如照相机之类的数据源的AVCaptureInput对象添加到AVCaptureSession当中,例如一个输入设备可以同时提供音频和视频数据,在捕获会话中,通过AVCaptureConnection对象在AVCaptureInput实例和AVCaptureOutput实例之间建立连接。

  • 视频的帧数

通过设置捕获设备的activeVideoMinFrameDuration属性和activeVideoMaxFrameDuration属性来设置捕获设备的帧速率,每一帧的时长就是帧速率的倒数,帧速率干脆叫帧频率更准确了,表示摄像头在一秒时间内总共采集多少视频图片帧。通过CMTime实例化一个frameDuration帧时长变量。通常是1秒采集60次,也就是说最小和最大帧时长都是CMTimeMake(1, 60)。(一般来说人的眼睛采集信息不超过一秒30帧)

  • 摄像头防抖

使用 [AVCaptureConnection isVideoStabilizationSupported]来指示AVCaptureSession是否支持视频防抖,每个设备支持的防抖级别都不一样,使用[AVCaptureDeviceFormat isVideoStabilizationModeSupported:] 检查活动设备格式支持哪些视频稳定模式,AVCaptureVideoStabilizationMode stabilizationMode = AVCaptureVideoStabilizationModeCinematic;这句代码应该就是默认获取当前设备能提供的最高视频防抖级别

  • 添加output

AVCaptureOutput定义AVCaptureSession的输出结果的接口,用于捕获输出结果(如文件和视频预览)。注意:在文件输出的时候,可能会出现设备内存不足而导致文件输出失败的情况,这事需要通过AVCaptureMovieFileOutput来实时判断内存的剩余空间是否达到指定的阀值。
AVCaptureMovieFileOutput类主要负责将摄像头采集的图片帧数据和麦克风采集到的音频数据打包成音视频QuickTime文件后写入指定路径之中,这个逻辑就十分简单啦,直接就是AVCaptureMovieFileOutput实例化一个视频捕捉输出对象,然后在AVCaptureSession视频捕捉会话对象能够添加AVCaptureMovieFileOutput视频捕捉输出对象的前提下将输出对象添加到会话之中。

  • 开始正式视频捕捉

将AVCaptureInput的两个对象(一个摄像头另一个麦克风)和AVCaptureOutput的对象都添加到视频录制会话当中,即处理好了视频的输入和输出端,调用startRunning方法正式开启视频捕捉。使用AVCaptureVideoPreviewLayer对象作为一个sublayer添加到相机UI的图层上,当做视频捕捉实时预览,预览就相当于在正式输出之前,在输入端和输出端之间提添加一个滤网。视频捕捉过程中可以修改视频录制的状态,如前后摄像头,闪光灯…

  • 处理与剪辑

AVAsset是一个抽象类(不能直接实例化),用于模拟定时视听媒体,如视频和声音,AVAsset可以一起呈现或处理一个或多个轨道,每个轨道是统一的媒体类型,包括但不限于音频、视频、文本、封闭字幕和字幕。我们在做视频剪辑的时候需要使用到,包括处理视频片段剪辑,添加表情、水印,添加背景音乐等等。
AVAssetWriter提供将媒体数据写入新文件的服务,AVAssetWriter的实例可以将诸如QuickTime电影文件格式或MPEG-4文件格式的格式将媒体写入新文件,同时还支持将媒体样本进行重新编码。
AVURLAsset属于AVAsset抽象类的一个子类,通过AVURLAsset我们可以创建一个带选项(optional)的asset,以提供更精确的时长和计时信息,用作视频剪辑与截帧等。

pod ‘QRVideoRecord’ 视频录制
https://github.com/yangqingren/QRVideoRecord

你可能感兴趣的:(QRVideoRecord,视频录制,视频剪辑,AVFoundtion)