记得大学时候,无数个夜晚都是在和女朋友打电话中度过,即使夜深至凌晨一、两点,也要打着哈欠道一声晚安。

小编大一、大二时微信通话还没有普及,普遍都是用话费打的,这就导致了话费蹭蹭蹭的往上涨,占了一小半的生活费。

当然,后来大家很容易就可以猜到,随着微信的升级,微信的视频、语音通话功能变得越来越好用,我和女朋友就从打电话变成了语音通话再变成视频通话,最后到现在的没人跟我通话。

闲话不多说,究竟是为什么变成了现在都没人跟我打电话呢?不对,串题了。

所以我们和女朋友视频对话时,视频到底经历了哪些音视频处理步骤,才能保证顺畅、实时、不卡顿呢?

传输协议+CDN,传输优化双管齐下

首先是网络层面的优化,我们都知道音视频传输对实时性的要求非常高,不然可能就会出现某些奇怪的画风。比如下图:


△ 世界正在重重叠加

TCP 和 UDP 协议在传输上有很多的差别,首先 TCP 面向连接,而 UDP 是无连接的。而 TCP 注重提供可靠的服务。能保证连接传送的数据,无差错,不丢失,不重复,且按序到达。而 UDP 是尽最大努力交付,即不保证可靠交付。

因此传统的 TCP 协议并不是为实时媒体传输设计的,这就导致了它在弱网环境下的产生的延时相当大。因此在音视频传输时需要对网络协议进行优化。

UDP 协议就比较适合用于实时音视频通讯,首先它是允许端到端的全链条信道策略控制,可以保证弱网环境下播放的流畅性。在丢包方面 UDP 协议也更加灵活,方便我们在视频流畅与画质之间做好平衡。

再者是网络优化 CDN 业务,CDN 可以将视频内容分发至全网加速节点,让用户可以就近获取需要的内容,降低视频延迟。

下文简单讲解下 CDN 的加速原理,来看下当视频接入到服务后,用户观看视频时其经过的流程:

首先是 DNS 解析,请求域名对应 ip,既而返回 cname 对应地址,再通过 CDN 进行对请求进行智能调度。

接着是内容访问,选择了最优节点后,再向节点请求访问域名内容,CDN 节点响应对应内容给最终用户。

依靠 CDN 技术,我们可以大幅度降低传输延迟,保证音视频传输的稳定性。


编码质量、效率均衡兼顾

音视频处理不仅要在网络方面做好流畅与画质的平衡,手机硬件编码也要顾及到。

视频收录中,面对部分手机摄像头摄像效果质量不佳,或者环境亮度低时,我们可以对视频内容进行增强,对图像去噪、对比度调整,并降低曝光度等,采集完成后通过本地编码上传到服务端,在服务端将数据解码,最后转码成为视频流,发送给观看端。


视频编解码要兼顾编码效率、编解码速度。

旧型号的低端安卓手机常常会出现硬件规格不够,导致编码速度慢、发烫厉害的问题,这个时候就需要牺牲视频画质,来提升视频编码速度。如果不牺牲画质,而手机是几年前买的价值 666 元的安卓机,那么你可以一边和你女朋友聊天一边用手机煎鸡蛋。

同时在视频编码格式方面的选择,H.265 虽然压缩品质好,但是由于其硬件资源占用多和手机支持率低等问题,让它并不适合用于实时音视频处理。

H.264 在压缩效率方面比不上 H.265 ,但它拥有较好的适配性与较低的硬件要求。此外,它还对网络抖动有着很好的适应能力,所以在视频编码方面我们可以选 H.264。

去噪、回声消除,保留真实的声音

手机音视频通话的过程中,手机要对声音进行采集,此时需要考虑到延时、卡顿、去噪、回声消除、混音等。

手机采样时需要把模拟信号数字化,常用的频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。采样频率越高,音频质量就越好。

音频采集时,另外一个重要的参数是位宽,位数越多,声音质量越好,但是同样的数据量也会增大。当采集完成后,我们将数据压缩成音频码以降低音频数据量。模拟的音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCM 和 ADPCM。

另外一方面,不知道大家有没有思考过,我们用微信进行语音聊天时,为什么微信可以将我们的声音录入的这么清楚,尤其是人声。即使我们在一个噪声很大的环境里面,说话的时候还是可以保留下来,这其实是因为微信对人声的降噪处理。

同理在实时音视频传输中,我们也需要会视频进行降噪处理,通过算法优化,设计合适的滤波器对波形进行滤波操作,来保留人声,去除环境声。

那么回声消除呢,如何减少语音通话中出现的回声?在双向通信中,对方音频播放时,会再次从麦克风中传输过去造成令人烦躁的回音,这个时候我们就要通过算法识别回传过来的声音,进行消除。

其他

除了常规的音频、视频优化之外,这几年随着技术的进步与硬件的发展,美颜、贴纸、瘦脸等都可以在实时音视频通话中实现。

美颜:一般来说,美颜都是通过组合亮度和双边滤波这两个滤镜达到美颜效果。如果想达到更好的效果,可以额外添加需要的滤镜或者调整滤镜参数。

贴纸:有的时候一些实时音视频通讯工具让我们使用贴纸,贴纸功能需要用到人脸检测功能,人脸检测实现方式有两种:

  1. 通过第三方数据库 OpenCV 中开源的跨平台计算机视觉和机器学习库进行人脸识别;

  2. 通过系统自带的 CoreImage 库,由于 CoreImage 库已经提供了 CIDetector ,所以它很适合用来进行人脸检测。

这 2 种方法,更推荐 OpenCV。因为 CoreImage 库只能定位人脸,鼻子, 嘴巴, 眼睛等五官位置。而 OpenCV 不仅可以实现人脸, 五官定位,而且还可以对眉毛, 侧脸, 头发等位置进行识别定位,更详细,从而能支持不同部位的贴纸。 在成功定位贴纸之后,进行视频图像处理即可。


参考文章:

1.视频直播连麦技术详解

https://blog.csdn.net/sunhf_csdn/article/details/80129428)

2.视频通信中音视频处理技术

https://juejin.im/post/5abc42006fb9a028cf32893d)