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博客

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。