WebRTC音视频开发读书笔记(一)

news2024/12/22 20:54:58

一、基本概念

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>

   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity扩展 Text 彩虹文本

本文章用于原生组件 Text 的扩展 TextRainbow&#xff0c;对于新版TextMeshPro不适用。 一、效果预览图&#xff1a; 默认&#xff1a; 随机&#xff1a; 循环&#xff1a; 二、原理 通过强制刷新顶点数据&#xff0c;来修改颜色。 通过Unity中自带的 BaseMeshEffect 抽…

五、OpenCVSharp 中的图像滤波与平滑

文章目录 简介一、均值滤波1. 原理和数学公式2. 不同大小的滤波核效果对比3. 边界处理方式二、高斯滤波1. 高斯核的生成2. 标准差对滤波效果的影响3. 高斯滤波的应用场景(如去除高斯噪声)三、中值滤波1. 中值的计算方法2. 中值滤波对椒盐噪声的处理效果3. 中值滤波的性能分析…

AWS Lambda 十年回顾:功能总览、更新记录与入门指南

这次&#xff0c;我为2014年11月发布的AWS Lambda创建了一个历史时间表。AWS Lambda 是一项无服务器、全托管的代码执行服务&#xff0c;今年2024年11月将迎来其宣布发布的十周年纪念。虽然提前了一些&#xff0c;但为了提前庆祝这一重要时刻&#xff0c;我写了这篇文章。 文章…

空间间隔组(Spacers)-Qt-思维导图-学习笔记

空间间隔组&#xff08;Spacers&#xff09; 空间间隔组&#xff08;Spacers&#xff09; &#xff08;1&#xff09;Horizontal Spacer:水平间隔 &#xff08;2&#xff09;Vertical Spacer:垂直间隔 QSpacerItem 控件简介 继承关系&#xff1a;QSpacerItem 继承自 QLayou…

面试必备之——TCP/UDP(二)

TCP流量控制 让发送方发送的速率不要太快&#xff0c;要让接收方开的及接收&#xff0c;防止发送方发送太快&#xff0c;导致接收方来不及接收。是端到端之间的控制 滑动窗口是实现流量控制的方法之一 TCP流量控制-滑动窗口 滑动窗口是传输层进行流控的一种措施&#xff0c;…

电脑版视频剪辑软件哪个好?适合新手使用的剪辑软件!

电脑版视频剪辑软件哪个好&#xff1f;在电脑版视频剪辑软件的选择上&#xff0c;每位用户都有其独特的偏好和需求。对于初学者而言&#xff0c;寻找一款操作简便、功能齐全的软件至关重要。为大家推荐几款常用的视频剪辑软件&#xff1a; 1、福昕视频剪辑 2、HitFilm 3、DaVin…

天了噜,IDEA竟然还有这种坑!

问题描述 IDEA 编辑器 idea Cannot resolve symbol 鼠标聚焦时&#xff0c;错误信息为&#xff1a;” idea Cannot resolve symbol “ IDEA自动修复功能 提示信息如下&#xff0c;然而并没有什么卵用。 问题梳理&#xff1a; IDEA 这个目录下的包都引入不了 import org.s…

Redis的分布式部署方案-哨兵

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是 Redis 从 2.8 开…

uniapp加载第三方字体方案对比(附原生微信小程序方案)

文章目录 官方文档uniapp文档微信小程序文档 下载字体包引入方案限制微信小程序限制uniapp的限制 方案对比方案1&#xff1a;CSS本地加载方案2&#xff1a;CSS远程加载方案3&#xff1a;转换为base64&#xff0c;然后通过css引入方案4&#xff1a;使用uni.loadFontFace() 页面使…

手撕初阶数据结构之---排序

1.排序概念及运用 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下&#xff0c;就是大的在前面&#xff…

30kw 可调恒流电子负载,你了解多少?

30kW可调恒流电子负载&#xff0c;是一种用于测试电源、蓄电池、发电机等电力设备的设备。它的主要功能是模拟实际负载&#xff0c;通过调节电流的大小&#xff0c;来检测电力设备的工作性能和稳定性。 让我们了解一下什么是电子负载。电子负载是一种可以吸收或提供电能的设备&…

【数据分析---偏企业】 Excel操作

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Excel操作前 必看 Python 初阶 Python—语言基础与…

[MRCTF2020]套娃 php字符串解析绕过,jsfuck编码

进来看到代码 <!-- //1st $query $_SERVER[QUERY_STRING];if( substr_count($query, _) ! 0 || substr_count($query, %5f) ! 0 ){die(Y0u are So cutE!); }if($_GET[b_u_p_t] ! 23333 && preg_match(/^23333$/, $_GET[b_u_p_t])){echo "you are going to th…

超维室外轮式巡检机器人打造无人值守变电站

变电站是电力系统的重要组成部分&#xff0c;负责电能的转换、分配和传输&#xff0c;确保电力供应的稳定性和安全性。然而&#xff0c;由于变电站内设备众多、环境复杂、风险较高&#xff0c;传统的人工巡检方式面临着效率低下、成本高昂和人员安全隐患等问题。为应对这些挑战…

苹果iOS 18 Beta 6更新亮点一览:这些新功能让你爱不释手

苹果公司作为全球科技行业的领军者&#xff0c;每一次的系统更新都备受业界和消费者的关注。 iOS系统作为苹果设备的核心&#xff0c;其每一次迭代都带来了新功能和优化&#xff0c;极大地提升了用户体验。2024年8月13日&#xff0c;苹果向iPhone用户推送了iOS 18 Beta 6更新&…

水印去除方法

有一批建筑图去水印&#xff0c;水印的位置基本位于左右下角或者图片中间&#xff0c;因此调研一些去水印的方法&#xff0c;以前做电商图场景的水印去除或者印章去除的话&#xff0c;通常会训练一个unet来做这个事情。 1.工具 3 秒去水印&#xff01;6 款超好用的免费图像去…

Endnote与word关联 解决方案: COM加载项-----》CWYW插件安装

1、首先说一下本次情况&#xff0c;office的版本是2019&#xff0c;后安装的Endnote 9。旧版word也可按此方法尝试。 2、先找到关键的EndNote Cwyw.dll文件。应在此目录下&#xff1a;C:\Program Files (x86)\EndNote X7\Product-Support\CWYW。 3、如没有EndNote Cwyw.dll文…

DETR论文,基于transformer的目标检测网络 DETR:End-to-End Object Detection with Transformers

transformer的基本结构: encoder-decoder的基本流程为&#xff1a; 1&#xff09;对于输入&#xff0c;首先进行embedding操作&#xff0c;即将输入映射为向量的形式&#xff0c;包含两部分操作&#xff0c;第一部分是input embedding&#xff1a;例如&#xff0c;在NLP领域&…

DevEco Studio 5.0 Beta版下载链接

最新工具 - 下载中心 - 华为开发者联盟 (huawei.com)https://developer.huawei.com/consumer/cn/download/