kongxiaoan / webrtc-android

webrtc 客户端学习demo

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

theme
cyanosis

目前的浪潮,我不说,你也知道。

所从事的工作其实就是音视频行业,有短视频、有直播,但是我还是一个普通的Android 工程师,这是为什么呢?为什么不是一个音视频工程师呢?

和在座的一样,我也是使用现成的播放器、现成的推拉流SDK.

但是有一个现实的问题是,音视频的行业研发成本极高,一般公司都不会选择自研,所以音视频行业的公司数不胜数,但都属于音视频业务,真正做音视频的公司很少,基本掌握在音视频大厂的手中。 其实也只有它们才能提供优质的音视频业务服务。

定个路线

音视频是庞大且复杂的模块,无论是从那个角度入手(声音、图像(各种变化算法、直播、短视频))都是一条宽且直的大道,前途无量。

是这样计划的。 首先玩一遍webRTC ,做一个1V1 语音、通话,房间语音、通话的Android 软件,会完成Android端 + 服务端。

为什么选择WebRTC

  • 自己动手写推拉流等太过于庞大并且我也不会,网上教程多,但成体系的基本没有

  • 就目前而言直播的技术难度、热度都比较大

    你以为大就完了吗?不,直播目前被分为两种

  1. 以会议为主的实时互动直播
  2. 以娱乐为主的流媒体直播

其中互动直播强调实时性,比如上课、开会,总不能老板问问题员工回答不及时吧。这种直播延迟要求低一般要低于500ms. 娱乐直播,就好说了只要能看的人多,对于流来讲没什么大要求,观众有聊天室就可以了,但是侧重是有大规模的分发,当然这就不是我们所说的直播问题了

现在好多大厂都将互动直播与娱乐直播做了合并,更多的使用webrtc 。

在这个技术趋势下,再看下WebRTC.

WebRTC 的优势

  1. 实时音视频通信: WebRTC 允许在浏览器之间建立实时音视频通话。用户可以通过摄像头和麦克风共享视频和音频流。这使得视频通话、语音通话和视频会议等应用得以实现。
  2. 数据通信: WebRTC 不仅支持音视频通信,还支持在浏览器之间传输数据。这对于创建实时聊天、文件传输和共享应用程序非常有用。
  3. NAT 穿透和防火墙穿越: WebRTC 使用一种称为 ICE(Interactive Connectivity Establishment)的技术,帮助用户在可能存在网络地址转换(NAT)和防火墙等限制的网络环境中建立连接。
  4. 媒体协商: 在通信开始之前,通信双方需要协商媒体相关的参数,如编码方式、传输速率等。WebRTC 支持 SDP(会话描述协议)和协商过程,使通信双方能够互相确认和适配媒体设置。
  5. 音视频处理: WebRTC 提供了音频和视频的处理功能,可以在浏览器中对音频和视频流进行处理,如降噪、回声消除、编码和解码等。
  6. 安全性: WebRTC 使用加密技术保障通信的隐私和安全性,确保传输的音视频数据不会被窃听或篡改。
  7. Google 加持

与RTMP对比

WebRTC 和 RTMP(Real-Time Messaging Protocol)都是用于实时通信的技术,但它们在很多方面有所不同。以下是 WebRTC 和 RTMP 的一些主要区别和对比:

  1. 用途和支持:
  • WebRTC:主要用于浏览器之间的实时音视频通信,以及数据传输。它支持在现代的Web浏览器中直接使用,无需安装插件。
  • RTMP:主要用于流媒体传输,特别是在早期的网络视频直播和点播应用中较为常见。它通常需要使用专门的媒体服务器,并且在现代Web浏览器中的支持有限。
  1. 传输协议:
  • WebRTC:使用了多种协议来建立连接,包括ICE、STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relays around NAT),以便在不同的网络环境下建立连接。
  • RTMP:使用自己的协议,即 RTMP,用于流媒体传输,但其不太适用于点对点通信。
  1. 性能和延迟:
  • WebRTC:设计用于实现低延迟和高质量的实时通信,适合视频通话、视频会议等场景,通常具有较低的延迟。
  • RTMP:在视频直播中,由于使用媒体服务器,可能会导致相对较高的延迟,尤其是在需要广播内容到多个观众时。
  1. 支持设备:
  • WebRTC:支持PC、移动设备和现代Web浏览器,具有跨平台的能力。
  • RTMP:在使用浏览器时,需要使用Flash插件来支持,而且随着现代Web浏览器对Flash的逐渐淘汰,对RTMP的支持也在减弱。
  1. 安全性:
  • WebRTC:提供端到端的加密,保障通信内容的隐私和安全。
  • RTMP:在流媒体传输中,通常需要将其配合其他安全协议使用,如RTMPS(RTMP over SSL)来加强安全性。

看见了吗?所以选择了从它入手,其实使用它比较简单,就串个流程而已。这对于初学者是比较友好的,可以熟悉整个业务流程,然后在学习音视频中哪些没机会做,但面试会问的音视频知识

使用webrtc 进行开发需要具备哪些知识

webrtc 自身的使用在任意可用平台上如果没有特殊的需求,是不需要再次开发的,但是对于业务而言还需要其他的开发支持。

要实现WebRTC一对一通信,信令服务器是重要的一环。没有信令服务器,通信的双方就无法进行正常的通信,就像我两座孤岛。

信令服务器

什么是信令服务器

信令服务器是一种计算机服务器,用于在实时通信系统中协调和管理通信会话的建立、维护和终止过程。实时通信系统可以是音频通话、视频通话、即时消息等各种类型的应用,如VoIP(Voice over Internet Protocol)应用、实时视频会议应用和即时通讯应用。

信令服务器的主要职责包括:

  1. 用户身份验证和授权: 信令服务器负责验证用户的身份和权限,确保只有合法用户可以进入通信会话。
  2. 会话管理: 信令服务器协调通信会话的建立、维护和终止。它处理通信会话的开始和结束,以及会话中间可能发生的状态转换。
  3. 寻址和路由: 在通信开始前,信令服务器可以帮助确定通信双方的网络地址,以及如何在网络中找到彼此。在大规模网络中,信令服务器也可能负责路由通信数据。
  4. 媒体协商: 信令服务器可以帮助双方确定最佳的媒体传输参数,如音频和视频编解码格式、分辨率、比特率等。
  5. 状态同步: 在多方通信中,信令服务器有时需要同步各个参与者的状态,以确保所有参与者看到相同的会话状态。
  6. 错误处理: 信令服务器负责处理通信中可能出现的错误和异常情况,例如连接中断、媒体传输问题等。

信令服务器在实时通信系统中扮演着一个关键角色,确保通信会话能够顺利建立和维护,同时管理各种通信相关的参数和状态。它与媒体服务器(负责音频、视频传输等)通常一起协作,构成了完整的实时通信基础设施

主要作用是什么

总结起来就两点

  1. 实现业务层的管理,如用户创建房间,加入房间,退出房间等;
  2. 让通信的双方彼此交换信息,其中最常见的是交换通信双方的IP地址和端口

介绍完信令服务器后,大家肯定还是云里雾里的,下面结合WebRTC 一对一通信架构进一步了解答一下信令服务器是什么

WebRTC 一对一通信架构

(图来自《WebRTC音视频实时互动技术: 原理、实战与源码分析》) image.png

其中,NAT、STUN\TURN 分别是:

  • NAT:网络地址转换(Network Address Translation,简称NAT)是一种在计算机网络中广泛使用的技术,用于将私有网络内部的IP地址转换为公共网络可路由的IP地址,以实现多台设备共享一个公共IP地址访问互联网的功能

  • STUN:NAT会话穿越实用工具协议(Session Traversal Utilities for NAT,简称STUN)是一种用于帮助在NAT背后的设备之间建立通信的协议。它的主要目的是解决由于网络地址转换(NAT)引起的通信问题,特别是在对等(peer-to-peer)通信或实时通信应用(如VoIP、视频聊天和在线游戏)中。

  1. 设备发送一个STUN请求到STUN服务器,请求包含了设备所见到的自己的IP地址和端口号。
  2. STUN服务器收到请求后,会从请求中获取到设备所在的公共IP地址和端口号,并将这些信息返回给设备。
  3. 设备收到STUN服务器的回复后,就可以将这些信息告诉其他设备,从而实现对等通信。
  • TURN:"Traversal Using Relay NAT"(TURN)是一种网络协议,它允许位于不同NAT背后的设备通过一个中继服务器进行通信,从而解决因NAT导致的直接通信问题。

当两个设备都位于不同类型的NAT后面,可能无法直接建立连接。在这种情况下,TURN充当一个中继站,这个中继服务器位于一个可以被两个设备访问的公共网络上。两个设备可以将它们的通信数据发送到TURN服务器,然后服务器将数据传递给另一个设备。

TURN的工作方式如下:

  1. 设备A和设备B都连接到TURN服务器。
  2. 设备A将要发送给设备B的数据发送到TURN服务器。
  3. TURN服务器接收到数据后,将数据传递给设备B。
  4. 设备B也可以将数据发送到TURN服务器,然后由服务器传递给设备A。

这种中继方式允许两个设备在无法直接建立连接的情况下进行通信。它在以下情况特别有用:

  1. 当设备位于严格的NAT类型(如对称NAT)后面,无法通过STUN获取公共地址。
  2. 当设备之间无法直接建立UDP连接,例如在企业网络中。

需要注意的是,使用TURN的中继方式会引入一些延迟,因为数据需要先经过服务器才能到达目标设备。此外,TURN服务器需要额外的基础设施和资源来支持中继通信。

这几个概念对于我来说确实很新鲜,不太好理解.

可以这样理解:

当你的设备(比如电脑或手机)想要通过互联网与其他设备通信时,它们使用IP地址来找到对方。但是,由于IP地址有限,需要一种方法来让很多设备共享相同的IP地址,这就是NAT的作用。NAT就像是你家门口的信箱,把所有家人的信都放在同一个地方,但用不同的槽位(端口号)来分辨。然而,NAT会导致问题:当设备位于不同的NAT后面时,它们可能无法直接交流。这就像两个人住在不同的小区,无法直接找到对方的房子。这时候就需要STUN和TURN来帮忙。STUN是一个帮助设备找到自己公共IP地址和端口号的工具。它就像一个地址簿,告诉你你住在哪里,其他人可以通过这个信息找到你。TURN是另一种情况:当两个设备都无法直接通信时,它们可以通过一个“中转站”来传递信息,就像两个人通过一个共同的朋友传话一样。TURN充当中转站,帮助设备互相传递信息,以便它们能够通信。NAT是为了让多个设备共享一个IP地址,STUN是为了帮助设备找到自己的地址,TURN是在无法直接交流时帮助设备传递信息的中转站。它们共同协助解决了因NAT引起的通信问题,让设备可以更好地互相交流

由上面的图,就可以看到,两个用户要进行通信

  1. 都要先于信令服务器建立连接
  2. 通过信令服务器交换信息

这就说明了要开发此类应用时,必须要先开发一个信令服务器

webrtc 通信

这就是要进行的主要业务了。

后续计划

做一个1V1 语音、通话,房间语音、通话的Android 软件,会完成Android端 + 服务端。

  • 边学边做:构建信令服务器与长连接
  • 边学边做:实现一对一语音通话
  • 边学边做:进阶:房间语音通话与多人互动

About

webrtc 客户端学习demo

License:Apache License 2.0


Languages

Language:Kotlin 67.3%Language:CMake 21.5%Language:HTML 8.2%Language:C++ 3.1%