当前位置: 首页 > news >正文

【音视频协议篇】WebRTC 快速入门

目录

📁 介绍

📁 WebRTC框架

📁 WebRTC通话原理

📁 一对一通话流程

📁 总结


📁 介绍

适用于网络的实时通信

        借助 WebRTC,您可以为应用添加基于开放标准运行的实时通信功能。它支持在对等设备之间发送视频、语音和通用数据,使开发者能够构建强大的语音和视频通信解决方案。这项技术适用于所有现代浏览器以及所有主要平台的原生客户端。WebRTC 采用的技术是开放网络标准,以常规 JavaScript API 的形式在所有主流浏览器中提供。对于原生客户端(例如 Android 和 iOS 应用),可以使用具备相同功能的库。

                                                                                                                        ---- 官方介绍

        WebRTC (Web Real-Time Communication,网页实时通信) 是一项支持浏览器之间无需插件即可进行实时音视频和数据通信的开源技术。

        WebRTC虽然冠以"web"之名,但并不受限于传统互联网应用或浏览器的终端运行环境。实际上无论终端运行环境还是浏览器,桌面应用,移动设备,只要IP连接可到达并且符合WebRTC规范就可以相互通话。

📁 WebRTC框架

        特别是PeerConnection为Web开发人员提供了一个抽象,从复杂的内部结构中抽象出来。我们只需要关注PeerConnection这个对象就可以开发音视频通话应用。

WebRTC架构组件

  1. Your Web App

      Web开发者开发的程序,Web开发者可以基于集成WebRTC的浏览器提供的web API开发基于视频,音频的实时通信应用。

    1. Web API

        面向第三方开发者的WebRTC标准API(Javascript),使得开发者能够容易地开发出类似于网络视频聊天的web应用。

      1. WebRTC Native C++ API

          本地C++ API层,使浏览器厂商容易实现WebRTC标准的Web API,抽象的对数字信号过程进行处理

        1. Tranport/Session

            传输/会话层。会话层组件采用libjingle库的部分组件实现,无须采用xmpp/jingle协议

          1. VoiceEngine

              音频引擎,包含一系列音频多媒体处理的框架。

            1. VideoEngine

                    视频处理引擎,包含一系列视频处理的整体框架,从摄像头采集到视频信息网络传输,再到视频显示整个过程的解决方案。

            📁 WebRTC通话原理

            1. 媒体协商 sdp

                    使用SDP(Session Description Protocol)协议,用于描述媒体信息。在WebRTC中,通信双方必须先交换SDP信息。

            2. 网络协商 condition

                    获取一条互相通讯的链路。

            1. 获取外网IP地址映射;

            2. 通过信令服务器(signal server)交换"网络信息"

            STUN

            STUN(Session Traversal Utilities for NAT, NAT会话穿越应用程序)是一种网络协议,允许位于NAT后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某个本地端口所绑定的Internet端端口。

            通俗来说,就是告诉我 我的公网IP地址+端口号。

            TURN

            STUN并不是每次都能成功的为需要NAT的通话设备分配IP地址,P2P在阐述媒体流时,使用的本地带宽,子啊多人视频通话的过程汇总,通话质量的好坏往往需要根据使用者本地的带宽确定。TURN就可以很好的解决这个问题。

            TURN(Traversal Using Relays around NAT),是STUN的一个扩展,添加了Relay功能。如果终端在NAT之后,那么特定情况下,有可能终端无法和对端(peer)进行直接的通信,这是就需要公网的服务器作为一个中级,对来往的数据进行转发,这个转发的协议成为TURN。

                    在STUN分配公网IP失败后,可以通过TRUN服务器请求公网IP地址作为中继地址。这种方式的带宽由服务器承担。

            3. 媒体协商+网络协商数据的交换通道

                    两个客户端协商媒体信息和网络信息,怎么去交换呢?因此就需要一个中间商来做交换?因此需要一个信令服务器(Signal Server)转发批次的媒体信息和网络信息。

            信令服务器不只是交换 媒体信息sdp和网络信息candidate,比如:

            1. 房间管理

            2. 人员进出管理

            WebRTC APIs:

            mediaStream:

                    MediaStream用来表示一个媒体数据流(通过getUserMedia接口获取),允许访问输入设备,如麦克风和Web摄像机,该API允许从其中任意一个获取媒体流。

            RTCPeerConnection:

                    RTCPeerConnection对象允许用户在两个浏览器之间直接通讯,可以通过网络将捕获的音频和视频流实时发送到另一个WebRTC端点。使用这些API,可以在本地机器和远端对等点直接创建连接。提供了连接到远程对等点,维护和监视连接以及在不需要连接时关闭连接的方法。

            媒体协商方法:

            1. createOffer

            2. createAnswer

            3. setLocalDescription

            4. setRemoteDescription

            重要事件:

            1. onicecandidate

            2. ontrack

                    我认为结合 ''结合一对一通话流程" 学习WebRTC API更方便学习和理解。

            📁 一对一通话流程

                    总结一下简单的流程:

            1. C1 向信令服务器发送 join申请加入一个房间。信令服务器记录房间号roomId和C1的uid。

            2. C2 向信令服务器发送 join申请加入同一个房间,信令服务器也记录C2的uid,同时想C1发送一个消息,告知有一个远程用户加入了房间

                    以上操作都是在关于信令服务器的,接下来进行媒体协商和网络协商。

            3. C1 创建RTCPeerConnection,绑定回调函数,设置本地媒体描述等,然后C1创建发送offer,信令服务器转发给C2 ,C2收到后也同C1一样做相同的事情,只不过多设置了C1的媒体描述,然后将自己的媒体描述发送给C1,即发送answer。

                    C1收到answer后,将设置C2的远端媒体描述。

            4. C1设置完媒体协商后,进行网络协商,即发送candidate。C2 收到后,通过 addIceCandidate()添加候选。然后C2发送candidate,C1也添加候选。

            1. 当调用 setLocalDescription()后,浏览器开始收集 ICE 候选.

            2. 每发现一个候选,onicecandidate触发一次.

            5. 进行完网络协商后,双方添加对端的媒体轨道添加进RTCPeerConnection。

            通过 addTrack()添加媒体轨道(MediaStreamTrack)到 RTCPeerConnection.

            📁 总结

                    以上就是,WebRTC的简单介绍了,我认为自己写一个 简易的 "一对一通话"demo有助于快速上手WebRTC。此外 《WebRTC权威指南》也是一本不错的书籍。

            《WebRTC权威指南》

            http://www.dtcms.com/a/298989.html

            相关文章:

          2. 嵌入式——C语言:指针②
          3. Kotlin线程同步
          4. TCP/IP 网络编程面试题及解答
          5. 数智管理学(三十九)
          6. train_model_components ——组件模型的灵感,灵感
          7. PYTHON从入门到实践-15数据可视化
          8. 震网(Stuxnet):打开潘多拉魔盒的数字幽灵
          9. Android ADB命令之内存统计与分析
          10. C++对象模型
          11. CH341 Linux驱动 没有 /dev/ttyCH341USB0
          12. 前端模块化开发实战指南
          13. kafka中生产者的数据分发策略
          14. starrocks官网docker部署mysql无法连接
          15. 影刀RPA_Temu关键词取数_源码解读
          16. RK3568笔记九十三:基于RKNN Lite的YOLOv5目标检测
          17. 高性能网络DPDK、RDMA、XDP初探
          18. VTK交互——ClientData
          19. Java程序员学从0学AI(六)
          20. Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)
          21. 热传导问题Matlab有限元编程 :工业级热仿真核心技术-搭建热传导求解器【含案例源码】
          22. CSS3知识补充
          23. 【企业架构】TOGAF概念之二
          24. 基于深度学习的图像分类:使用Capsule Networks实现高效分类
          25. 【Linux手册】操作系统如何管理存储在外设上的文件
          26. 用 FFmpeg 把视频输出为图片序列
          27. 创建 Vue 项目的 4 种主流方式
          28. 小程序的客服咨询(与企业微信建立沟通)
          29. [论文阅读] 人工智能 + 软件工程 | NoCode-bench:评估LLM无代码功能添加能力的新基准
          30. 使用Python实现单词记忆软件
          31. Day 22: 复习