WebRTC音视频开发读书笔记(一)
一、基本概念
WebRTC(Web Real-Time Communication,网页即时通信)于2011年6月1日开源,并被纳入万维网联盟的W3C推荐标准,它通过简单API为浏览器和移动应用提供实时通信RTC功能。
1、特点
跨平台:可以在Web,Android、IOS、Windows、MacOS、Linux环境运行。
实时传输:速度快、延迟低。
免插件:无需插件、打开浏览器即可使用。
免费:集成了强大的音视频引擎和先进的Codec,但仍是免费。
强大打洞能力:支持代理、NAT和防火墙穿透技术。
2、应用领域
音视频会议、在线教育、照相机、音乐播放器、共享远程桌面、录制、即时通信工具、P2P网络加速、文件传输工具、游戏、实时人脸识别。
3、整体架构:

(1)Web应用
音视频实时通信应用,如视频会议、远程教育、远程协作、实时人脸识别、行程机械手操作等。
(2)WebAPI
WebAPI是面向第三方开发者的WebRTC标准API ,常用API如下所示:
MediaStream:媒体数据流、如音频流、视频流等。
RTCPeerConnection: 提供了应用层的调用接口
RTCDataChannel:: 传输非音视频数据,如文字、图片等
(3)C++ API
低层API使用C++ 语言编写、使用浏览器厂商容易实现WebRTC标准API,抽象地对数字信号过程进行处理。
(4)Session Managerment
一个抽象的会话层、提供会话建立和管理功能,该层协议留给应用开发者自定义实现。对于Web应用,建议使用WebSocket技术来管理信令Session。信令主要用来转发会话双方的媒体信息和网络信息。
(5)Transport
此为WevRTC的传输层,涉及音视频的数据发送、接收、网络打洞等内容,可以通过STUN和ICE组件来建立不同类型间的呼叫连接。
(6)VoiceEngine
音频引擎是包含一系列音频多媒体处理的框架,包括从音频采集到网络传输等整个解决方案。
(7)VideoEngine
视频处理引擎,包含一系列视频处理的整体框架,从摄像头采集视频到视频信息网络传输再到视频显示等整个解决方案。
二、WebRTC通话原理
WebRTC通话典型场景就是音视频通话,下面简化流程,提出主要的步骤。通话原理基本流程如下所示:
1、通信原理基本流程图

媒体协商:Peer-A与Peer-B通过信令服务器进行媒体协商,双方交换的媒体数据由SDP(Session Description Protocol)描述。
网络协商:Peer-A与Peer-B通过STUN服务器获取到各自的网络信息,再通过信令服务器转发,互相交换各种网络信息。即P2P打洞成功建立直连。
建立连接:Peer-A与Peer-B通过直连或TURN中转服务器传输音视频数据。
2、媒体协商
Peer-A和Peer-B都访问中转服务器(信令服务器)来帮助它们交换SDP数据信息。SDP交换过程如图所示:

3、网络协商
通信双方要了解对方的网络情况,找到一条通信链路,需要做以下二个步骤,一是获取本地的外网地址映射,二 是通过信令服务器交换网络信息。现实情况是我们计算机都是在局域网中并且有防火墙要进行网络地址转换(Network Address Translation NAT),其示意图如下所示:

NAT技术会保护内网地址的安全性,当采用P2P 通信时,NAT会阻止外网地址的访问,就必须采用NAT穿透技术。其基本思路是借助一个公网IP服务器,双方都向公网IP服务器发送IP/PORT网络信息包,公网IP服务器向Peer-A发送Peer-B的IP/PORT网络信息包,并且向Peer-B发送Peer-A的网络信息包。双方就可以建立连接。穿透技术示意图如下:

WebRTC的防火墙穿透技术就是基于上述思路实现,采用ICE框架保证RTCPeerConnection能实现NAT穿透。其它概念如下:
ICE(Interactive Connectivity Esablishment 互动式连接建立)是一种框架,使各种NAT穿透技术(如STUN,TURN)实现统一。
STUN:是指简单UDP穿透NAT,此技术允许位于NAT后的客户端找出自己的公风地址,绑定的因特网的端口等信息。这些信息可用于两者建立UDP通信。
TURN:是指使用中继穿透NAT,是STUN的一个扩展,主要添加了中继功能。如两者在特定情况下无法直接通信,则需用公网服务器进行数据的转发。
信令服务器:公网IP服务器,转发彼此的媒体信息和网络信息,还可以有其它功能,如房间管理、用户列表、用户进入,用户退出等。
4、连接建立
大致步骤如下:
(1)连接双方通过第三方服务器交换各自的SDP数据。
(2)连接双方通过STUN服务器获取各自的NAT结构,子网IP和公网IP、端口等信息,即Candidate
(3) 连接双方通过第三方服务器交换各自的Candidate信息。两者在同一内网直接交换,在不同内网通过STUN服务器识别公网的Candidatte进行通信。
(4)如连接双方仅通过STUN服务器无法通信,就需寻求TURN服务器提供的转发服务,然后转发形式的Candidate共享对方。
(5)连接双方向目标IP端口发送报文。
三、访问设备
1、访问设备
WebRTC可以访问设备可以分为物理设备和虚拟设备,物理设备包含摄像头、麦克风等设备,虚拟设备包含桌面、Canvas画布等设备。浏览器navigator.mediaDevices对象提供了两个主要的API访问这些设备,如下表所示:

访问设备并获取媒体数据 语法如下所示:
navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream){/*使用这个stream*/
})
.catch(function(err){/*处理error*/
})
参数constraints即为MediaStreamContraints对象,指定了请求使用媒体的类型,还有每个类型所需要的参数。
参数stream即为MediaStream对象,返回的媒体流,作为回调函数的参数。
调用成功后,可以在回调函数内把媒体流对象赋值给合适的元素,然后使用它,代码如下:
//video为html5中的video标签
video.srcObject=stream
调用失败后,catch中的回调函数会被调用,MediaStreamError 对象作为唯一参数,基于DOMException对象构建,错误码描述如下:
PermissionDeniedError: 使用媒体数据请求被用户或者系统拒绝。
NotFoundError:找不到constraints中指定的媒体类型。
2、示例(摄像头)
此示例通过打开摄像头熟悉访问设备获取数据,并且渲染至视频对象。主要有以下步骤:
(1)定义约束条件
(2)根据约束条件获取媒体
(3)成功获取视频流后,将其传递给video对象的srcObject属性。
本文示例代码都采用 React的组件 编写,访问摄像头示例代码如下所示:
import React,{ Component } from 'react'
import {Button,message} from 'antd'
import '../public/styles.css'//约束条件
const constraints=window.constraints={//禁用音频audio: false,//启用视频video: true
};/*** 摄像头使用示例*/
class Camera extends Component {//打开摄像头openCamera=async(e)=>{//根据约束条件获取媒体try {const stream=await navigator.mediaDevices.getUserMedia(constraints);console.log('handleSuccess');this.handleSuccess(stream);} catch(e){this.handleError(e);}}handleSuccess=(stream)=>{const video=this.refs['myVideo'];const videoTracks=stream.getVideoTracks();console.log('通过设置限制条件获取到流 ' + constraints);console.log(`使用视频设备 : +${videoTracks[0].label}`);//使得浏览器能访问到streamwindow.stream=stream;//将stream绑定到video标签video.srcObject=stream; }handleError=(error)=>{if(error.name==='ConstraintNotSatisfiedError'){message.error('约束条件不满足');const v=constraints.video;//宽高尺寸错误message.error(`要求视频的分辨率 ${v.width.exact}x${v.height.exact} 但是设备无法满足`);} else if(error.name==='PermissionDeniedError'){message.error('没有摄像头和麦克风使用权限,请点击允许按钮');}message.error(`getUserMedia错误: ${error.name}`, error);}render() {return (<div className='container'><h1><span>摄像头示例</span></h1><video className='video' ref='myVideo' playslnline="true" autoPlay></video><Button type='primary' onClick={this.openCamera}>打开摄像头</Button></div>)}
}export default Camera
3、其它设备
(1)麦克风
使用API: getUserMedia()
约束条件:
const constraints=window.constraints={//启用音频audio : true,//禁用视频video: false
}
页面渲染对象:<audio ref='audio' controls autoPlay></audio>
(2)屏幕
访问API: getDisplayMedia()
约束条件: {video: true}
页面渲染对象: <video ref='video' autoPlay playsInline></video>
相关文章:
WebRTC音视频开发读书笔记(一)
一、基本概念 WebRTC(Web Real-Time Communication,网页即时通信)于2011年6月1日开源,并被纳入万维网联盟的W3C推荐标准,它通过简单API为浏览器和移动应用提供实时通信RTC功能。 1、特点 跨平台:可以在Web,Android、…...
llama3.1本地部署方式
llama3.1 资源消耗情况 Llama 3.1 - 405B、70B 和 8B 的多语言与长上下文能力解析  70B版本,FP1616K token需要的资源约为75G;FP16128K token需要的资源约为110G  1、ollama ollama工具部署及使用…...
相机光学(三十四)——色差仪颜色观察者视角
1.为什么会有观察者视角 颜色观察角度主要涉及到人眼观察物体时,视角的大小以及屏幕显示颜色的方向性对颜色感知的影响。 人眼观察物体的视角:在黑暗条件下,人眼主要依靠杆体细胞来分辨物体的轮廓,而杆体细胞分布在视网…...
思二勋:web3.0是打造应对复杂市场敏捷组织的关键
本文内容摘自思二勋所著的《分布式商业生态战略》一书。 数字化时代,需要企业具备敏捷应对变化的能力,以敏捷反应应对客户和市场的迅速变化。敏捷能力的建设需要触点网络、信息系统、IT 架构、业务流程等同时实现敏捷。尤其是在多变且复杂环境中,特别要求战略管理的敏捷性和…...
一文带你快速了解——HAProxy负载均衡
一、HAProxy简介 1.1、什么是Haproxy HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。…...
【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分
✨ 人生如梦,朝露夕花,宛若泡影 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂&am…...
启发式算法之模拟退火算法
文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题(TSPÿ…...
编码器汇总:光学编码器,霍尔编码器,磁性编码器,电容式编码器,单圈编码器,多圈编码器,增量式编码器,绝对值式编码器等
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、光学编码器二、霍尔编码器三、磁性编码器四、电容式编码器五、单圈编码器六、多圈编码器七、增量式编码器八、…...
有哪些性价比高的蓝牙耳机可入?四款百万好评实力品牌推荐!
蓝牙耳机大家都再熟悉不过了,作为最常用的智能配件之一,谁还没有用过几款蓝牙耳机呢,但是选购蓝牙耳机上还是有一些需要注意的地方,市面上的吹风机可谓是五花八门。有哪些性价比高的蓝牙耳机可入?本人花了一些时间整理…...
MySQL数据库——表的CURD(Update)
3.Update 语法:update table_name set column expr 案例 将孙悟空的数学成绩变更为80 mysql> select name,math from result; ----------------- | name | math | ----------------- | 唐三藏 | 98 | | 孙悟空 | 78 | | 猪悟能 | 98 |…...
性能测试 —— linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台!
前言 在当前激烈的市场竞争中,创新和效率成为企业发展的核心要素之一。在这种背景下,如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中,性能测试是一项不可或缺的环节,它可以有效的评估一个系…...
python基础命令学习
1.Python基础知识 目录 1.Python基础知识1.1 变量及类型1.2 标识符与关键字1.3 输出与输入1.3.1格式化符号1.3.2转义字符1.3.3结束符1.3.4输入的特点 1.4 运算符1.4.1 算数运算符1.4.2 赋值运算符1.4.3 比较(即关系)运算符1.4.4 逻辑运算符 1.5 数据类型转换1.6 判断与循环语句…...
程序设计基础(试题及答案)
一、填空题 1.__ ____函数是程序启动时惟一的入口。 2.算法的复杂性包含两方面: 和 。 3.已知 char c= a ; int x=2,k; 执行语句k=c&&x++ ; 则x为 ,k为 。 4.数值0x34对应的十进制为 。 5…...
日常收录资源
日常收录资源 工具类绘图浏览器插件 软件类DockerGoJavaJavaScriptSpring Boot架构计算机网络算法其他 设计类配色素材图标图片 工具类 绘图 ProcessOnGitMind 浏览器插件 ColorPick Eyedropper:取色器 软件类 Docker Docker - 从入门到实践 Go Golang tuto…...
索引——电子学
电子学 教程 2N2222简介及用Arduino模拟 创意电子学:第000课——注册Tinkercad 网站账号 创意电子学-第01课:点亮LED 创意电子-第05课:串联和并联 创意电子学-第04课:使用欧姆定律 创意电子学-第03课:初学者如何…...
【学习笔记】A2X通信的协议(九)- 广播远程ID(BRID)
3GPP TS 24.577 V18.1.0的技术规范,主要定义了5G系统中A2X通信的协议方面,特别是在PC5接口和Uu接口上的A2X服务。以下是文件的核心内容分析: 7. 广播远程ID(BRID) 7.1 概述 本条款描述了以下程序: 在用…...
HoloLens 和 Unity 空间坐标系统
所有的 3D 图形应用程序都使用笛卡尔坐标系统来推理虚拟物体的位置和朝向。 这些坐标系建立三个垂直轴:X、Y 和 Z。 添加到场景的每个对象在其坐标系中都有一个 XYZ 位置。 Windows 调用在物理世界中具有实际意义的坐标系统,该系统以米为单位表示其坐…...
【npm】如何将开发的vite插件发布到npm
前言 简单说下 npm 是什么: npm 是一个 node 模块管理工具,也是全球最大的共享源。 npm 工具与 nodejs 配套发布,便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI(控制台命令行工具)、和 registry(…...
数据结构-查找
一、基本术语 二、线性结构 ASL:平均查找长度 1、顺序查找 1.1、代码实现 typedef struct {int* elem;int TableLen; }SSTable;int Search_Seq(SSTable ST, int key) {ST.elem[0] key; //哨兵,使得循环不用判断数组是否会越界int i;for (i ST…...
Ubuntu环境下 pip安装应用时报错
pip安装应用时,报SSL错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 可能原因是python没有ssl,则在python安装时应该添加ssl ./configure --with-openssl/usr/local/ssl …...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
