webrtc 笔记

news2024/12/22 20:03:18

webrtc主要步骤

  1. navigator.mediaDevices.getUserMedia({audio:true,redio:true})

    获取用户的摄像头状态,返回媒体流,把媒体流赋给video的srcObject属性,就能在页面上展示自己的音视频

  2. let peer = new RTCPeerConnection(servers)

    创建peer实例,通过这个实例的一系列方法实现p2p连接.其中传递的参数servers为TURN和STUN服务,用于NAT穿越

    1. peer.addIceCandidate(candidate)

      交换身份.用于把建立连接的对方的网络信息添加到自己的本地中.

      对方的网络信息:在普通的网络环境中,ip地址就可以用来标记它,但是现在一般会把对方的网络信息隐藏在NAT网络中,这种情况下就需要使用STUN协议穿透NAT.1但是在有的情况下,有的网络设备屏蔽了STUN的识别能力,这时就需要使用TURN协议实现媒体中转服务2.

      上述方案已经被webrtc内置了,即ICE框架,在创建peer实例的时候要告诉程序STUN,TURN服务器的相关信息

    2. signaling服务器(信令服务器)

      用于传输各自的身份信息以及描述信息,一般使用websocket实现

      peer.onicecandidate = function(e) {
        socket.emit('icecandidate', e.candidate) // socket是假设的一个websocket实例
      }//onicecandidate事件会在创建offer或者answer的时候被调用
      
      socket.on('icecandidate', function(e) {
        let data = e.message
        peer.addIceCandidate(data)
      })
      
      //socket发布icecandidate事件并且监听这个,当传输身份信息时,把对方的candidate添加的本地peer
      
    3. 交换描述信息3

      当一个peer打算把自己的设备媒体流发送给另外一个peer使用的时候,就要把设备信息(比如视频编码等)告诉对方,这就要实现peer之间交换描述信息,webrtc通过发送offer和answer实现这个功能.

      let desc = await peer.createOffer()
      await peer.setLocalDescription(desc)
      socket.emit('offer', desc)  //本地Peer发送offer事件并且触发offer事件,把本地描述添加到peer中
      
      socket.on('offer', async function(e) {
        let data = e.message
        await peer.setRemoteDescription(data)
        
        let desc = await peer.createAnswer()
        peer.setLocalDescription(desc)
        socket.emit('answer', desc) //当本地触发offer事件后,发布answer事件,当对方peer触发answer事件时,
        //把对方的描述也添加到本地Peer中,不过上面触发offer事件调用的是setLocalDescription,触发answer事件调用的添加事件是setRemoteDescription
      })
      
      socket.on('answer', async function(e) {
        let data = e.message
        await peer.setRemoteDescription(data)
      })
      //上述代码涉及的description就是常说的SDP
      
    4. 发送媒体流

      localStreamRef.current!.getTracks().forEach((track) => {
        peer.addTrack(track, localStreamRef.current as MediaStream);
      });
      
      peer.ontrack = (track: RTCTrackEvent) => {
        remoteVideoRef.current!.srcObject = track.streams[0];
      };
      
  3. let channel = peer.createDateChannel('a channel')

    当两端建立好连接之后,可以开通通道用于传送文件或者其他数据,

NAT

  1. 全称:Network Address Translation,网络地址转换。

  2. 理解:处于一个局域网下面的ipv4地址设备想要访问某一地址,会先向局域网网关发送请求,网关会给它分配一个端口地址,同时网关自己也有一个端口地址,向上请求到目的地址后,目的地址对局域网网关端口响应并发送内容,局域网网关根据ipv4设备的端口发送内容。在这个过程中,相当于网关ip代理了客户端设备的ip。

  3. NAT类型:

网络穿透

  1. 网络穿透技术一定是基于NAT实现的。
  2. 处于两个局域网下的两台设备A,B在进行通信时,一般流程是:设备A向所处局域网网关A传递信息,网关A向某服务器传递信息,服务器将信息转发给局域网网关B,网关B将信息传递给设备B,这个过程经过了服务器,而网络穿透可以让两台设备在不经过服务器的情况下直接进行通信。
  3. 使用网络穿透可以实现客户端与客户端的直接通信,即实现了Peer to Peer(P2P网络,去中心化网络),关键在于两个客户端通信不再经过服务器转发数据信息了。
  4. 理解:服务器给两个网关提供了对方的ip和端口号,使两个网关之间可以传递数据信息,所以处于网关下面的设备才可以通过NAT直接通信。
  5. STUN、TURN即网络穿透技术。

参考: https://www.bilibili.com/video/BV1LY411K7Rk/?spm_id_from=333.337.search-card.all.click&vd_source=9413b5340ff3ae5833c8f4a4fc0ca795


  1. STUN协议的作用: 在NAT网络中,找到另一端在网络中可以被正常访问到的网络路径 ↩︎

  2. 媒体中转服务: 把视频发送到服务器上面,另外一个Peer把它下载下来 ↩︎

  3. 描述信息: 可以理解成一个设备的相关信息 ↩︎

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

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

相关文章

vue3 :一个实用的 vite + vue3 组件库脚手架工具

目录 1 组件库脚手架内容 2 组件库脚手架技术栈 3 使用说明 3.1 克隆代码到本地 3.2 安装依赖 3.3 本地开发 3.4 创建新组件 3.5 构建文档 3.6 构建 example 3.7 发布组件库 4 组件库命令说明 无论是 vue2 全家桶还是 vue3 vite TypeScript,组件库的使…

无需购买服务器,用cpolar发布本地web网站

随着互联网的快速发展,网络也成为我们生活中不可缺少的必要条件,为了能在互联网世界中有自己的一片天地,建立一个属于自己的网页就成为很多人的选择。但互联网行业作为资本密集的行业,委托别人建立一个像样的网站要花费不少&#…

一文搞定基因型数据清洗

文章目录数据1 二进制文件2. plink二进制文件变为文本文件(ped和map)3. plink将vcf转化为plink文件4. 提取样本和SNP4.1 提取样本4.2 提取SNP5. plink和表型数据合并6. 数据汇总6.1 次等位基因频率(maf)6.2 缺失6.3 哈温检测6.4 杂…

JDBC-01:如何获取数据库连接

文章目录初步了解jdbcJDBC程序编写步骤Driver接口介绍导入驱动(idea)加载与注册JDBC驱动要素一:URL要素二:用户名和密码获取数据库连接获取数据库连接的方式一获取数据库连接的方式二获取数据库连接的方式三获取数据库连接的方式四…

FreeRTOS移植STM32 printf()函数重定向到USART3

我们在移植FreeRTOS过程中如果没有printf()函数打印调试信息到串口精灵,则程序开发就会非常不方便。本文实现STM32工程上的printf()函数,方便用于程序开发中调试信息打印到电脑上的串口调试精灵。 最简单的方法就是使用MicroLIB库。 一、KEIL-MDK中勾选U…

字体管理工具 - RightFont使用教程

RightFont RightFont是 Mac OS X 上一款非常轻巧的字体管理工具,目前已经完成了与 PhotoShop、Sketch 两大设计应用的集成。RightFont 是 Mac系统上一款优秀的字体管理工具,专为设计师设计,轻量化和简洁,可以方便快速的管理你的字…

《C陷阱与缺陷》读书笔记1

词法分析:贪心法 主要就是解释词法分析时的原则,即: 编译器将程序分解为符号时,从左到右一个字符接一个字符的读入。如果编译器的输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之…

Linux文件锁的使用

文件是一种共享资源,多个进程对同一文件进行操作的时候,必然涉及到竞争状态,因此引入了文件锁实现对共享资源的访问进行保护的机制,通过对文件上锁, 来避免访问共享资源产生竞争 状态。 一、文件锁的分类 1.建议性锁 建议性锁本质上是一种协…

Java并发编程——Threadlocal源码解析

Threadlocal源码解析一、基本结构二、ThreadLocal操作set操作get操作remove操作三、内存泄露?四、ThreadLocalMap核心变量数组下标计算方式阈值计算扩容下标冲突(hash冲突)从名称上来看可以理解为线程本地变量,也可以认为是线程局…

(JAVA)认识Java中的数据类型和变量

文章目录前言1.字面常量2. 数据类型3.变量3.1 变量概念3.2 语法格式3.3 整形变量3.4 浮点型变量3.5 字符型变量3.6布尔类型变量3.7 类型转换3.7.1 隐式转换(自动类型转换)3.7.2 显示转换 (强制类型转换)3.8 类型提升4. 字符串类型…

驱动开发:内核层InlineHook挂钩函数

在上一章《驱动开发:内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致,都是使用劫持执行流并跳…

三类基于贪心思想的区间覆盖问题【配套资源详解】

博主主页:Yu仙笙 配套资源:三类基于贪心算法覆盖问题-C文档类资源-CSDN下载 目录 三类基于贪心思想的区间覆盖问题 情形1:区间完全覆盖问题 描述: 样例: 解题过程: 例题: 题意: 例题&#xff1a…

深入理解Kafka服务端之索引文件及mmap内存映射

深入理解Kafka服务端之索引文件及mmap内存映射 - 墨天轮 一、场景分析 Kafka在滚动生成新日志段的时候,除了生成日志文件(.log),会同时生成一个偏移量索引文件(.index)、一个时间戳索引文件(.timeindex)和一个已中止事务索引文件(.txnindex)。 由于索引写…

JVM面试高频问题

一、进程与线程 在谈JVM的这些问题前,我们先来复习一下有关线程和进程的关系 进程可以看作是程序的执行过程。一个程序的运行需要CPU时间、内存空间、文件以及I/O等资源。操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位。线…

C语言函数章--该如何学习函数?阿斗看了都说会学习了

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

【Python入门指北】 发邮件与正则表达式

文章目录邮件发送一、群发邮件二、指定用户发邮件正则表达式一、预备知识正则1. 正则介绍2. 陷阱3. 特殊的字符二、 re 模块的方法1 常用方法2. 正则分组总结邮件发送 #第三方模块 yagmail #pip3 install yagmailimport yagmail""" 项目需求 yag yagmail.SMTP(u…

MyBatis Plus实现动态字段排序

利用周末时间,对已有的项目进行了升级,原来使用的是tkmybatis,改为mybatis plus。但是由于修改了返回数据的格式,前端页面字段排序失效了,需要刷新表格才会排序。页面效果如下 easyui的数据表格datagrid支持多字段排序…

【仿牛客网笔记】Spring Boot实践,开发社区登录模块-账号设置,检查登录

首先访问账号设置的页面。 新建一个Controller,用过RequestMapping生成访问路径 上传头像 首先打开配置文件,配置一下将文件配置到哪里。 直接在Controller存了, 更新的时候掉Map,参数为id和路径。 注入日志对象后,通过Val…

SpringBoot项目启动执行任务的几种方式

经过整理后得到以下几种常用方式,供大家参考。 1. 使用过滤器 init() :该方法在tomcat容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。可以在这个方法中补充想要执行的内容。 Component public class MyFilter …

CTF竞赛网络安全大赛(网鼎杯 )Web|sql注入java反序列化

CTF竞赛网络安全大赛题目考点 sql注入 java反序列化 网鼎杯解题思路 题目一打开是这样的界面 下载题目的附件,并用jd-gui.exe打开 核心代码如下 Test代码 `` package 部分class;import cn.abc.common.bean.ResponseCode; import cn.abc.common.bean.ResponseResult; impor…