WebRTC音视频实时互动技术:原理、实战与源码分析
上QQ阅读APP看书,第一时间看更新

前言

回想2020年,疫情的爆发使得世界经济陷入衰退,目前仍对我们的生活造成影响。

幸运的是我们生活在一个好时代,科技在这几十年中得到了迅猛发展。即使在疫情最严重的时刻,我们仍然可以通过音视频会议进行远程办公,通过在线教育系统进行学习,通过一些视频软件观看直播。

从某个角度看,这次疫情虽然导致很多行业处于崩溃边缘,但也迫使一些行业加速发展,其中音视频会议、在线教育的重要性马上体现了出来,新的沟通方式和教育方式被越来越多的人所认知、接纳。我们甚至可以推测,在线教育行业和音视频会议行业会在今年崛起,并在未来十年得到迅猛发展。音视频技术、传输技术(如5G)的飞速发展,以及因此激发出的人们对音视频的需求,也为音视频行业的发展提供了动力。

现在音视频技术已经非常成熟了,它被越来越广泛地应用于各行各业,如抖音、微信短视频、娱乐直播、教育直播、音视频会议等。就连热门的AI技术也与音视频技术关系密切,如智能音箱、自动驾驶、人脸识别等都离不开音视频技术。未来音视频技术会有更好的前景,对音视频人才的需求也必然会像当年移动互联网发展时一样出现井喷现象。面对这样的机遇,你若能掌握音视频的核心技术,一定可以在未来职场上获得丰厚的回报和满满的成就感。所以,目前是学习音视频的最佳时机,及早加入音视频研发的队伍,有助于你在未来的职场上更有作为。

说到音视频技术,就不得不说Google开源的WebRTC库了。WebRTC库如同音视频技术的一顶“王冠”,上面镶嵌了大大小小、各种各样的“宝石”,如降噪、回音消除、自动增益、NetEQ、网络拥塞控制……不胜枚举!目前国内无论是在线教育直播系统,还是音视频会议系统,其底层几乎无一例外都使用了WebRTC或从WebRTC中借鉴了不少有价值的模块和思想。不仅如此,如果现在你去应聘一线大厂的音视频研发岗,可以发现岗位描述中都写有“熟悉WebRTC技术者优先”之类的要求,WebRTC的重要性由此可见一斑。因此,了解和学习WebRTC更显得尤为重要。

自从2011年WebRTC推出之后,我就一直在追踪其进展。最近几年WebRTC的发展越来越快,服务质量也越来越好,现在对于大多数公司来说,完全不必像我们当年(2010年)那样从0开始自研音视频系统了。你可以在WebRTC的基础上构建系统,这样既省时又省力,质量又能得到保障。

但学习WebRTC也并非易事,需要你有良好的基础,如熟练掌握C++、熟悉音视频知识、了解网络传输等,这显然增加了学习WebRTC的成本。而我自从加入“跟谁学”团队后,不知怎的竟有了“好为人师”的冲动,一直在想是否可以对WebRTC做一个深入剖析,让更多的人知道WebRTC能做什么,该如何更好地利用WebRTC。这种想法一直萦绕心头,随着时间的推移反而愈加强烈,后来竟成了我必须完成的使命!

因此,自2018年开始,我制定了“WebRTC三部曲”的计划,即推出三门课,分别是“WebRTC入门与实战”“百万级高并发WebRTC流媒体服务器的实现”“WebRTC源码剖析”。这三门课的前两门我已经在慕课网推出,受到了广泛好评,而第三门则以图书的形式推出,本书也就与大家见面了。当然,WebRTC源码十分庞杂,想通过一本书将其讲清楚是不现实的,所以这本书的推出既是我制定的WebRTC三部曲计划的终点,也是后面深入分析WebRTC源码的起点,而我的终极目标是将WebRTC剖析透彻,让更多的人可以更好地利用WebRTC做出更优秀的产品。

本书分为三部分,共13章。其中第1∼3章为第一部分,主要介绍WebRTC的由来,为什么要选择WebRTC,以及实时音视频通信的本质是什么。其中第3章最为关键,只有了解了音视频实时通信的本质,你才能知道音视频实时通信要解决什么问题,然后才能知道如何解决这些问题,从而理解WebRTC为什么要这样做。

第二部分包括第4∼10章,这部分的内容比较多,我会循序渐进地向你讲解WebRTC的理论和实战。其中第4章介绍了一个最简单的WebRTC信令服务器该如何构建,第5章介绍了如何通过浏览器实现一对一通信,通过这两章你就可以搭建出一个WebRTC一对一实时通信系统了。第6章介绍了WebRTC底层是如何传输音视频数据的,重点是如何进行NAT穿越;第7章详述了WebRTC媒体协商使用的SDP各字段的含义。需要说明的是,SDP中的每个字段你都需要牢记在心,这样才能为后续阅读WebRTC代码扫清障碍。第8章介绍如何通过移动端(Android、iOS)Native的方式实现一对一通信,读完本章内容后,将能实现Web端与移动端的互联互通;第9章介绍了WebRTC底层的传输协议RTP/RTCP,这部分内容是每个从事实时通信工作的读者必须掌握的;第10章介绍了WebRTC的两种拥塞控制算法,详细介绍了WebRTC为什么最终选择Transport-CC作为默认拥塞控制算法。

第三部分包括第11∼13章。其中第11章介绍了编译WebRTC源码库的方法,对于大多数刚入门的读者来说,学习WebRTC的第一道门槛便是如何编译WebRTC,通过对该章的学习,相信你一定可以顺利地将WebRTC库编译出来;第12章对WebRTC的peerconnect_client例子做了深入剖析,这个例子可以说是我们学习WebRTC源码的必经之路,这一章你一定要多花些时间将其全部掌握;第13章是对WebRTC源码的整体架构和运转流程的详细分析,也是本书最难的部分,将这章了解清楚后,你就知道WebRTC是如何运转的了。

我深深知道,一本书的完成并非一人之功,有身边无数亲人、朋友的支持和帮助,才能让这本书得以出版。这里首先要感谢我的家人,特别是我亲爱的妻子,正是她的支持和鼓励,才使我可以顺利地将这本书编写完成。除此之外,她还成了我的第一个读者,帮我纠正了很多语病。

感谢我的老领导、老朋友严石先生,他是WebEx创业“十君子”之一,是音视频实时通信方面的顶级专家。他在工作十分繁忙的情况下,仍然抽出了大量时间来阅读本书书稿,并指出了其中的不足,在此万分感谢!

感谢高泽华先生能在百忙之中抽出时间来阅读书稿,并为本书作序。能请到泽华为本书作序是我莫大的荣幸!

感谢刘岐先生为我指出书中的不足。我们是十多年的老朋友了,2005年我们因研究Linux内核而结缘,之后各自发展,没想到几年之后我们又都进入了音视频领域,这应该就是一种缘分吧!

感谢翟方庆先生为本书的编写提供各种帮助,特别是为图书的宣传做了很多工作。

感谢声网,声网不但是一家音视频SDK顶级服务商,也是一家特别有情怀的公司,每年举办的RTC大会都是音视频界的盛会,促进了RTC社区的发展和技术交流。

感谢每一位为本书出版默默付出的人,没有大家的帮助就不会有本书的诞生。

在编写本书时,我努力做到准确细致,但难免存在不妥之处,希望读者朋友能不吝指正,在此万分感谢!