写点什么

WebRTC 下摄像头的采集分析

用户头像
小辣条
关注
发布于: 2021 年 05 月 09 日
WebRTC下摄像头的采集分析

前言


随着 2020 年疫情的爆发,音视频通信、视频会议等进入到了更多人的眼帘中,相信也有很多小伙伴都加入到了音视频通信相关的开发队伍中。webRTC 就是作为谷歌开源的一个互联网浏览器间实时通信的技术,包含了音视频采集、编解码、数据传输、显示等功能。今天主要分析下 iOS 中 webRTC 摄像头采集的实现。


RTCCameraVideoCapturer


WebRTC-iOS 的相机采集主要接口是 RTCVideoCapturer,目前在 RTCVideoCapturer 下定义了 RTCFileVideoCapturer 和和 RTCCameraVideoCapturer,RTCFileVideoCapturer 是针对视频文件进行采集发送,RTCCameraVideoCapturer 才是针对端的摄像头的采集。


RTCCameraVideoCapturer 使用了 AVCaptureSession 进行摄像头的调用采集,将采集到的的数据通过 delegate 的方式传输出去,采集的分辨率、帧率等参数都是在调用 capturer 之前设置的。摄像头的调用采集方法是

因为摄像头的操作比较耗时,需要放到子线程去使用,webRTC 定义了 RTCDispatcher 一个线程管理的类,定义了 RTCDispatcherTypeMain、RTCDispatcherTypeCaptureSession、RTCDispatcherTypeAudioSession 三种,因为用于主线程、视频操作、音频操作使用。

可以看到在 startCaptureWithDevice 里将外接设置好的参数配置好后,设置了 input 和 output 之后,直接调用 AVCaptureSession 的 startRunning 就可以调用摄像头。注意方法里头调用了 lockForConfiguration 和 unlockForConfiguration,实现对硬件资源配置的访问。


在 webRTC 里,摄像头使用的是 AVCaptureVIdeoDataOutput 来接收数据的,开启摄像头前我们设定了 Output 将 delgate 设为 self,就可以拿到采集的数据

摄像头采集到的数据由 AVCaptureVideoDataOutputSampleBufferDelegate 的方法返回,摄像头采集到的数据封装在了 sampleBuffer 里头,然后由 sampleBuffer 获取到 pixelBuffer。



接下来设置数据传输 iOS 设备的方向,


接下来要获取时间戳,时间戳比较重要,如果时间戳错误,可能会导致显示卡顿或者闪退的现象,如果使用自定义的采集相机那一定要注意时间戳的设置。webRTC 内部使用的是 I420 格式进行存储和传递的,通过这个类 RTCCVPixelBuffer 生成了 I420,感兴趣的可以看看源码,RTCCVPixelBuffer 这个类最终会生成 RTCVideoFrame 的实例,RTCVideoFrame 这个类是对视频数据的封装,包含了视频的宽高,方向,时间戳以及视频数据。然后通过 delegate 的方式将 videoFrame 传输出去。摄像头的采集以及传输到这就结束了。


切换摄像头是需要在外接重新设置 AVCaptureDevicePosition,摄像头的方向后重新调用 startCaptureWithDevice。重新采集的时候是没有停止之前的采集的,而是直接开启了一个新的采集的,这里可以注意下。是因为在 startCaptureWithDevice 的时候对 session 重新进行了配置,会移除来的 input,那之前的设备就自然失效了。


其他


RTCCameraVideoCapturer 这个类是很原生的对摄像头的调用采集进行处理。获取到的实时数据是可以让你看到连上小痘痘的数据。现在是一个美颜的时代,如果想要对视频数据进行滤镜、美颜、添加水印以及添加一些其他效果,或者说有些开发者想要使用 GPUImage 对实时数据进行修改、添加美颜等,那这个类是不能满足要求的,这个类的依赖性不强,开发者可以去修改这个类然后重新编译代码或者需要去新建一个类去重新对摄像头的调用采集进行定义。

用户头像

小辣条

关注

还未添加个人签名 2020.12.22 加入

还未添加个人简介

评论

发布
暂无评论
WebRTC下摄像头的采集分析