WebRTC局域网实现一对一音视频通话【保姆级源码教程】

1 WebRTC是什么

顾名思义,WebRTC即浏览器中的实时通信,如实时音视频传输、P2P数据传输、网络流媒体传输等。

WebRTC是一套技术栈组合,通过观察其架构图可以发现,其涉及到的技术栈包括以下方面:

  1. 实时通讯协议:WebRTC使用了一系列的实时通讯协议,包括RTP(实时传输协议)、SRTP(安全实时传输协议)等,用于在网络上传输音频、视频和数据流。

  2. 媒体捕获:WebRTC可以通过getUserMedia API来获取媒体设备(比如摄像头、麦克风)的视频和音频流。

  3. 音视频编解码:WebRTC需要对获取的音频和视频数据进行编解码,以便在网络上传输和显示。WebRTC通常使用VP8、VP9或H.264等视频编解码格式,Opus或AAC等音频编解码格式。

  4. 网络传输:WebRTC使用UDP、TCP等协议在客户端之间传输实时音视频流。它还使用ICE(Interactive Connectivity Establishment)框架来协助客户端在NAT(网络地址转换)背后建立对等连接。

  5. 信令:WebRTC不包含信令协议,因此需要使用类似于WebSocket、HTTP、XMPP等协议进行建立连接、传输会话描述等信令操作。

  6. 安全:WebRTC通过使用DTLS(Datagram Transport Layer Security)和SRTP来对传输的音视频流进行加密,保障通信的安全性。

  7. 智能网络适应:WebRTC还包含了对网络状况的实时监测,以确保在各种网络条件下实现稳定的实时通讯。
    在这里插入图片描述

2 WebRTC常用API介绍

WebRTC提供了大量的API,你可以通过访问WebRTC API - Web APIs | MDN (mozilla.org)来查看,API的使用在GitHub也有全面的示例WebRTC 示例。这里我只介绍了P2P的音视频对话所涉及的JavaScript API及方法。

  1. getUserMedia API
    • 方法:navigator.mediaDevices.getUserMedia()
    • 介绍:getUserMedia API用于从用户的摄像头和麦克风获取媒体流。通过调用该API的方法,可以请求用户授权,并获取音频和视频的本地媒体流用于后续处理和传输。
  2. RTCPeerConnection API
    • 方法:new RTCPeerConnection(), createOffer(), createAnswer(), setLocalDescription(), setRemoteDescription(), addIceCandidate(),onicecandidate(),ontrack(),addTrack()
    • 介绍:RTCPeerConnection API用于在浏览器之间创建点对点连接,处理音视频流的传输和通信。通过这些方法,可以创建连接、交换媒体信息、处理ICE候选等,实现音视频通话功能。

只需要两个API和九个方法即可完成P2P音视频通话,是不是很简单,当然这需要你提前掌握通话建立的流程。

3 一对一通话流程

贴一张官方流程图,好吧,看不懂,有些单词翻译过来也不明白在流程图中代表什么意思,比如STUN、TRUN、SDP、NAT、ICE candidate。SDP和NAT不是WebRTC中定义的概念,可能你需要花些时间去找资源了解,其他概念可以从这里Introduction to WebRTC protocols - Web APIs | MDN (mozilla.org)来学习。

  1. SDP(Session Description Protocol):SDP是一种用于描述媒体流参数的协议。在WebRTC中,设备之间通过交换SDP来协商媒体流的设置。SDP描述了媒体流的编解码器、分辨率、传输协议等信息。
  2. ICE(Interactive Connectivity Establishment):ICE是一种用于处理网络连通性和NAT穿越的技术。它允许设备在不同的网络环境中建立直接连接。ICE使用候选项(Candidates)来表示设备的网络地址,通过交换候选项,设备可以找到合适的路径建立连接。
  3. STUN(Session Traversal Utilities for NAT)服务器:STUN服务器用于帮助设备发现自己的公共IP地址和端口,以克服NAT限制。设备可以通过向STUN服务器发送请求,获取自己的公共地址,并将其用作候选项。
  4. TURN(Traversal Using Relays around NAT)服务器:TURN服务器是作为备选方案的中继服务器。如果设备无法直接建立点对点连接(例如,由于防火墙或限制),它可以通过TURN服务器中继数据流。
    在这里插入图片描述

上述流程图,其实就做了两件事:

  1. 媒体协商:PeerA与PeerB通过交换双方的SDP(会话描述协议),确定媒体类型、媒体格式等。
  2. 网络协商:通过交换ICE候选项,确定对方的网络位置。

两个协商都成功以后,就能实现双方的音视频通话了,也就是媒体传输。

协商过程中,因为PeerA与PeerB并不知道彼此位置的存在,PeerA与PeerB不能直接通信,这就是需要中间人来传话,中间人就是信令服务器。

如果你看了关于ICE的介绍,就会发现,这是一种应用在公网的技术,帮助Peer实现自己身份(地址)的确认。事实上,在许多场景中,我们都是基于局域网进行生产开发,也就是每一端都清楚彼此的身份(固定IP),就能知道对方的身份(固定IP),所以ICE的过程是不必要的,可以直接将自己的candidate告诉对方。

关于局域网下P2P通信以及协商流程见下图:
在这里插入图片描述

有了如此详尽的流程图,那就实现代码走流程吧。

4 代码以及效果

4.1 实现信令服务器

信令采用的是WebSocket协议实现,服务器采用的是SpringBoot项目创建。
在这里插入图片描述

4.2 实现Peer客户端

HTML页面,JavaScript调用WebRTCAPI。
在这里插入图片描述

4.3效果

  1. 创建媒体,建立连接在这里插入图片描述
  2. PeerA加入通话房间在这里插入图片描述
  3. PeerB加入通话房间在这里插入图片描述
  4. 协商并通话在这里插入图片描述
    如果需要源码以及源码手把手教学记得私信我
  • 38
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倔强的初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值