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}`);
        //使得浏览器能访问到stream
        window.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>

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下pip install mysqlclient安装失败

有时候安装mysqlclient插件报如下错误 提示先安装mysqlclient的依赖wheel文件 下载链接(必须对应版本&#xff0c;python3.6版本对1.4.4版本) 如下选择历史版本 mysqlclient官网 https://pypi.org/project/mysqlclient/python3.6对应版本 https://pypi.org/project/mysqlcl…

Unity3D 自定义窗口

Unity3D 自定义窗口的实现。 自定义窗口 Unity3D 可以通过编写代码&#xff0c;扩展编辑器的菜单栏和窗口。 简单的功能可以直接一个菜单按钮实现&#xff0c;复杂的功能就需要绘制一个窗口展示更多的信息。 编辑器扩展的脚本&#xff0c;需要放在 Editor 文件夹中。 菜单栏…

AI预测福彩3D采取888=3策略+和值012路或胆码测试8月19日新模型预测第61弹

经过60期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;60期一共只错了6次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大部…

Ubuntu 22.04 安装 MySQL 8

Ubuntu 22.04 安装 MySQL 8 本文描述了Ubuntu安装MySQL 8的方法 CentOS7 的安装方法点击此处跳转 Windows 的安装方法点击此处跳转 Docker 的安装方法点击此处跳转 正文开始&#xff1a; 在一切开始之前&#xff0c;建议先切换到root #输入下方名&#xff0c;然后输入当…

openGauss 6.0安装过程解除对root用户依赖之gs_preinstall

目录 1.执行前提条件 1.1设置OS参数&#xff1a; 1.2定时任务权限 1.3 修改最大文件描述符 2.切换至omm用户&#xff0c;执行preinstall 3.source环境变量 4.执行gs_install 在给客户部署业务系统时&#xff0c;由于openGauss数据库的预安装过程需要用到root用户执行&am…

uniapp left right 的左右模态框

标题 这是组件 <template><div class"content-wrapper"><divv-for"(vla, i) in products":key"i":class"[content-page, getPageClass(i)]"><slot :data"vla"><!-- 用户自定义的内容 --><…

微信小程序中实现自动滚动

使用scroll-view组件的scroll-into-view属性&#xff1a; <scroll-view class"container" scroll-y"{{true}}" scroll-into-view"recordBottomScroll"><view class"text_style" style"color: #252526;">{{te…

LAMM: Label Alignment for Multi-Modal Prompt Learning

系列论文研读目录 文章目录 系列论文研读目录文章题目含义AbstractIntroductionRelated WorkVision Language ModelsPrompt Learning MethodologyPreliminaries of CLIPLabel AlignmentHierarchical Loss 分层损失Parameter Space 参数空间Feature Space 特征空间Logits Space …

JavaScript语法基础之常量与变量

目录 语法基础 1.语法简介 2 常量与变量 2.1 变量 2.1.1 变量的命名 2.1.2. 变量的使用 2.2. 常量 语法基础 注&#xff1a;由于大部分编程语言语法都差不多&#xff0c;这里讲完 PHP 部分不再讲述。 调试语句&#xff1a;prompt、alert、document.write(a)、console.l…

OSL 冠名赞助Web3峰会 “FORESIGHT2024”圆满收官

OSL 望为香港数字资产市场发展建设添砖加瓦 &#xff08;香港&#xff0c;2024 年 8 月 13 日&#xff09;- 8 月 11 日至 12 日&#xff0c; 由 香港唯一专注数字资产的上市公司 OSL 集团&#xff08;863.HK&#xff09;冠名赞助&#xff0c;Foresight News、 Foresight Ventu…

【高阶数据结构】图

图 1. 图的基本概念2. 图的存储结构2.1 邻接矩阵2.2 邻接表2.3 邻接矩阵的实现2.4 邻接表的实现 3. 图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历 4. 最小生成树4.1 Kruskal算法4.2 Prim算法 5. 最短路径5.1 单源最短路径--Dijkstra算法5.2 单源最短路径--Bellman-Ford算…

【投融界-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

leetcode198打家劫舍

题目描述 LeetCode 第 198 题——打家劫舍&#xff08;House Robber&#xff09; 你是一个职业小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;这个地方所有的房屋都围成一圈&#xff0c;并且相邻的房屋有安全系统会相连&#xff0c;如果两间相邻的…

【MySQL进阶之路】数据库的操作

目录 创建数据库 字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定字符集和校验规则 在配置文件中配置 查看数据库 显示创建语句 修改数据库 删除数据库 数据库的备份和恢复 备份整个数据库 备份特定表 备份多个数据库 备份所有数据…

linux,docker查看资源消耗总结

在linux和docker中我们将一个程序运行到后台&#xff0c;之后我们想查看它的运行状态&#xff0c;对于服务器的资源消耗等等 1.linux查看进程 ps aux | grep python ps aux&#xff1a;列出所有正在运行的进程。grep python&#xff1a;过滤出包含 python 的进程 2.linux查…

Mapreduce_Distinct数据去重

MapReduce中数据去重 输入如下的数据&#xff0c;统计其中的地址信息&#xff0c;并对输出的地址信息进行去重 实现方法&#xff1a;Map阶段输出的信息K2为想要去重的内容&#xff0c;利用Reduce阶段的聚合特点&#xff0c;对K2进行聚合&#xff0c;去重。在两阶段中&#xff…

Java之线程篇一

目录 如何理解进程&#xff1f; 进程和线程的区别 线程的优点 线程的缺点 线程异常 线程用途 创建线程 方法一&#xff1a;继承Thread类&#xff0c;重写run() 观察线程 小结 方法二&#xff1a; 实现Runnable接口&#xff0c;重写run() 方法三&#xff1a;继承Threa…

【深度学习】【语音TTS】GPT-SoVITS v2 实战,训练一个人的音色,Docker镜像

文章目录 原理Dockerdocker push训练教程: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/xyyqrfwiu3e2bgyk 原理 Docker 不用docker不行,不好分配显卡, 做个docker镜像: docker pull pytorch/pytorch:2.1.2

C++练习备忘录

1. 保留两位小数输出格式 #include <iostream> #include <iomanip> using namespace std; int main() {double S 0;S (15 25) * 20 / 2;cout << fixed << setprecision(2) << S;return 0; }2. 设置输出宽度 #include <iostream> #inclu…

[论文笔记]ZeRO: Memory Optimizations Toward Training Trillion Parameter Models

引言 今天带来ZeRO: Memory Optimizations Toward Training Trillion Parameter Models的论文笔记。 大型深度模型提供了显著的准确性提升&#xff0c;但训练数十亿到数万亿个参数是具有挑战性的。现有的解决方案&#xff0c;如数据并行和模型并行&#xff0c;存在基本的局限…