WebRTC API分析
主题
本文详细描述常用的webrtc api
媒体协商类
myPeerConnection.createOffer([options]);
var options = {
offerToReceiveAudio: true, // 告诉另一端,你是否想接收音频,默认true
offerToReceiveVideo: true, // 告诉另一端,你是否想接收视频,默认true
iceRestart: false, // 是否在活跃状态重启ICE网络协商
};
iceRestart:只有在处于活跃的时候,iceRestart=false才有作用。
RTCPeerConnection .createAnswer([ options ]);
options :
voiceActivityDetection (布尔型,默认 true): 是否启用语音活动检测。
offerToReceiveAudio (整型,默认 1): 希望接收的音频流数量。
offerToReceiveVideo (整型,默认 1): 希望接收的视频流数量。
RTCPeerConnection .setLocalDescription 设置本地sdp描述
RTCPeerConnection .setRemoteDescription设置对端sdp描述
RTCPeerConnection.addTrack(track, ...streams) 用于将一个或多个媒体轨道添加到
RTCPeerConnectiontrack: 要添加的 MediaStreamTrack 对象。
...streams: 可选的 MediaStream 对象列表,表示该轨道属于哪些流。
例子:
//添加本地轨道
localStream.getTracks().forEach((track) => pc.addTrack(track, localStream));
网络协商类
RTCPeerConnection.addIceCandidate(candidate) 添加一个 ICE 候选人
candidate

注意Android和Web端的不同。
RTCPeerConnection补充
pc = new RTCPeerConnection([ configuration ]);
configuration可选
bundlePolicy 一般用maxbundle
banlanced:音频与视频轨使用各自的传输通道
maxcompat:每个轨使用自己的传输通道
maxbundle:都绑定到同一个传输通道
iceTransportPolicy 一般用all
指定ICE的传输策略
relay:只使用中继候选者
all:可以使用任何类型的候选者
iceServers
其由RTCIceServer组成,每个RTCIceServer都是一个ICE代理的服务器
rtcpMuxPolicy 一般用require
rtcp的复用策略,该选项在收集ICE候选者时使用

使用例子:
var defaultConfiguration = {bundlePolicy: "max-bundle",rtcpMuxPolicy: "require",iceTransportPolicy: "all",//relay 或者 all// 修改ice数组测试效果,需要进行封装iceServers: [{"urls": ["turn:192.168.1.25:3478?transport=udp","turn:192.168.1.25:3478?transport=tcp" // 可以插入多个进行备选],"username": "jbj","credential": "123456"},{"urls": ["stun:192.168.1.25:3478"]}]};pc = new RTCPeerConnection(defaultConfiguration);
重要事件回调
onicecandidate 事件:
-
当
RTCPeerConnection对象收集到一个新的 ICE 候选人时,会触发这个事件。 -
事件回调函数会收到一个
RTCPeerConnectionIceEvent对象,其中包含新收集到的RTCIceCandidate对象。 -
你可以在这个事件处理函数中,将收集到的 ICE 候选人发送给对方对等端。
ontrack 事件:
-
当
RTCPeerConnection对象接收到来自远端的媒体流时,会触发这个事件。 -
事件回调函数会收到一个
RTCTrackEvent对象,其中包含新收到的MediaStreamTrack对象以及相关的MediaStream对象。 -
你可以在这个事件处理函数中,将接收到的媒体流添加到页面上进行渲染。
onconnectionstatechange 事件:
-
当
RTCPeerConnection对象的连接状态发生变化时,会触发这个事件。 -
连接状态可以是
new、connecting、connected、disconnected、failed或closed。 -
你可以在这个事件处理函数中,根据连接状态的变化采取相应的措施,如更新 UI、重试连接等。
oniceconnectionstatechange 事件:
-
当
RTCPeerConnection对象的 ICE 连接状态发生变化时,会触发这个事件。 -
ICE 连接状态可以是
new、checking、connected、completed、disconnected、failed或closed。 -
你可以在这个事件处理函数中,根据 ICE 连接状态的变化采取相应的措施,如诊断网络问题、重试连接等。
学习资料分享
0voice · GitHub
相关文章:
WebRTC API分析
主题 本文详细描述常用的webrtc api 媒体协商类 myPeerConnection.createOffer([options]); var options { offerToReceiveAudio: true, // 告诉另一端,你是否想接收音频,默认true offerToReceiveVideo: true, // 告诉另一端&a…...
ArkTS学习笔记:ArkTS起步
ArkTS是HarmonyOS的主力应用开发语言,基于TypeScript扩展,强化了静态检查和分析,旨在提升程序稳定性和性能。它采用静态类型,禁止运行时改变对象布局,并对UI开发框架能力进行扩展,支持声明式UI描述和自定义…...
spring-gateway网关聚合swagger实现多个服务接口切换
前提条件 微服务已经集成了swagger,并且注册进了nacos。 gateway配置 package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springfra…...
关于 Oracle Database Express Edition 的功能和安装
Oracle Database Express Edition,简称 Oracle Database XE。是一个免费的版本,主要用于培训和一些功能要求比较简单,又需要免费分发的场景。 看看官方的说明: Whether you are a developer, a DBA, a data scientist, an educat…...
领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐
无线麦克风凭借其无与伦比的便携性与灵活性,成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚,使得声音的传播更加自由自在。其操作十分简便,只需简单配对就能投入使用,从而可以轻松地适应各类场景…...
什么是 Go 语言?
Go 语言(也称为 Golang)是由 Google 开发的一种开源编程语言。它最初由 Rob Pike、Ken Thompson 和 Robert Griesemer 等人于 2007 年设计,经过两年的研发,于 2009 年首次公开发布。Go 语言的设计目标是提高编程效率,特…...
AI 大模型重塑软件开发流程:定义、应用、优势与挑战
随着人工智能技术的飞速发展,AI 大模型正在深刻影响软件开发的各个环节。从代码自动生成到智能测试,AI 大模型不仅提高了开发效率,还带来了全新的开发模式和流程变化。本文将从 AI 大模型的定义、应用场景、优势以及挑战等方面,探…...
微服务即时通讯系统的实现(客户端)----(1)
目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…...
【freertos】FreeRTOS时间管理
FreeRTOS时间管理 一、睡眠延时函数1、vTaskDelay2、vTaskDelayUntil3、相对延时与绝对延时对比 二、自定义延时函数1、微秒延时2、毫秒延时 一、睡眠延时函数 1、vTaskDelay \quad 在UCOSIII 中延时函数OSTimeDly()可以设置为三种模式:相对模式、周期模式和绝对模式。在FreeR…...
台式电脑没有声音怎么办?台式电脑没有声音解决详解
台式电脑一般来说都是没有内置扬声器的,需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题,我们也需要确认这些设备硬件有没问题,知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…...
机器学习基础02
目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典列表(json)特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transfo…...
element plus的表格内容自动滚动
<el-table:data"tableData"ref"tableRef"borderstyle"width: 100%"height"150"><el-table-column prop"date" label"名称" width"250" /><el-table-column prop"name" label&…...
哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业
在《哈佛商业评论》的HBR IdeaCast节目中,百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能(AI)和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务,以及这些技术如何重塑我们的生活和工作方式。让我们…...
Pytorch如何将嵌套的dict类型数据加载到GPU
在PyTorch中,您可以使用.to(device)方法将嵌套的字典中的所有支持的Tensor对象转移到GPU。以下是一个简单的例子 import torch# 假设您已经有了一个名为device的GPU设备对象 device torch.device("cuda:0" if torch.cuda.is_available() else "cp…...
Shell基础2
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
7z 解压器手机版与解压专家:安卓解压工具对决
7z 解压器手机版和解压专家都是在安卓设备上广受欢迎的解压软件。7z 解压器手机版由深圳乡里云网络科技有限公司开发,大小为 32.8M,支持多种常见的压缩文件格式,如.zip、.rar、.7z 等。 它对安卓操作系统的特性和用户习惯进行了优化…...
C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1
各位小伙伴们,上一期的保留小数位数教学够用一辈子,有不错的点赞量,可我连一个粉丝铁粉都没有,你愿意做我的第一个铁粉吗?OK废话不多说,开始! 温故与知心 可能你也学过,且是工作者…...
【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…...
SpringBoot 2.2.10 无法执行Test单元测试
很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…...
聊天服务器(8)用户登录业务
目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
