当前位置: 首页 > news >正文

【MediaSoup---源码篇】(三)Transport

概述

RTC::Transport是mediasoup中的一个重要概念,它用于在mediasoup与客户端之间传输实时音视频数据。

Transport继承着众多的类,主要用于Transport的整体感知

	class Transport : public RTC::Producer::Listener,public RTC::Consumer::Listener,public RTC::DataProducer::Listener,public RTC::DataConsumer::Listener,public RTC::SctpAssociation::Listener,public RTC::TransportCongestionControlClient::Listener,public RTC::TransportCongestionControlServer::Listener,public Channel::ChannelSocket::RequestHandler,public PayloadChannel::PayloadChannelSocket::RequestHandler,public PayloadChannel::PayloadChannelSocket::NotificationHandler,
分析Transport的创建流程

在Router层会根据类型来进入分支创建transport,以PlainTransport为例

			case Channel::ChannelRequest::MethodId::ROUTER_CREATE_PLAIN_TRANSPORT:{std::string transportId;//从上层获取到transport的ID// This may throwSetNewTransportIdFromData(request->data, transportId);auto* plainTransport =new RTC::PlainTransport(this->shared, transportId, this, request->data);// Insert into the map.绑定ID与transport的映射this->mapTransports[transportId] = plainTransport;MS_DEBUG_DEV("PlainTransport created [transportId:%s]", transportId.c_str());json data = json::object();plainTransport->FillJson(data);request->Accept(data);break;}

在构造函数中,创建了socket,并且绑定了通道消息回调

	PlainTransport::PlainTransport(RTC::Shared* shared, const std::string& id, RTC::Transport::Listener* listener, json& data): RTC::Transport::Transport(shared, id, listener, data){MS_TRACE();auto jsonListenIpIt = data.find("listenIp");if (jsonListenIpIt == data.end())MS_THROW_TYPE_ERROR("missing listenIp");else if (!jsonListenIpIt->is_object())MS_THROW_TYPE_ERROR("wrong listenIp (not an object)");auto jsonIpIt = jsonListenIpIt->find("ip");if (jsonIpIt == jsonListenIpIt->end())MS_THROW_TYPE_ERROR("missing listenIp.ip");else if (!jsonIpIt->is_string())MS_THROW_TYPE_ERROR("wrong listenIp.ip (not an string)");//获得内网IPthis->listenIp.ip.assign(jsonIpIt->get<std::string>());// This may throw.Utils::IP::NormalizeIp(this->listenIp.ip);auto jsonAnnouncedIpIt = jsonListenIpIt->find("announcedIp");if (jsonAnnouncedIpIt != jsonListenIpIt->end()){if (!jsonAnnouncedIpIt->is_string())MS_THROW_TYPE_ERROR("wrong listenIp.announcedIp (not an string");//获得外网IPthis->listenIp.announcedIp.assign(jsonAnnouncedIpIt->get<std::string>());}//获取端口uint16_t port{ 0 };auto jsonPortIt = data.find("port");//判断端口是否合法if (jsonPortIt != data.end()){if (!(jsonPortIt->is_number() && Utils::Json::IsPositiveInteger(*jsonPortIt)))MS_THROW_TYPE_ERROR("wrong port (not a positive number)");port = jsonPortIt->get<uint16_t>();}auto jsonRtcpMuxIt = data.find("rtcpMux");if (jsonRtcpMuxIt != data.end()){if (!jsonRtcpMuxIt->is_boolean())MS_THROW_TYPE_ERROR("wrong rtcpMux (not a boolean)");this->rtcpMux = jsonRtcpMuxIt->get<bool>();}auto jsonComediaIt = data.find("comedia");if (jsonComediaIt != data.end()){if (!jsonComediaIt->is_boolean())MS_THROW_TYPE_ERROR("wrong comedia (not a boolean)");this->comedia = jsonComediaIt->get<bool>();}auto jsonEnableSrtpIt = data.find("enableSrtp");// clang-format offif (jsonEnableSrtpIt != data.end() &&jsonEnableSrtpIt->is_boolean() &&jsonEnableSrtpIt->get<bool>())// clang-format on{auto jsonSrtpCryptoSuiteIt = data.find("srtpCryptoSuite");if (jsonSrtpCryptoSuiteIt == data.end() || !jsonSrtpCryptoSuiteIt->is_string())MS_THROW_TYPE_ERROR("missing srtpCryptoSuite)");// Ensure it's a crypto suite supported by us.auto it =PlainTransport::string2SrtpCryptoSuite.find(jsonSrtpCryptoSuiteIt->get<std::string>());if (it == PlainTransport::string2SrtpCryptoSuite.end())MS_THROW_TYPE_ERROR("invalid/unsupported srtpCryptoSuite");// NOTE: The SRTP crypto suite may change later on connect().this->srtpCryptoSuite = it->second;switch (this->srtpCryptoSuite){case RTC::SrtpSession::CryptoSuite::AEAD_AES_256_GCM:{this->srtpMasterLength = SrtpAesGcm256MasterLength;break;}case RTC::SrtpSession::CryptoSuite::AEAD_AES_128_GCM:{this->srtpMasterLength = SrtpAesGcm128MasterLength;break;}case RTC::SrtpSession::CryptoSuite::AES_CM_128_HMAC_SHA1_80:case RTC::SrtpSession::CryptoSuite::AES_CM_128_HMAC_SHA1_32:{this->srtpMasterLength = SrtpMasterLength;break;}default:{MS_ABORT("unknown SRTP crypto suite");}}this->srtpKey       = Utils::Crypto::GetRandomString(this->srtpMasterLength);this->srtpKeyBase64 = Utils::String::Base64Encode(this->srtpKey);//进行base64编码}try{// This may throw. 通过 listenIp, port 创建 UdpSocketif (port != 0)this->udpSocket = new RTC::UdpSocket(this, this->listenIp.ip, port);elsethis->udpSocket = new RTC::UdpSocket(this, this->listenIp.ip);if (!this->rtcpMux){// This may throw.this->rtcpUdpSocket = new RTC::UdpSocket(this, this->listenIp.ip);}// NOTE: This may throw.this->shared->channelMessageRegistrator->RegisterHandler(this->id,/*channelRequestHandler*/ this,/*payloadChannelRequestHandler*/ this,/*payloadChannelNotificationHandler*/ this);}catch (const MediaSoupError& error){delete this->udpSocket;this->udpSocket = nullptr;delete this->rtcpUdpSocket;this->rtcpUdpSocket = nullptr;throw;}}

相关文章:

【MediaSoup---源码篇】(三)Transport

概述 RTC::Transport是mediasoup中的一个重要概念&#xff0c;它用于在mediasoup与客户端之间传输实时音视频数据。 Transport继承着众多的类&#xff0c;主要用于Transport的整体感知 class Transport : public RTC::Producer::Listener,public RTC::Consumer::Listener,publ…...

爱分析《商业智能最佳实践案例》

近日&#xff0c;国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》&#xff0c;此评选活动面向落地商业智能的各行企业和商业智能厂商&#xff0c;以第三方专业视角深入调研&#xff0c;评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…...

golang:context

context作用 goroutine的退出机制 多个goroutine都是平行的被调度的&#xff0c;多个goroutine如何协调工作涉及通信、同步、通知和退出 通信&#xff1a;goroutine之间的通信同步chan通道 同步&#xff1a;不带缓冲的chan提供了一个天然的同步等待机制。通过WaitGroup也可以…...

探讨代理IP与Socks5代理在跨界电商中的网络安全应用

在数字化时代&#xff0c;跨界电商已经成为了商业世界中的一大趋势。然而&#xff0c;跨越国界的电商活动也伴随着网络安全挑战。本文将讨论如何利用代理IP和Socks5代理技术来提高跨界电商中的网络安全&#xff0c;同时也探讨了与游戏相关的爬虫应用。 1. 代理IP和Socks5代理的…...

Guava Cache介绍-面试用

一、Guava Cache简介 1、简介 Guava Cache是本地缓存&#xff0c;数据读写都在一个进程内&#xff0c;相对于分布式缓存redis&#xff0c;不需要网络传输的过程&#xff0c;访问速度很快&#xff0c;同时也受到 JVM 内存的制约&#xff0c;无法在数据量较多的场景下使用。 基…...

ARM 汇编指令作业(求公约数、for循环实现1-100之间和、从SVC模式切换到user模式简单写法)

1、求两个数最大公约数 .text .globl _start_start:mov r0, #9mov r1, #15 Loop: 循环cmp r0,r1 比较r0和r1的大小beq stop 当r0和r1相等时&#xff0c;跳到stop标签subhi r0,r0,r1 r0-r1>0 时&#xff0c;证明r0>r1,将r0-r1的值赋给r0&…...

Go - 【字符串,数组,哈希表】常用操作

一. 字符串 字符串长度&#xff1a; s : "hello" l : len(s) fmt.Println(l) // 输出 5遍历字符串&#xff1a; s : "hello" for i, c : range s {fmt.Printf("%d:%c ", i, c) } // 输出&#xff1a;0:h 1:e 2:l 3:l 4:ofor i : 0; i < le…...

vue 普通组件的 局部注册

vue 普通组件的 注册 11 Vue2_3入门到实战-配套资料\01-随堂代码素材\day03\素材\00-准备代码\小兔鲜首页静态页\src...

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

随着我们在仿真教育中越来越多地使用新技术&#xff0c;区分虚拟模式的类型很重要。虚拟仿真是一个统称&#xff0c;用来概括术语来描述各种基于仿真的体验&#xff0c;从基于屏幕的平台到沉浸式虚拟现实。然而&#xff0c;各虚拟平台在保真度、沉浸感和临场感的水平上有很大差…...

【.net core】yisha框架使用nginx代理swagger接口无法访问问题

后端代码配置 #在StartUp.cs文件中Configure方法中增加以下代码 app.UseSwagger(c >{//代理路径访问c.PreSerializeFilters.Add((doc, item) >{//根据代理服务器提供的协议、地址和路由&#xff0c;生成api文档服务地址doc.Servers new List<OpenApiServer>{ new…...

uniapp录音功能和音频播放功能制作

录音功能 在 UniApp 中&#xff0c;你可以使用 uni.getRecorderManager() 方法来创建一个录音管理器实例&#xff0c;从而实现录音功能。 以下是一个示例&#xff0c;演示了如何在 UniApp 中使用 uni.getRecorderManager() 实现录音功能&#xff1a; // 在需要录音的页面或组…...

服务器数据恢复-LINUX操作系统下各文件系统误删除/格式化数据的恢复方案

服务器数据恢复环境&#xff1a; 基于EXT2/EXT3/EXT4/Reiserfs/Xfs文件系统的Linux操作系统。 服务器故障&#xff1a; LINUX操作系统下误删除/格式化数据。 服务器数据恢复过程&#xff1a; 1、首先会检测服务器是否存在硬件故障&#xff0c;如果检测出硬件故障&#xff0c;交…...

python/C++二分查找库函数(lower_bound() 、upper_bound,bisect_left,bisect_right)

二分查找是一种经典的搜索算法&#xff0c;广泛应用于有序数据集中。它允许在大型数据集中高效地查找目标元素&#xff0c;减少了搜索的时间复杂度。本文将介绍在 C 和 Python 中内置的二分查找函数&#xff0c;让二分查找变得更加容易。 c lower_bound() 、upper_bound 定义…...

爬虫 — App 爬虫(二)

目录 一、Appium介绍二、node.js 安装三、Java 的 SDK 安装以及配置1、安装步骤2、配置环境变量 四、安卓环境的配置1、配置环境变量 五、Appium 安装1、安装2、打开 APP3、使用 六、Appium 使用1、定位数据&#xff08;方法一&#xff0c;不常用&#xff09;2、定位数据&#…...

汽车电子相关术语

SOA SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种在计算机环境中设计、开发、部署和管理离散模型的方法。是由Garnter1996年提出的概念&#xff0c;将应用程序的不同功能单元&#xff08;称为服务&#xff09;进行拆分&#xf…...

Python 找出最大数

"""在输入的三个数中找出最大知识点&#xff1a;1、条件嵌套语句if/else2.字符串分割函数split()3、列表元素索引4、数据类型转换举一反三&#xff1a;1、如何控制只能输入三个数&#xff0c;否则重新输入2、如何避免输入无效字母"""# 定义一个变…...

Spring Security 用了那么久,你对它有整体把控吗?

文章目录 1.Servlet Filter&#xff1a;守门人的角色2.DelegatingFilterProxy&#xff1a;桥接 Servlet 和 Spring 的神器3.FilterChainProxy&#xff1a;Spring Security 过滤器链的管家3.SecurityFilterChain&#xff1a;Security 过滤器的串绳4.Spring Security 中的过滤器机…...

vue+minio实现文件上传操作

vueminio实现文件上传操作 minio文件上传vueminio实现文件上传操作 minio文件上传 minio文件上传有两种方法&#xff1a; 第一种是通过ak&#xff0c;sk&#xff0c;调用minio的sdk putObject进行文件上传&#xff1b;该方法支持go&#xff0c;java&#xff0c;js等各种语言&…...

使用JavaScript实现无限滚动的方法

前言 在网页设计中&#xff0c;无限滚动是一种常见的交互方式&#xff0c;用户可持续地加载更多内容而无需刷新页面&#xff0c;提高用户体验。本文将介绍如何运用JavaScript实现无限滚动的效果&#xff0c;使网页能够自动加载更多数据&#xff0c;减轻用户加载新页的负担&…...

html学习综合案例1

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简介</title> </head> <body>…...

神经节苷脂抗体——博迈伦

神经节苷脂抗体是指人体免疫系统中产生的一类抗体&#xff0c;其主要作用是攻击神经节苷脂抗原物质。神经节苷脂是一种存在于神经细胞表面的重要分子&#xff0c;参与了神经细胞间的信号传导和细胞黏附等重要功能。正常情况下&#xff0c;人体免疫系统不会对神经节苷脂产生抗体…...

【Unity】简单的深度虚化shader

【Unity】简单的深度虚化shader 实现效果 可以用于对地图场景边界的白模处理 实现方法 1.关键方法 UnityObjectToClipPos&#xff1a;将物体坐标转换为屏幕坐标 LinearEyeDepth&#xff1a;将屏幕坐标中的z值转换为实际的深度值 saturate&#xff1a;将值规范到0~1之间&a…...

启动 React APP 后经历了哪些过程

本文作者为 360 奇舞团前端开发工程师 前言 本文中使用的React版本为18&#xff0c;在摘取代码的过程中删减了部分代码&#xff0c;具体以源代码为准。 在React 18里&#xff0c;通过ReactDOM.createRoot创建根节点。并且通过调用原型链上的render来渲染。 本文主要是从以下两个…...

带自动采集小说网站源码 小说听书网站源码 小说网站源码 带教程

PTCMS可听书可下载的小说站源码 带自动采集和搭建视频教程 必装环境&#xff1a;Nginx(apache.iis也可)&#xff0c;mysql,php5.6,memcached php5.6安装扩展memcache新建站点&#xff0c;注意新建时&#xff0c;PHP版本必须选择PHP5.6 安装教程 1.上传网站文件到网站目录&…...

MySQL学习笔记2

MySQL glibc版本安装&#xff1a; 下载相应的安装包。 学会查看mysql的官方文档&#xff1a; 1&#xff09; 2&#xff09;点击“Reference Manual”按钮&#xff1a; 3&#xff09;选择5.7版本&#xff1a; 4&#xff09;点击Installing MySQL on Unix/Linux Using Generic …...

【python爬虫】—星巴克产品

文章目录 需求爬取星巴克产品以及图片&#xff0c;星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片&#xff0c;星巴克菜单 网页分析&#xff1a; 首先&#xff0c;需要分析星巴克官方网站的结构&#xff0c;了解菜单栏的位置、布局以及菜单项的标签或类名等信息…...

算法 矩阵最长递增路径-(递归回溯+动态规划)

牛客网: BM61 求矩阵的最长递增路径 解题思路: 1. 遍历二维矩阵每个位置&#xff0c;max求出所有位置分别为终点时的最长路径 2. 求某个位置为终点的最长路径时&#xff0c;使用动态规划dp对已经计算出的位置进行记录 3. 处理某个位置的最长路径时&#xff0c;如果dp[i][j]位…...

四、数学建模之图与网络模型

1.定义 2.例题及软件代码求解 一、定义 1.图和网络是相关概念 &#xff08;1&#xff09;图&#xff08;Graph&#xff09;&#xff1a;图是数学和计算机科学中的一个抽象概念&#xff0c;它由一组节点&#xff08;顶点&#xff09;和连接这些节点的边组成。图可以是有向的&…...

php在header增加key,sign,timestamp,实现鉴权

在PHP中&#xff0c;您可以通过在HTTP请求的Header中增加Key、Sign和Timestamp等信息来进行安全性鉴权。 以下是一种基本的思路和示例&#xff0c;用于说明如何实现这种鉴权机制&#xff1a; 生成Key和Sign&#xff1a; 服务端和客户端之间共享一个密钥&#xff08;Key&#x…...

Spring实例化源码解析之ConfigurationClassParser(三)

前言 上一章我们分析了ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法的源码逻辑&#xff0c;其中核心逻辑do while中调用parser.parse(candidates)方法&#xff0c;解析candidates中的候选配置类。然后本章我们主要分析ConfigurationClassParser的…...

网站怎样做微信公众号/2023知名品牌营销案例100例

无论是读书还是做工作&#xff0c;复盘是对经验的提升&#xff0c;帮助个人成长&#xff0c;养成总结的习惯&#xff0c;在成长的道路上少走弯路。爱因斯坦说过&#xff1a; ”持续不断地用同样的方法做同一件事情&#xff0c;但是期望获得不同的结果&#xff0c;这就是荒谬“ …...

网站平台建设调研报告/近期国际热点大事件

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼clear all;close all;clc;Iimread(img_368.jpg);Irgb2gray(I); %灰度变换figure(1); imshow(I);JI;[m,n]size(J);if isa(J,double)~1Jdouble(J);endM5; %gabor滤波器有5个尺度X16; %gabor滤波器窗口大小Y16;gbgetGaborKernels(M,X,…...

谷歌浏览器对做网站有什么好处/免费优化

今天看到这样一片文章: 在义乌买东西便宜到吓死你 近半年来&#xff0c;笔者替在澳洲做生意的一位亲戚办货&#xff0c;去了7次浙江义乌的小商品市场。在上海七铺路10元买3双的白色棉运动袜&#xff0c;那里卖7角&#xff1b;100支装的双头棉花签在上海家乐福大卖场卖1.2元&am…...

深圳网站建设推广优化seo/百度推广效果怎样

SQL中ROWCOUNT函数 返回受上一语句影响的行数。如果行数大于 20 亿&#xff0c;请使用 ROWCOUNT_BIG。语法 ROWCOUNT返回类型 int注释 Transact-SQL 语句可以通过下列方式设置 ROWCOUNT 的值&#xff1a;将 ROWCOUNT 设置为 受影响或被读取的行的数目 。可以将行发送到客户端&…...

网站title在哪里/搜索引擎优化技术都有哪些

第一个&#xff1a;1.打开一个空白的记事本文件 。2.在第一行写入.LOG(大写)&#xff0c;回车并存盘退出。3.双击你刚刚保存的文件&#xff0c;这是应该注意到在文件的最后出现了此时的日期时间。4.你可以输入要写入的内容&#xff0c;存盘退出。5.每一次你打开这个文件&#x…...

腾讯做的购物网站/营销活动策划

SQL-on-关系型数据库&#xff1a;不止于关系数据库SQL 是一门 ANSI 的标准计算机语言&#xff0c;用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作&#xff0c;比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以…...