WebRTC 入门了解,基本使用记录

一、前言

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)技术中,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到他们的应用中,如SimpleWebRTCMedooze等。

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

  • 51
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值