直播技术iOS端视频采集

心已入冬 提交于 2020-04-28 12:32:00

今天图玩智能科技继续介绍一下直播技术中在iOS下进行的视频采集。我们为企业提供直播平台的二次开发服务,欢迎随时咨询www.toivan.com.

要了解iOS是怎样进行视频采集的,首先我们要了解 AVCaptureSession,AVCaptureDevice等几个基本概念及iOS上视频采集的工作原理。

基本概念

iPhone包括了摄像头,麦克风等设备,我们用 AVCaptureDevice 代表它们。同时,摄像头又是一个输入设备,我们还可以用AVCaptureDeviceInput 表示它;同样,麦克风则是另一个输入设备(AVCaptureDeviceInput)。

为了方便,iOS定义了AVCaptureSession类来管理这些输入设备,可以通过 AVCaptureSession 打开某个输入设备进行数据采集,或关闭某个输入设备。

当数据被采集回来后,需要把这些数据进行保存,处理,于是iOS又定义了AVCatpureOutput来做这件事。

下面我们分别介绍每个类。

AVCaptureSession

AVCaptureSession对象用于管理采集活动,协调数据的流入流出。

AVCaptureSession对象的 startRunning() 方法是一个阻塞调用,可能需要一些时间,因此您应该在串行队列上执行会话设置,以使主队列不被阻止(这将保持UI响应)

AVCaptureDevice

AVCaptureDevice对象代表了一个物理设备及与设备相关的属性。你可以使用它设置底层硬件的属性。一个采集设备还可以为 AVCaptureSession 对象提供数据。

可以使有 AVCaptureDevice 的类方法枚举所有有效的设备,并查询它们的能力。当设备有效或无效时,AVCaptureDevice会得到系统的通知。

设置设备属性时,必须首先使用lockForConfiguration()方法将设备锁住。为设备设置完属性后,你应该查询是否已经设置成功,并在设置完成后调用 unlockForConfiguration() 释放锁。

对于大部分属性配置都可以通过 AVCaptureSession 对象来设置,但一些特殊的选项如高帧率,则需要直接在 AVCaptureDevice 上进行设置。

AVCaptureDeviceInput

AVCaptureDeviceInput 是采集设备中的输入端,它继承自 AVCaptureInput,AVCaptureInput是一个抽象类。

AVCaptureConnection

AVCaptureConnection 代表的是 AVCaptureSession 里 AVCaptureInput 与 AVCaptureOutput 对象之间建立的连接。

AVCaptureOutput

AVCaptureOutput 是一个抽象类,有很多具体的实现类,如AVCaptureVideoDataOutput、AVCaptureMovieFileOutput等。如下图所示。但今天我们主要介绍的是 AVCaptureVideoDataOutput。

AVCaptureVideoDataOutput

AVCaptureVideoDataOutput是录制视频和访问视频帧的输出。它继承自 AVCaptureOutput。

下图是AVCaptureDeviceInput、AVCaptureConnection及AVCaptureOutput关系图:

采集视频的步骤

  1. 创建并初始化 AVCaptureSession。
  2. 创建并初始化 AVCaptureVideoDataOutput。
  3. 设置 AVCaptureVideoDataOutput的videoSettings,videoSettings 中的 Key and value 包含了输出图像与视频格式定义。
  4. 调用 AVCaptureVideoDataOutput 对象的 setSampleBufferDelegate 方法,设置采样数据缓冲区的代理。这样当从输入设备采集到数据后,系统就会自动调用AVCaptureVideoDataOutputSampleBufferDelegate 协议中的 captureOutput 方法,从而获取到视频数据。
  5. 将 AVCaptureVideoDataOutput 对象添加到 AVCaptureSession对象中。
  6. 根据视频类型 AVMediaTypeVideo,创建 AVCaptureDevice 对象。(可以创建视频设备也可以创建音频设备)。
  7. 以 AVCaptureDevice 为参数,创建 AVCaptureDeviceInput 对象。
  8. 将 AVCaptureDeviceInput 对像添加到 AVCaptureSession 对象中。
  9. 调用 AVCaptureSession 对象的 setSessionPreset 方法进行属性设置。如 设置 quality level, bitrate, 或其它 output 的 settings。
  10. 调用 Output 对象的 connectionWithMediaType 方法,建立 Input与Output之前的连接。
  11. 调用 AVCaptureSession 对象的 startRunning() 方法,开始视频采集。
  12. 调用 AVCaptureSession 对像的 stopRunning() 方法,停止视频采集。

看看WebRTC是如何做的

在 WebRTC 的 modules/video_capture/objc/rtc_video_capture_objc.mm 文件中实现了iOS视频采集相关的工作:

  • 初始化

  • 设置捕获设备

  • 开始采集数据

所以总结而言,我们今天介绍了在iOS进行视频采集的一些基础概念,然后又通过分析 WebRTC 代码了解了视频采集的基本步骤(共 12 步)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!