WebRTC 服务器之Janus架构分析
1. Webrtc三种类型通信架构
1.1 1 对 1 通信
1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联,这样即可以节省服务器的资源,⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信,如果⽆法直接通信 的话,则会通过 STUN/TURN 服务器进⾏中转,如下图:
1.2 多对多通信
Mesh 架构:适合刚学习 WebRTC 的场景,简单易实现,但实际应用中因上行带宽占用大、线性资源占用等问题,超过 4 人时问题明显,几乎无人在真实场景中使用。
MCU 架构:硬件 MCU 曾在视频会议广泛应用,技术成熟,但价格昂贵,且随着互联网发展逐步被淘汰;软 MCU 如 FreeSWITCH 虽存在,但因 CPU 消耗大,真正使用者不多。
SFU 架构:近年来流行,是 WebRTC 多方通信媒体服务器的主流架构,具有高灵活性和高性能,配合 Simulcast 或 SVC 模式可更好地适应不同网络和终端,被多数公司采用。
Janus的多方视频通话使用VideoRoom插件,采用SFU架构。
维度 | mesh(P2P) | SFU | MCU |
---|---|---|---|
延迟 | 最低(直连) | 中等(服务器中转) | 最高(处理流程复杂) |
带宽消耗 | 上行压力大(N²增长) | 下行压力大(服务器承担) | 整体最低(单一流) |
扩展性 | 差(适合1:1) | 优(适合中小型会议) | 一般(适合大型会议) |
服务器成本 | 低(仅需穿透辅助) | 中(高带宽需求) | 高(计算+带宽双重压力) |
终端要求 | 需处理多流解码 | 需多流解码能力 | 仅需解码单一流 |
灵活性 | 高(端到端控制) | 高(自由订阅流) | 低(布局固定) |
典型应用 | 微信语音、Skype 1:1 | Zoom、腾讯会议 | 传统硬件视频会议系统 |
特点 | 多对多,Mesh 结构 | 发布订阅 | 混流集合 |
1.2.1 架构优点
架构 方案 | 优势 |
---|---|
Mesh 架构 | - 无需中转服务器,直接利用 WebRTC 通信模型,无需额外开发媒体服务器,降低了开发成本和复杂度。 - 充分利用客户端的带宽资源,将服务器端的带宽压力分散到各客户端,节省了服务器成本。 - 原有通信模型的简洁性,这种架构充分利用了现有的 WebRTC 通信模型,结构相对简单,易于实现和维护。 |
MCU 架构 | - 技术成熟,在硬件视频会议领域应用广泛,技术相对成熟可靠,能够提供稳定的通信服务。 - 兼容性强,作为音视频网关,通过解码、再编码可以屏蔽不同编解码设备之间的差异化,满足更多客户的集成需求,提升用户体验和产品竞争力。 - 统一画面输出,将多路视频混合成一路,所有参与者看到的是相同的画面,有助于提供一致的客户体验。 |
SFU 架构 | - 低资源消耗,数据包直接转发,不需要进行编解码操作,对 CPU 资源消耗很小,降低了服务器的硬件成本和运营成本。 - 低延迟,数据包直接转发极大地降低了延迟,提高了通信的实时性,适合对实时性要求较高的应用场景。 - 灵活性高,可以根据终端下行网络状况进行流控,如根据带宽、网络延时情况选择性地丢弃一些媒体数据,以保证通信的连续性,更好地适应不同的网络状况和终端设备。 - 支持多种模式,许多 SFU 实现支持 SVC 模式和 Simulcast 模式,能够更好地适配 WiFi、4G 等不同网络状况,以及 Phone、Pad、PC 等不同终端设备,提高了系统的兼容性和可用性。 |
Simulcast 模式就是指视频的共享者可以同时向 SFU 发送多路不同分辨率的视频流(⼀般为三路, 如 1080P、720P、360P)。⽽ SFU 可以将接收到的三路流根据各终端的情况⽽选择其中某⼀路发送出 去。例如,由于 PC 端⽹络特别好,给 PC 端发送 1080P 分辨率的视频;⽽移动⽹络较差,就给 Phone 发送 360P 分辨率的视频。 Simulcast 模式对移动端的终端类型⾮常有⽤,它 可以灵活⽽⼜智能地适应不同的⽹络环境。
SVC( Scalable Video Coding) 是可伸缩的视频编码模式。与 Simulcast 模式的 SVC 模式是 同时传多路流不同, 在视频编码时做“ ⼿脚” 。它在视频编码时将视频分成多层—— 核⼼层、中间层和扩展层。上层依赖于底层,⽽且越上层越清晰,越底层越模糊。在带宽不好的情况下,可以只传输核⼼层,在带宽充⾜的情况下,可以将三层全部 传输过去。
2. Janus 系统架构
Janus 被设计为通用的 WebRTC 服务器,专注于模块化和可扩展性。它提供必要的 WebRTC 基础设施,同时将特定的应用程序逻辑委托给插件。这种分离使 Janus 变得轻量级和灵活,无需更改内核即可支持广泛的用例。
架构的关键原则:
- 模块化设计:核心组件通过定义明确的接口清晰分离
- 基于插件的可扩展性:所有特定于应用程序的逻辑都在插件中实现
- 多传输支持:用于客户端交互的多种通信协议
- 媒体和信令分离:WebRTC 媒体处理和信令逻辑之间的明确分离
全局架构图如下:
2.1 核心组件
Janus 核心处理 WebRTC 和会话管理基础知识,提供插件和传输构建的基础基础设施。
2.1.1 会话和句柄模型
Janus 中最重要的架构概念之一是 session/handle 模型:
- 会话:表示用户与 Janus 的连接
- Handle:表示用户与特定插件之间的连接
- PeerConnection:与句柄关联的 WebRTC 连接
- transaction:表示当前消息信息的唯一句柄
这种关系在用户、插件和媒体连接之间建立了明确的分离。客户端与 Janus 创建会话。在此会话中,客户端可以附加到多个插件(创建句柄)。每个句柄都有自己的 WebRTC PeerConnection,用于管理媒体交换。
2.1.2 会话管理
会话是客户端连接到 Janus 的核心抽象。会话管理系统处理:
- 会话创建和销毁
- 会话超时(可配置,默认 60 秒)
- 会话声明(在传输断开连接后恢复会话)
每个会话都包含句柄,这些句柄是会话和插件实例之间的桥梁。会话层维护客户端与其插件附件之间的关系。
2.1.3 Media Handl管理
Janus 的媒体处理层负责 WebRTC 连接和媒体处理。ICE (Interactive Connectivity Establishment) 组件处理:
- 候选人聚集和交流
- NAT 遍历
- 连接建立
- 用于安全连接的 DTLS 协商
- 用于加密媒体的 SRTP
媒体路径处理:
- RTP/RTCP 数据包从 routing 到plugins
- SDP offer/answer 处理
- 媒体统计和监控
- 数据包重传的 NACK 处理
- TWCC(全交通拥堵控制)
2.2 插件系统
Janus 提供了一个插件架构,允许开发人员在不修改核心代码库的情况下实现各种 WebRTC 应用程序。插件向 Janus 核心注册,并为消息处理和媒体处理等事件实施回调。内核仅负责 WebRTC 连接和数据包路由,而插件则决定媒体会发生什么并实现应用程序逻辑。
Janus 包含的常见插件:
- VideoRoom:用于多方视频会议的选择性转发单元 (SFU)
- AudioBridge:具有混音功能的音频会议
- 流式处理:媒体流式处理(RTP、RTSP、HLS 源)
- SIP:用于 WebRTC 到 SIP 互作性的 SIP 网关
- EchoTest:用于测试 WebRTC 功能的简单 echo 测试插件
- TextRoom:基于数据通道的文本聊天室
- RecordPlay:WebRTC 会话的录制和播放
插件 API 公开了允许插件执行以下作的函数:
- 接收和发送媒体 (RTP/RTCP)
- 与客户交换消息
- 管理 WebRTC 连接
- 处理 SDP offers/answers
- 通过 Data Channel 发送和接收数据
2.3 传输层
传输层提供客户端和 Janus 服务器之间的通信通道。可以同时使用多种传输机制,从而灵活地选择客户端连接到 Janus 的方式。
- HTTP/REST:用于请求-响应交互的传统 REST API
- WebSockets:实时双向通信
- RabbitMQ:基于消息队列的通信
- MQTT:轻量级发布-订阅消息传递
- Unix 套接字:同一台机器上的进程间通信
所有传输都实现相同的 API,无论底层协议如何,都为核心提供一致的接口。这允许客户端选择最适合其需求的传输机制。
传输层负责:
- 身份验证请求(如果已配置)
- 解析和验证 JSON 消息
- 将请求路由到适当的会话/句柄
- 将事件和响应返回给客户端
2.4 事件处理程序
事件处理程序为外部应用程序提供了一种监视和响应 Janus 中发生的事件的方法。这些事件可以包括会话创建/销毁、媒体统计、特定于插件的事件等。事件处理程序(如传输和插件)在启动时动态加载,并在内核中注册。它们从核心接收事件,并将其转发到外部系统进行监控、记录或处理。
2.5 数据流架构
下图说明了在典型的 WebRTC 交互期间通过 Janus 架构的完整数据流。此流程展示了 Janus 的不同层如何协同工作以处理 WebRTC 信令、媒体交换和特定于应用程序的逻辑。各个组件之间的干净分离实现了灵活性和可扩展性。
英文版:
学习资料分享
0voice · GitHub
相关文章:
WebRTC 服务器之Janus架构分析
1. Webrtc三种类型通信架构 1.1 1 对 1 通信 1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联,这样即可以节省服务器的资源,⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信,如果⽆法直接…...
音视频开发成长之路与音视频知识总结
音视频开发曾经是一个富有挑战性和技术深度的领域。我来分享整理音视频开发的成长路径和知识体系: 音视频开发成长路线图 1. 基础阶段(1-3个月) 计算机基础:C/C、数据结构、操作系统音视频基础概念:采样率、比特率、…...
batch normalization和layer normalization区别
Normalization无非就是这样一个操作: 其中x是输入数据,维度为(B,T,C),其中B是batchsize,T是序列长度,C是embedding维度;括号内是标准化操作,γ和…...
Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)
Android Compose 层叠布局(ZStack、Surface)源码深度剖析 一、引言 在 Android 应用开发领域,用户界面(UI)的设计与实现一直是至关重要的环节。随着技术的不断演进,Android Compose 作为一种全新的声明式…...
数据仓库方法论书籍及其阅读建议
A、关于数据仓库方法论的各书籍详细分析及汇总 1. 《Building the Data Warehouse (Third Edition)》 by W.H. Inmon 核心观点 企业级数据仓库(EDW):自上而下的架构,采用第三范式(3NF)模型&…...
数据库 1.0
数据库就是放数据的地方 程序里面的数据就是暂时性的 要是想把数据永久性的储存 MySQL是典型的C / S架构 Client 云端 Sever 服务端 数据库服务的开启和关闭 可以在这里选择关闭开启,关闭之后就无法通过终端再连接mysql了 通过命令行的方式开启和关闭mysql&…...
给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放
实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6...
计算机系统结构 第二章 :缓存优化
零-1:复习cache的基础知识: 一、映像方式 直接映射 原理:主存被分成若干区,每个区大小与 Cache 相同,区内再分块,主存每个区中块的大小和 Cache 中块大小相等,且每个区包含的块数也与 Cache 中块数相等。主存中任意…...
软件工程实践
例一 用例文档 UC1注册 执行者 潜在会员 前置条件 潜在会员访问系统 后置条件 系统已记录注册信息 涉众利益 潜在会员——希望注册尽量简单,希望自己的信息不会泄露 商店——希望获得尽可能多的未来客户信息,特别是联系方法 基本路径 1.潜在会员请求注册…...
将Airtable导入NocoDB
将Airtable导入NocoDB 0. 前提条件1. 详细步骤 NocoDB提供了一种简化流程,可在几分钟内将您的Airtable数据库无缝转移到各种数据库管理系统,包括MySQL、Postgres和SQLite。此功能特别适合希望将Airtable数据库迁移到更强大且可扩展的数据库管理系统中的用…...
【云备份】服务端数据管理模块设计与实现
目录 一、要管理的数据 二、如何管理数据 三.数据管理类的设计 3.1.数据信息结构体的设计 3.2.数据管理类的设计 四.数据管理类实现 4.1.数据信息结构体的数据填充 4.2.数据管理类的实现 五. 源代码测试 数据管理模块:需要管理的数据有哪些,而…...
Qt开发:按钮类的介绍和使用
文章目录 一、命令按钮类 (QPushButton)1.1 基本功能介绍1.2 常用构造函数1.3 常用方法1.4 信号与槽使用示例1.5 开关按钮(Checkable)1.6 创建出菜单按钮(Menu Button) 二、工具按钮类 (QToolBu…...
Clickhouse基于breakpad生成minidump文件,方便问题定位
背景 breakpad能够在程序崩溃的时候自动生成一个mini的core文件,能够帮助进行问题定位,但是clickhouse对于集成breappad的难度较大 查看github发现之前有大佬基于以前的分支有个MR,但是一直没有合并到社区,想来是有什么其他的原因…...
华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南
操作难点图例(详细见下文详细操作步骤) 操作成功图例 说明:以下是通过自定义连接器创建新的OBS桶的图例 说明:以下是通过自定义连接器将数据内容嵌入创建新的OBS桶的图例 操作难点图例 说明:连接器编排需要注意的是动作选择、输入参数的设置等...
C# 运算符重载深度解析:从基础到高阶实践
运算符重载是 C# 中一项强大的特性,它允许开发者为用户自定义类型定义运算符的行为,使得代码更直观、更符合领域逻辑。本文将通过理论解析与实战示例,全面讲解运算符重载的实现规则、适用场景及注意事项。 一、运算符重载的核心概念 1. 什么…...
面试现场“震”情百态:HashMap扩容记
(以下为符合要求的文章内容) 【场景】 2024年秋招季某互联网大厂会议室 面试官:张工(P8级架构师) 求职者:马小帅(双非二本应届生) 第一轮提问(Java基础篇) …...
SCAU18124--N皇后问题
18124 N皇后问题 时间限制:5000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有N*N的国际象棋棋盘,要求在上面放N个皇后,要求任意两个皇后不会互杀,有多少种不同的放法? 输入格式 …...
MySQL 分库分表
对于使用 MySQL 作为数据库管理系统的应用来说,当数据量达到一定规模时,单库单表的架构会面临性能瓶颈,如查询缓慢、写入性能下降等问题。为了解决这些问题,可以使用分库分表技术。 二、为什么需要分库分表 2.1 单库单表的局限性…...
滑动窗口leetcode 904
代码: class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…...
用Maven定位和解决依赖冲突
用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本(推荐)3.3 使…...
八大排序之选择排序
本篇文章将带你详细了解八大基本排序中的选择排序 目录 (一)选择排序的时间复杂度和空间复杂度及稳定性分析 (二)代码实现 (三)输出结果 选择排序的基本原理是:每次从待排序的数组中找出最大值和最小值。具体流程是…...
SVM实战:从理论到鸢尾花数据集的分类可视化
SVM实战:从理论到鸢尾花数据集的分类可视化 在机器学习的广阔领域中,支持向量机(Support Vector Machine,SVM)作为一种经典且强大的分类算法,备受瞩目。它凭借独特的思想和卓越的性能,在模式识…...
深入解析 Stacking:集成学习的“超级英雄联盟
在机器学习的世界里,我们常常面临一个挑战:单一模型往往难以完美地解决复杂问题。就像漫威电影中的超级英雄们一样,每个模型都有自己的独特能力,但也有局限性。那么,如何让这些模型“联手”发挥更大的力量呢࿱…...
C# 编程核心:控制流与方法调用详解
在编程中,控制流和方法调用是构建程序逻辑的两大基石。它们决定了代码的执行顺序和模块化协作方式。本文将从基础概念出发,结合代码示例,深入解析这两部分内容。 控制流:程序执行的指挥棒 控制流决定了代码的执行路径࿰…...
PyTorch_张量基本运算
基本运算中,包括add, sub, mul, div, neg等函数,以及这些函数的带下划线的版本add_, sub_, mul_, div_, neg_, 其中带下划线的版本为修改原数据。 代码 import torch import numpy as np # 不修改原数据的计算 def test01():data torch.randint(0, 10…...
C++负载均衡远程调用学习之订阅功能与发布功能
目录 1.lars-DnsV0.1回顾 2.Lars-DnsV0.2-订阅功能的订阅模块分析 3.Lars-DnsV0.2-订阅模块的类的单例创建及方法属性初始化 4.Lars-DnsV0.2-发布功能的实现 5.Lars-DnsV0.2-发布功能的总结 6.Lars-DnsV0.2-订阅流程复习 7.Lars-DnsV0.2-订阅模块的集成 8.Lars-DnsV0.2订…...
接口测试的核心思维(基础篇)
1.为什么会进行接口测试? 早期发现问题,降低修复成本 当我们服务端已经完成,而前端还未进行开发的时候。我们可以通过接口测试避免前端的交互直接进行服务端的测试。 接口测试也能够更早介入项目的测试,降低修复成本。 提高测试…...
给文件内容加行号
题目: 给定一个文件,通过文件读写,给文件内容加行号。 行号形式如: 1:) xxXXXX 2:) xxxxXX 要求: 使用缓冲流操作。 思路分析: 程序定义了两个字符串变量 inputFile 和 outputFile,分别存储输入文件的路径…...
【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架
MVSNet:基于深度学习的多视图立体视觉重建框架 技术架构与核心算法1. 算法流程2. 关键创新 环境配置与实战指南硬件要求安装步骤数据准备(DTU数据集) 实战流程1. 模型训练2. 深度图推断3. 点云生成 常见问题与解决方案1. CUDA内存不足2. 特征…...
终端与环境变量
一、我的电脑是Win10的,首先打开终端如下: 此时终端来到C:\Users\lenovo的目录下,可以访问该目录下的所有文件(夹)。另外,除了这个之外,终端还可以访问环境变量中的所有文件(夹&…...
使用线性表实现通讯录管理
目录 🚀前言🦜任务目标🌟顺序表实现🐍链表实现 🚀前言 大家好!我是 EnigmaCoder。 本文介绍线性表的实验,使用顺序表和链表实现通讯录管理,包含初始化、插入、删除、查询、输出。 &a…...
机器学习常用评价指标
1. 指标说明 (1) AccuracyClassification(准确率) • 计算方式:accuracy_score(y_true, y_pred) • 作用: 衡量模型正确预测的样本比例(包括所有类别)。 公式: Accuracy TP TN TP TN FP…...
基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.1 器件选择1.2 接线方案 二、驱动实现2.1 核心代码解析(arduino/ESP32-S3) 三、坐标解析代码四、典型问题排查总结 前言 北斗卫星导航…...
CGAL:创建点、线、三角形及其距离、关系
CGAL(Computational Geometry Algorithms Library,计算几何算法库)是一个强大的开源库,为众多几何计算问题提供了高效的解决方案,在计算几何领域应用广泛。以下将基于提供的代码示例,详细介绍如何利用 CGAL…...
STM32基础教程——软件I2C
目录 前言 I2C MPU6050 技术实现 原理图 连线图 代码实现 技术要点 I2C初始化 SCL输出和SDA输入输出控制 起始信号 停止信号 发送一个字节 读取一个字节 发送应答位 接收应答位 MPU6050初始化 指定地址写 指定地址读 读取数据寄存器 问题记录 前言 I2C …...
Xilinx FPGA | 管脚约束 / 时序约束 / 问题解析
注:本文为 “Xilinx FPGA | 管脚约束 / 时序约束 / 问题解析” 相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Xilinx FPGA 管脚 XDC 约束之:物理约束 FPGA技术实战 于 2020-02-04 17:14:53 发布 说明&#x…...
应用层自定义协议序列与反序列化
目录 一、网络版计算器 二、网络版本计算器实现 2.1源代码 2.2测试结果 一、网络版计算器 应用层定义的协议: 应用层进行网络通信能否使用如下的协议进行通信呢? 在操作系统内核中是以这种协议进行通信的,但是在应用层禁止以这种协议进行…...
大数据:数字时代的驱动力
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 随着互联网和技术的迅猛发展,数据已经成为现代社会最宝贵的资源之一。大数据(Big Data)作为一种全新的信息资源,正以前所未有的方式改变着各个行业的运作模式,推动着社会的进步与创新。无论是金…...
java学习之数据结构:二、链表
本节介绍链表 目录 1.什么是链表 1.1链表定义 1.2链表分类 2.链表实现 2.1创建链表 1)手动创建 2)创建链表类进行管理链表的相关操作 2.2添加元素 1)头插法 2)尾插法 3)任意位置插入 2.3删除 2.4查找 1&…...
评估动态化烹饪工艺与营养实训室建设要点
在全民健康意识显著提升、健康饮食理念深度普及的时代背景下,烹饪工艺与营养实训室建设要点已不再局限于传统单一的技能训练模式。需以行业需求为导向,通过功能集成化设计推动革新 —— 将食品安全防控、营养科学分析、智能烹饪技术、餐饮运营管理等多元…...
Java学习手册:关系型数据库基础
一、关系型数据库概述 关系型数据库是一种基于关系模型的数据库,它将数据组织成一个或多个表(或称为关系),每个表由行和列组成。每一列都有一个唯一的名字,称为属性,表中的每一行是一个元组,代…...
吾爱出品 [Windows] EndNote 21.5.18513 汉化补丁
[Windows] EndNote 链接:https://pan.xunlei.com/s/VOPLLs6DqKNz-EoBSWVRTSmGA1?pwd9isc# Thomson Scientific公司推出了2025,本次的endnote21大概率是最后一个版本啦,现已决定进行更新。 本次采用的环境为python3.12,win11&am…...
Sentinel学习
sentinel是阿里巴巴研发的一款微服务组件,主要为用户提供服务保护,包括限流熔断等措施 (一)主要功能 流量控制(限流):比如限制1s内有多少请求能到达服务器,防止大量请求打崩服务器…...
【中间件】brpc_基础_execution_queue
execution_queue 源码 1 简介 execution_queue.h 是 Apache BRPC 中实现 高性能异步任务执行队列 的核心组件,主要用于在用户态线程(bthread)中实现任务的 异步提交、有序执行和高效调度。 该模块通过解耦任务提交与执行过程,提…...
Servlet(二)
软件架构 1. C/S 客户端/服务器端 2. B/S 浏览器/服务器端: 客户端零维护,开发快 资源分类 1. 静态资源 所有用户看到相同的部分,如:html,css,js 2. 动态资源 用户访问相同资源后得到的结果可能不一致,如:s…...
如何提升个人的思维能力?
提升个人的逻辑思维能力是一个系统性工程,需要长期训练和科学方法。以下是分阶段、可操作的详细建议,涵盖理论基础、日常训练和实战应用: 一、构建逻辑基础认知 1. 学习逻辑学核心理论 入门读物:《简单的逻辑学》麦克伦尼&am…...
[UVM]UVM中reg_map的作用及多个rem_map的使用案例
UVM中reg_map的作用及多个rem_map的使用案例 摘要:在 UVM (Universal Verification Methodology) 中,寄存器模型是用于验证 DUT (Design Under Test) 寄存器行为的重要工具。UVM 寄存器模型中的 uvm_reg_map(简称 reg_map)是寄存器模型的核心组成部分之一,用于定义…...
重新构想E-E-A-T:提升销售与搜索可见性的SEO策略
在2025年的数字营销环境中,谷歌的E-E-A-T(经验、专业性、权威性、可信度)已成为SEO和内容营销的核心支柱。传统的E-E-A-T优化方法通常聚焦于展示作者资质或获取反向链接,但这些策略可能不足以应对AI驱动的搜索和日益挑剔的用户需求…...
AI 采用金字塔(Sohn‘s AI Adoption Pyramid)
这张图是 Sohn 的 AI 采用金字塔(Sohn’s AI Adoption Pyramid) ,用于描述不同程度的 AI 应用层次,各层次意义如下: 金字塔层级 Level 1:业务角色由人类主导,AI 起辅助作用,如 AI …...
影刀RPA中新增自己的自定义指令
入门到实战明细 1. 影刀RPA自定义指令概述 1.1 定义与作用 影刀RPA的自定义指令是一种强大的功能,旨在提高流程复用率,让用户能够个性化定制指令,实现流程在不同应用之间的相互调用。通过自定义指令,用户可以将常用的、具有独立…...