编辑推荐
近年来,WebRTC技术的使用越来越广泛,引起了众多开发者以及各大公司的关注。目前市面上关于WebRTC的书籍大多都是关注Web端的,对Native端(Android 、iOS、macOS、Windows、Linux)的涉猎非常少。此外,还没有任何图书对WebRTC内部的技术实现进行分析,本书试图弥补这一空白。
本书是编者在WebRTC学习、WebRTC Native实际使用过程中的心得体会和系统总结,内容涵盖了Native端WebRTC SDK基本场景的使用、基本场景下完整流程的源码导读,还有一些高级的功能和
场景,比如多人通话、屏幕共享、H.265、美颜、伴奏、本地录制等,*后还对Server端展开了一些讨论。
书中利用大量细致的代码分析和源码导读来讲解WebRTC Native的具体实战,分析WebRTC内部主要的数据流程,力图使读者能够通过实际操作快速入门和理解WebRTC Native的开发技巧。
 ;
内容简介
本书是WebRTC方面的专著,WebRTC是一项实时通信领域革命性的技术,在实时音视频通信领域已经产生了深远的影响。本书涵盖了Native端WebRTC SDK基本场景的使用、基本场景下完整流程的源码导读,还介绍了一些高级的功能和场景,比如多人通话、屏幕共享、H.265、美颜、伴奏、本地录制等,*后还对Server端展开了一些讨论。本书通过细致的代码分析和源码导读,来讲解WebRTC Native的具体实战,分析WebRTC内部主要的数据流程,力图使读者能够通过实际操作快速入门和理解WebRTC Native的开发技巧。 本书主要面向的是所有希望从事WebRTC Native开发的IT从业人员,且要求读者具备一定的Java/Objective-C/C 语言基础。
作者简介
许建林,网名Piasy,毕业于清华大学计算机系,毕业后创业,参与从零到一打造社交直播 APP YOLO 的全过程。目前就职于 PowerInfo(北京世纪鼎点软件有限公司),从事高稳定低延时音视频实时传输技术的研发工作,对实时音视频领域有着深入的研究。开源爱好者,GitHub 近两千关注者,开源了数个上千标星的项目。技术分享者,曾在北京 GDG Meetup、DroidCon Beijing 进行技术分享,是WebRTC Native 源码导读系列博客作者。
目录
第1章 ; 开发环境搭建 ; // ; 1
1.1 ; WebRTC简介 ; // ; 1
1.2 ; iOS/macOS编译环境 ; // ; 2
1.3 ; Android/Linux编译环境 ; // ; 3
1.4 ; Windows编译环境 ; // ; 3
1.5 ; 更新WebRTC编译环境 ; // ; 4
1.6 ; macOS上的Android编译环境 ; // ; 4
 ;
第2章 ; 运行官方Demo ; // ; 6
2.1 ; 官方Demo简介 ; // ; 6
2.2 ; 部署AppRTC Server ; // ; 6
2.3 ; 运行iOS AppRTCMobile ; // ; 7
2.4 ; 运行macOS AppRTCMobile ; // ; 13
2.5 ; 运行Android AppRTCMobile ; // ; 17
2.6 ; iOS/macOS/Android AppRTCMobile互通测试 ; // ; 19
2.7 ; Android C 代码单步调试 ; // ; 20
2.8 ; 部署PeerConnection Server ; // ; 23
2.9 ; 运行Windows PeerConnection Client ; // ; 23
2.10 ; 运行Linux PeerConnection Client ; // ; 25
 ;
第3章 ; 基本流程分析 ; // ; 26
3.1 ; 拓扑结构 ; // ; 26
3.2 ; 通话过程 ; // ; 27
3.2.1 ; PeerConnection ; // ; 28
3.2.2 ; Offer、Answer和SDP ; // ; 28
3.2.3 ; ICE ; // ; 28
3.2.4 ; STUN ; // ; 28
3.2.5 ; TURN ; // ; 29
3.2.6 ; ICE Candidate ; // ; 29
3.3 ; 核心API和Demo代码位置 ; // ; 30
3.3.1 ; 全局初始化 ; // ; 30
3.3.2 ; PeerConnectionFactory ; // ; 31
3.3.3 ; 创建PeerConnection ; // ; 33
3.3.4 ; 创建Source和Track ; // ; 34
3.3.5 ; 创建Offer // 37
3.3.6 创建Answer // 39
3.3.7 ICE Candidate回调和设置 // 41
3.3.8 ICE连接状态回调 // 42
3.3.9 核心API回顾 // 43
3.4 SDP初探 // 44
第4章 编译工具介绍 // 46
4.1 Ninja // 46
4.2 GN // 46
4.3 系统宏定义 // 48
4.4 添加源码目录和预编译依赖库 // 50
第5章 SDP详解 // 54
5.1 Plan B v.s. Unified Plan // 54
5.2 Transceiver // 54
5.3 SDP详解 // 57
5.3.1 session metadata // 57
5.3.2 video media section // 57
5.3.3 audio media section // 60
5.3.4 application media section // 61
5.4 操纵SDP // 62
第6章 线程模型 // 63
6.1 三大线程的使用 // 63
6.1.1 对外接口的线程切换 // 63
6.1.2 内部代码的线程切换 // 65
6.2 三大线程的创建 // 66
6.2.1 iOS/macOS创建PC Factory // 68
6.2.2 Android创建PC Factory // 69
6.2.3 Windows/Linux创建PC Factory // 70
第7章 视频数据流程 // 72
7.1 视频数据流程概览 // 72
7.2 视频采集 // 73
7.2.1 iOS/macOS视频采集 // 73
7.2.2 Android视频采集 // 79
7.2.3 Windows/Linux视频采集 // 85
7.3 视频渲染 // 87
7.3.1 iOS/macOS视频渲染 // 87
7.3.2 Android视频渲染 // 91
7.3.3 Windows/Linux视频渲染 // 92
7.4 视频编解码 // 92
7.4.1 iOS/macOS视频编码 // 94
7.4.2 iOS/macOS视频解码 // 100
7.4.3 Android视频编码 // 104
7.4.4 Android视频解码 // 113
7.4.5 Windows/Linux视频编码 // 120
7.4.6 Windows/Linux视频解码 // 125
7.4.7 编码流控测试 // 125
7.5 视频数据流程调用栈 // 130
第8章 音频数据流程 // 134
8.1 音频数据流程概览 // 134
8.2 音频采集和播放 // 135
8.2.1 iOS音频采集和播放 // 135
8.2.2 Android音频采集和播放 // 143
8.2.3 macOS音频采集和播放 // 153
8.2.4 Windows音频采集和播放 // 154
8.2.5 Linux音频采集和播放 // 154
8.3 音频设备模块ADM // 155
8.3.1 iOS ADM // 155
8.3.2 Android ADM // 156
8.3.3 macOS ADM // 156
8.3.4 Windows ADM // 156
8.3.5 Linux ADM // 157
8.3.6 声音路由 // 157
8.4 音频编解码模块ACM // 158
8.4.1 音频编码 // 159
8.4.2 音频解码 // 160
8.5 音频数据流程调用栈 // 162
第9章 DataChannel // 167
9.1 概览 // 167
9.2 iOS DataChannel // 167
9.2.1 创建DataChannel // 167
9.2.2 SDP // 168
9.2.3 发送消息 // 169
9.2.4 接收消息 // 169
9.3 Android DataChannel // 170
9.3.1 创建DataChannel // 170
9.3.2 SDP // 170
9.3.3 发送消息 // 170
9.3.4 接收消息 // 171
9.4 RTCQuicTransport // 171
第10章 纯音/视频 // 172
10.1 概览 // 172
10.2 AudioTrack的禁用与启用 // 173
10.3 VideoTrack的禁用与启用 // 173
10.4 HijackCapturerObserver // 174
10.4.1 iOS的实现 // 174
10.4.2 Android的实现 // 176
10.5 track状态的通知 // 177
10.6 录制相关 // 177
第11章 多人通话 // 178
11.1 概览 // 178
11.1.1 P2P网状结构 // 178
11.1.2 SFU结构 // 179
11.1.3 MCU结构 // 180
11.2 客户端代码实现 // 180
第12章 日志和状态统计 // 183
12.1 概览 // 183
12.2 iOS集成Mars XLog // 185
12.3 Android集成Mars XLog // 187
12.4 RTCStatsReport // 189
12.4.1 AccumulatedValueSplitter // 190
12.4.2 RtcStats选择函数 // 193
12.4.3 连接状态解析 // 194
12.4.4 视频发送状态解析 // 199
12.4.5 音频发送状态解析 // 205
12.4.6 视频接收状态解析 // 207
12.4.7 音频接收状态解析 // 209
第13章 屏幕共享 // 211
13.1 概览 // 211
13.2 iOS屏幕共享 // 211
13.2.1 CFRPCapturer的实现 // 212
13.2.2 CFRPCapturer的使用 // 214
13.2.3 修改RTCVideoSource // 214
13.3 Android屏幕共享 // 215
13.3.1 ScreenCapturerAndroid的实现 // 215
13.3.2 ScreenCapturerAndroid的使用 // 217
第14章 H.265 支持 // 219
14.1 概览 // 220
14.2 SDP // 220
14.3 编解码 // 222
14.3.1 iOS修改编码代码 // 222
14.3.2 iOS修改解码代码 // 224
14.3.3 Android修改编码代码 // 226
14.3.4 Android修改编码代码 // 227
14.4 RTP封包解包 // 227
第15章 美颜 // 228
15.1 Android美颜处理器 // 228
15.2 iOS美颜处理器 // 231
第16章 伴奏 // 234
16.1 概览 // 234
16.2 解码音频数据 // 235
16.2.1 初始化 // 235
16.2.2 音频解码 // 236
16.2.3 重采样 // 239
16.2.4 销毁 // 240
16.3 播放非接收的音频数据 // 240
16.4 伴奏混音发送 // 243
16.5 其他控制和调节功能 // 246
第17章 本地录制 // 247
17.1 概览 // 247
17.2 添加接口 // 248
17.3 获取数据 // 249
17.4 FFmpeg调用 // 252
17.5 视频关键帧 // 257
17.6 视频方向 // 258
17.7 纯音/视频录制 // 258
第18章 项目外使用WebRTC // 260
18.1 概览 // 260
18.2 摘取源码 // 260
18.3 使用整体静态库 // 264
18.3.1 std::__1 的来源 // 264
18.3.2 修改WebRTC编译配置 // 266
18.3.3 提取头文件 // 267
18.4 使用子模块静态库 // 267
第19章 信令 // 269
19.1 AppRTC Server信令协议 // 269
19.1.1 HTTP POST加入房间 // 270
19.1.2 HTTP GET获取ICE服务器配置 // 271
19.1.3 长连接注册 // 271
19.1.4 HTTP POST发送消息 // 272
19.1.5 长连接发送消息 // 272
19.1.6 离开房间 // 273
19.1.7 同时加入 // 274
19.1.8 Offer/Answer和ICE Candidate顺序 // 274
19.2 OWT Server信令协议 // 274
19.2.1 OWT Server架构 // 274
19.2.2 OWT信令协议 // 276
19.2.3 HTTP POST创建token // 276
19.2.4 SocketIO登录 // 278
19.2.5 SocketIO发布流 // 280
19.2.6 SocketIO发送Offer和ICE Candidate // 280
19.2.7 SocketIO接收Answer // 281
19.2.8 SocketIO订阅流 // 282
19.2.9 SocketIO接收其他用户的通知 // 282
19.2.10 SocketIO退出登录 // 283
19.2.11 Offer和ICE Candidate顺序 // 283
19.2.12 错误重连 // 284
19.2.13 HTTP GET用户和流列表 // 284
19.3 P2P网状结构信令协议 // 285
19.3.1 HTTP POST加入房间 // 286
19.3.2 长连接注册 // 287
19.3.3 WebSocket接收其他用户的通知 // 287
19.3.4 长连接发送Offer/Answer和ICE Candidate // 288
19.3.5 离开房间 // 289
19.3.6 错误重连 // 289
19.3.7 Offer/Answer和ICE Candidate顺序 // 290
第20章 NAT穿透 // 291
20.1 NAT穿透原理 // 291
20.2 coturn的基本使用 // 295
第21章 OWT Server SFU数据流程 // 299
21.1 进程结构和JavaScript代码处理流程 // 299
21.1.1 进程结构 // 299
21.1.2 Management API // 300
21.1.3 WebRTC Portal // 300
21.1.4 Conference Agent // 301
21.1.5 WebRTC Agent // 302
21.1.6 WebRTC Agent node间的流扩散 // 303
21.1.7 Cluster Manager // 304
21.1.8 完整过程总结 // 306
21.2 C 代码处理流程 // 307
21.2.1 WebRTC信令处理 // 308
21.2.2 WebRTC媒体数据处理 // 309
21.2.3 流扩散处理 // 311
第22章 OWT Server MCU数据流程 // 314
22.1 JavaScript代码处理流程 // 314
22.1.1 Conference Agent // 314
22.1.2 Audio Agent // 316
22.1.3 Video Agent // 316
22.1.4 转码处理 // 317
22.2 C 代码处理流程 // 317
22.2.1 AudioMixer // 317
22.2.2 VideoMixer // 318
22.2.3 VideoTranscoder // 320
后记 // 321
前沿
提到WebRTC,大家首先想到的可能是Web开发,虽然WebRTC首先发力于Web端,但WebRTC在Native端的应用场景也不容小觑,毕竟Native App的效率依然远超H5。
目前市面上关于WebRTC的书籍大多都是关注Web端的,对Native端(Android、iOS、macOS、Windows、Linux)的涉猎非常少,目前只有WebRTC Blueprints一书最后讲了一下Android和iOS平台的编译、运行,但这本书已经是2014年的书了。此外,还没有任何图书对WebRTC内部的技术实现进行分析。
本书的目的是引导想使用WebRTC Native的开发者进行入门学习,让读者通过本书的学习能够掌握WebRTC Native开发的基本流程,掌握WebRTC内部的主要数据流程,掌握对WebRTC进行调试分析、二次开发的能力。
本书的特点是示例代码丰富,实用性和系统性较强,适合WebRTC Native入门开发者阅读。此外,本书还包含WebRTC内部的主要数据流程,会对WebRTC的内部实现原理进行剖析。
本书首先会介绍Native端WebRTC SDK基本场景的使用,接着对基本场景的主要数据流程进行源码导读,之后会讨论一些高级的功能和场景,最后对Server端展开讨论。
笔者使用的真机开发环境为macOS 10.15.3(19D76)、Xcode 11.3.1(11C504)、Android Studio 3.5.3,虚拟机环境为Parallels Desktop Windows 10和Ubuntu 18.04.3。
本书所涉及的WebRTC示例代码以及源码分析内容都是基于WebRTC的#30432提交,即通过https://webrtc.googlesource.com/src.git/ /be99ee8f17f93e06c81e3deb4897dfa8253d3211/提交。OWT Server的代码都是基于4.3.x分支的。
本书所有源码开源在 GitHub 上(https://github.com/HackWebRTC/webrtc),读者也可以扫描下方的二维码获取:
如果你在下载过程中遇到问题,可发送邮件至booksaga@126.com获得帮助,邮件标题为“WebRTC Native开发实战”。
另外,欢迎读者加入本书专属社群:Hack WebRTC星球。对本书的任何疑问或者想法,以及WebRTC Native开发相关的话题,都可以在星球里提问、讨论,详情请访问:
https://blog.piasy.com/webrtc/index.html
许建林
2020年5月
WebRTC Native 开发实战 pdf下载声明
本pdf资料下载仅供个人学习和研究使用,不能用于商业用途,请在下载后24小时内删除。如果喜欢,请购买正版