《架构师》2021年5月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

构建WebRTC音视频系统处理结构

作者 正向成长

随着5G技术的普及,各种音视频技术应用场景会越来越多,必然会早就井喷式的音视频人才需求,了解相关技术,跟随社会发展趋势,提升个人价值,保持社会竞争力很有效的途径。2011年谷歌退出WebRTC技术,使得开发人员可以基于JavaScript和主流的浏览器进行音视频通信,大大降低了音视频技术门槛,使得普通程序员也可以轻松快速实现浏览器间的音视频通话。本文将谈谈构建一个WebRTC音视频系统所需要的模块和一些关键的技术点。

浅析基本概念

首先,介绍一些关于音视频的一些基础概念,从直观上了解相关概念的指代的内容,如果后期有需要再继续深入的了解,可以实现快速进入一个领域。

音频设备重要参数

音频设备的主要工作就是音频数据的采集,而音频数据采集的本质就是将模拟信号转换为离散的数字信号(A/D),音频设备采用一定的采样率进行数据的采集,采集到的数据再经过量化、编码,最终形成数字信号。

采样率

A/D过程遵循奈奎斯特定理:

在模拟/数字信号的转换过程中,当采样率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息。

人类听觉范围的频率是20Hz~20kHz之间。对于日常语音交流(像电话),8kHz采样率就可以满足人们的需求。但为了追求高品质、高保真,音频输入设备的采样率设置在40kHz以上,这样才能完整地将原始信号保留下来。例如我们平时听的数字音乐,一般其采样率都是44.1k、48k等,以确保其音质的无损。

采样大小

量化和编码过程中,采样大小决定了每个采样最大可以表示的范围。如果采样大小是8位,则它表示的最大值是就是28 -1,即255;如果是16位,则其表示的最大数值是65535。

在多媒体中,每条轨数据都是独立的,类似于火车的轨道,任何两条轨道永远都不会相交。在MP4中的音频轨和视频轨是分别存储的。

编码帧和非编码帧

从摄像头采集到的帧以及解码器解码之后的帧都是非编码帧,我们使用的播放器播放的就是非编码帧,它们一般是YUV或RGB格式。为了便于存储和传输,会对视频进行编码达到压缩的目的,将视频帧经过编码器(例如,H264/H265、VP8/VP9)压缩后的帧是编码帧

常见帧格式

YUV编码

YUV是一种色彩编码方法,起初是为了色彩电视和黑白电视的兼容,它将亮度信息(Y)和色彩信息(UV)分离,实际上假设没有UV信息也可以显示黑白的完整图像。

H264编码帧

H264编码的帧主要包括以下三种类型:

·I帧,即关键帧,它的压缩率低,可以被单独解码成一幅完整的图像。经过适度地压缩,做为随机访问的参考点。

·P帧,即参考帧,压缩率较高,表示的是这一帧跟之前的一个I帧(或P帧)的差别,解码时需要用之前缓存的画面(I帧)叠加上本帧定义的差别,生成最终画面。

·B帧,即前后参考帧,压缩率最高,既考虑前面已编码帧,也顾及后面已编码帧之间的时间冗余信息而实现的一种压缩方式。解压时,需要B帧后的P帧优先于它解码,之后才可以将B帧解码。

WebRTC架构

WebRTC是一个点对点通讯框架,它的架构实现遵从JESP(JavaScript Session Establish ment Protocol)。

会话描述(Session Description)用于描述双方的回话信息,涉及到SDP(Session Description Protocol)是WebRTC的核心,它实际上是采用文本的方式描述WebRTC终端的能力,通过创建Socket连接和信令传输实现媒体协商,最终达到找到双方共同支持的媒体能力(其中,包括音视频编解码器、编解码器的相关参数、媒体类型、媒体格式、传输协议、传输的IP和端口等)。

WebRTC处理过程

实现一个一对一的音视频通话系统,答题上需要四个部分:

·两个WebRTC终端,负责音视频设备的检测、数据采集、编解码、NAT穿越、音视频数据传输

·Signal(信令)服务器,负责进行信令处理,其中包括加入房间、离开房间、媒体协商等。

·STUN/TURN服务器,负责获取WebRTC终端在公网的IP以及NAT穿越失败后数据的中转。

WebRTC音视频通话过程

发起音视频通话的WebRTC终端首先会对自己的设备检测是否可用,如果设备可用,则会进行音视频采集,且该终端WebRTC发送加入信令(Offer Signal)到Signal服务器,Signal服务器收到后会创建房间。

此时,另一端WebRTC终端加入该房间,待该终端成功加入房间后,创建房间的WebRTC终端会收到“另一个用户加入房间成功”的消息。

创建房间的WebRTC终端创建“媒体连接对象”,即RTCPeerConnection,并将采集到的音视频数据通过该RTCPeerConnection对象进行编码,并传送给对端。

实际,在创建连接时,需要考虑综合连通率和传输高效性,进行P2P通信很有可能会失败,如果P2P穿越(NAT打洞)失败,此时便需要通过TURN服务器(中继服务器,也称Relay服务器)进行数据中转。

以上,我们了解了WebRTC通信的所需要的模块以及整个交互过程,后续再针对这些模块进行深入的了解。

参考资料

·极客时间《从0打造视频直播系统》

·一起来学习WebRTC (篇二) | 掘金技术征文