WebRTC 入门了解,基本使用记录
Autosq 2024-08-23 15:03:02 阅读 93
一、前言
WebRTC(Web Real-Time Communications)是一个开源项目,也称网页实时通信技术。
二、WebRTC 简介
webrtc 是什么
它允许在网页浏览器上进行实时的音视频通信。WebRTC 特别适用于需要低延迟和高互动性的应用场景,比如视频会议、在线游戏、远程控制等。以下是WebRTC在处理直播数据实时性方面的几个关键点:
1. P2P连接
WebRTC旨在建立点对点(P2P)连接,这意味着数据直接在客户端之间传输,无需经过服务器中转。这种方式减少了延迟,提高了实时性。
在计算机网络和通信领域,"peer"一词通常指的是"对等体"或"对等节点"。在对等网络(peer-to-peer, P2P)架构中,每个节点(peer)都具有相同的权利和能力,可以独立地发起通信和交换数据,没有固定的客户端或服务器角色。下面是一些关于"peer"的常见用法和概念:
【对等网络 P2P NETWORK】
在P2P网络中,每个节点既可以是客户端,也可以是服务器,可以发送请求,也可以响应请求。
【WebRTC 中的PeerConnection】
在WebRTC(Web Real-Time Communications)技术中,<code>PeerConnection是一个关键概念,代表一个对等连接。它允许在两个浏览器之间直接建立连接,进行音视频通话或数据共享。
【NAT穿透】
peer基本都在内网,需要通过nat穿透技术来与peer建立连接。
根据nat的拓扑情况大致分为如下几种:完全锥形、IP锥形、端口锥形、对称形。
stun\turn协议:stun协议用来拿到peer公网ip,turn用来做relay数据转发。
2. STUN和TURN服务器
在某些网络环境下,P2P连接可能难以建立,这时WebRTC会使用STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relays around NAT)服务器来辅助连接的建立。尽管这增加了一点额外的延迟,但相比传统的服务器中转,它仍然能够保持较低的延迟。
【服务端】
在整个连接生命周期中都是需要服务端参与。参与webrtc协作的服务端大概分为这几种类型。
stun/turn服务器(p2p穿透)、信令服务器、媒体服务器(媒体信息处理)、业务服务器(可选)
整体流程大致如下。
3. 信令过程
WebRTC的信令过程负责交换必要的信息,以便建立连接。信令可以在任何支持WebSocket或类似技术的服务器上进行。信令过程需要设计得尽可能高效,以减少连接建立的时间。
4. 实时数据传输
WebRTC使用RTP(实时传输协议)来传输音视频数据。RTP设计用于提供时间同步和顺序保证,这对于实时音视频通信至关重要。
5. 动态调整
WebRTC可以根据网络状况动态调整传输质量。例如,在网络条件不佳时降低视频分辨率或比特率,以保持流畅的通信。
6. 无服务器中转
与传统的直播技术相比,WebRTC不需要服务器中转数据,除非使用TURN服务器。这减少了数据传输的延迟。
7. 浏览器支持
WebRTC设计为在现代浏览器中运行,这意味着它可以无缝地集成到网页中,无需安装额外的插件或软件。
8. 可扩展性
虽然WebRTC主要是为一对一或小规模通信设计的,但通过使用所谓的选择性转发单元(SFU)或多点控制单元(MCU)服务器,WebRTC也可以扩展到更大规模的直播场景。
我们先大概了解下webrtc的几种架构及各自适用场景。
以及各个适用场景下的选型优劣势:
【Mesh】
Mesh架构,需要所有参与连接的peer建立与所有其他peer的媒体连接。
该架构需要n-1个上下行,以此带来的带宽消耗(流量)、编/解码消耗(手机性能)成线性增长。
该架构只能适用3-4个人的小型会议场景。
【MCU】
所有本房间的peer将本地媒体流推到远程媒体服务器,由媒体服务器进行混流,然后再推到所有连接的peer端。
该架构的优点就是只需要1路上下行,随着peer人数不断增加,依然不会对用户造成带宽、手机性能影响。
该架构将压力转嫁到服务端,由专用媒体服务器来完成混流,转推等功能。
【SFU】
相对于MCU来说SFU只做转发,媒体服务器压力有限。与mesh架构相比,只需要n-1个下行,1个上行。
在大规模的场合该架构具有伸缩性。
9. 插件和库
有许多第三方库和插件可以帮助开发人员更容易地集成WebRTC到他们的应用中,如<code>SimpleWebRTC、Medooze
等。
10. 安全性
WebRTC支持DTLS-SRTP(Datagram Transport Layer Security - Secure Real-time Transport Protocol)加密,确保传输的数据安全。
三、示例
在Go语言中使用WebRTC需要借助第三方库,因为Go的标准库中没有内置WebRTC的支持。一个流行的Go WebRTC库是pion/webrtc
。以下是使用pion/webrtc
创建一个简单的WebRTC服务器的示例,该服务器能够处理客户端之间的实时通信。
首先,你需要安装pion/webrtc
库:
go get github.com/pion/webrtc/v3
然后,你可以编写以下代码来创建一个WebRTC服务器:
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/pion/webrtc/v3"
"github.com/pion/webrtc/v3/pkg/media"
)
func main() {
// 设置HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, WebRTC Server!")
})
// 设置WebRTC处理函数
http.HandleFunc("/webrtc", func(w http.ResponseWriter, r *http.Request) {
webrtcServer(w, r)
})
log.Println("Starting server on :8080...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe error:", err)
}
}
func webrtcServer(w http.ResponseWriter, r *http.Request) {
// 创建一个新的API对象
api := webrtc.NewAPI(nil)
// 设置ICE服务器
iceServers := []webrtc.ICEServer{
{
URLs: []string{"stun:stun.l.google.com:19302"},
},
}
// 创建一个新的PeerConnection
peerConnection, err := api.NewPeerConnection(webrtc.Configuration{
ICEServers: iceServers,
})
if err != nil {
log.Fatalf("Error creating PeerConnection: %v", err)
return
}
// 设置PeerConnection的回调函数
peerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) {
fmt.Printf("ICE Connection State: %s\n", connectionState.String())
})
// 处理信令消息
var offer webrtc.SessionDescription
if err := json.NewDecoder(r.Body).Decode(&offer); err != nil {
log.Printf("Error reading offer: %v", err)
return
}
// 设置远端描述
if err := peerConnection.SetRemoteDescription(offer); err != nil {
log.Printf("Error setting remote description: %v", err)
return
}
// 创建一个本地描述
answer, err := peerConnection.CreateAnswer(nil)
if err != nil {
log.Printf("Error creating answer: %v", err)
return
}
// 设置本地描述
if err := peerConnection.SetLocalDescription(answer); err != nil {
log.Printf("Error setting local description: %v", err)
return
}
// 发送本地描述给客户端
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(answer); err != nil {
log.Printf("Error encoding answer: %v", err)
}
}
总结
以上只是提供webRTC 一个简单的用例,具体的也可以参考 一文带你了解webrtc基本原理(动手实现1v1视频通话)_webrtc的原理-CSDN博客 此博主的具体实现,实现视频 1v1 的简单功能。
此文只简单介绍了一下webRTC,以及简单的框架搭建,如果扩展的话,需要查询更多的资料,祝大家生活愉快~
参考文献
github.com/googollee/go-socket.io
一文带你了解webrtc基本原理(动手实现1v1视频通话)_webrtc的原理-CSDN博客
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。