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

WebRTC Simulcast 大小流介绍与优化实践

Simulcast 是 WebRTC 中的一种标准化技术 ,简称大小流。通过 Simulcast,客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码,带宽较多的拉流端可以接收较高质量的视频流,带宽有限的拉流端则可以接收较低质量版本的视频流,从而保障每个参会者都能有流畅的观看体验。在我们的视频会议产品中,支持参会者启用大小流功能,以提高整体会议质量。

1

2cfc34474ed6d6d90d3ea31f95ddf988.gif

为什么选择大小流

在网络条件较差的情况下,参会者难以获得稳定的连接来接收其他人发布的高质量视频流。实际场景中,很难确保每位参会者始终处于良好的网络环境。我们观察到,网络状况最差的参会者可能显著影响整个会议的流畅性,带来以下问题:

  1. 视频质量下降:慢速用户的下行链路(接收方向)可能出现大量数据包丢失,导致视频画质不稳定、出现黑屏或空白帧, 甚至造成严重的卡顿、延迟和画面不连贯。

  2. 网络拥塞加剧:下行带宽饱和会导致网络拥塞,进而影响用户上行发送自己视频画面的能力。这不仅影响该用户,还会降低其他参会者的使用体验。

  3. 关键帧带宽放大效应:在基于WebRTC协议的实时传输系统中,当客户端因数据包丢失无法渲染帧时, 会频繁向发布视频流的用户(通过SFU)发送PLI(图片丢失指示)消息。接收PLI的客户端会生成新的关键帧作为响应,这些关键帧需广播给所有参会者,显著增加会话的带宽需求。当总带宽需求超过其他参会者的网络承受能力时,这种增加可能引发级联效应,进一步恶化会议体验。

175b9aba6eb91b337095b4dee99d56f8.png

随着会议规模的扩大,网络状况较差的参会者出现的可能性也随之增加。为了保障大规模会议的流畅性,优化慢速网络环境下的媒体传输已成为会议架构的基本要求。会议系统需要能够快速调整视频流质量,以适应不同参会者的网络条件。

目前,业界主要采用三种方法来解决这一问题:转码、SVC(可伸缩视频编码)和 Simulcast(联播,大小流)。它们各有优缺点:

  1. 转码:转码通过实时生成适合下行链路的备用视频流,能够以近乎最佳的方式适配不同网络条件。但转码会显著增加服务器的计算负担,尤其在大规模会议中,其高成本使其性价比不佳。

  2. SVC:SVC允许单个视频流适配多种码率,避免了额外生成备用流的需求。然而,其主要问题在于编解码器的兼容性。SVC要求所有参会设备支持可扩展的编解码器, 但许多移动设备依赖的H.264硬件编解码并不支持SVC,导致广泛兼容性难以实现。

  3. Simulcast:通过客户端对同一视频源以多种码率编码,并将这些视频流并行发送至 SFU(选择性转发单元)。SFU 根据参会者的网络条件切换和转发合适的视频流。虽然 Simulcast 对服务器的压力较小,但是会略微增加客户端的编码负担及其上行带宽消耗(在下文的优化实践中会提到如何尽可能的抵消这个副作用)。

4dab6c07f7739eb1e4ce746c12bc2cd7.png

综合考虑,Simulcast 更具可扩展性和成本效益,因为它不需要服务器上的媒体编解码,也不需要视频编解码器中的专门功能。

2

8520662f9da4b64d7596663298dd28f7.gif

SFU如何支持大小流

我们可以回顾一下推流端只推一路流的时候,在 SFU 中的数据收发模型(我们在之前的文章 [视频云:级联SFU的设计与实现] 中详细介绍了我们自主研发的 SFU 如何实现和设计,欢迎再次回顾~),

9befe74310df9cd4f7b4f9db1f38183f.png

基于一路流的收发模型,我们进一步设计扩展出多路流的收发:

  1. 接收多路视频流:复用同一条推流 PC 上的轨道接收器,通过多次 OnTrack 事件的触发,构建多个 UpTrack,并利用每层视频流的不同 SSRC 分别构造与其一一对应的 Buffer, 来缓存不同视频层的 RTP 数据包。

  2. 区分不同层视频流进行下发:可以为 Downtrack 引入当前层、下发目标层、是否正在切层中等状态,使 SFU 能够准确地将不同视频层的数据包下发给拉流端,以及通过切层进行时状态等待新流的关键帧再进行切层,保障端上的流畅播放。

    62f93c81f7964db5d22cae1350108ea3.png

RTP包序列号和时间戳的重写

在 Simulcast 大小流模式下,发送端将其视频源的不同版本作为单独的 RTP 流传输给 SFU,每个流都具有唯一的同步源 (SSRC) 标识符。但是对于接收端来说,如果 SFU 直接切换流数据转发,接收端可能因不连续的时间戳或序列号丢弃包或解码失败。因此,实现大小流的无缝切换(如低、中、高质量流),SFU 需要对发往下行 RTP 数据包中的 SSRC、RTP 序列号和 RTP 时间戳字段进行改写,确保接收端能够连续解码和播放,避免因切换而导致丢包或解码失败。

以下是在 SFU 中实现的关键流程:

  1. 改写下发流 RTP 包的 SSRC、序列号与时间戳,并维护序列号和时间戳的连续性,保证接收端观察到的序列号和时间戳是逻辑上连续的,使接收端对流切换过程完全无感知:

    1. RTP SSRC:标识一组连续的 RTP 数据包流,在 SFU 中,传入的每一层 Simulcast 视频流(高/中/低) 都有唯一的 SSRC。如果需要将多个层(例如层 1、层 2 和层 3)在传出时当作一个层下发给拉流端,则必须将这些下发包的 SSRC 重写为相同的值。

    2. RTP 序列号:RTP 序列号用于为共享同一 SSRC 的 RTP 包排序。由于 Simulcast 每个传入层的包数量和序列号不同,无法直接转发多个层的包而不调整序列号。

      911bb36ab91091cec992c91cf3c06fa2.png

    3. RTP 时间戳:RTP 时间戳用于表示视频帧相对于基准时间的渲染时间。由于 WebRTC 为每一层分配了独立的基准时间,导致各层的时间戳不兼容。为合并多层数据,必须将传入层的时间戳重写为与传出层的基准时间一致。

  2. 切换新流下发时,SFU 必须等待接收到新流的关键帧后再开始转发,避免解码器因缺少参考帧而解码失败。

  3. 缓存改写后的包信息和源包信息(序列号、时间戳)之间的映射关系,便于在丢包时提供准确的重传支持,保障切换后的流畅性。

3

095ea2c62170a790733f4f651154cf8b.gif

在大小流模式下优化实践

3.1 拥塞检测/带宽估计

拉流端的网络一旦发生拥塞,会导致更高的丢包率,从而引发画面卡顿和音视频失真等问题。为了避免拥塞,我们必须确保 SFU 下发的数据保持在拉流端允许的带宽范围内。在我们自主研发的SFU中,目前主要采用TWCC策略进行拥塞控制和带宽估计(我们在之前的文章 [视频云服务质量(Qos)之抗丢包策略] 中详细介绍了TWCC的原理,欢迎再次回顾~)。

此外,我们的 SFU 还基于 TWCC 反馈报告指出的数据包延迟状态和丢包率,实现了通过拥塞信号的有限状态机,通过不同的网络拥塞状态,进一步调整视频轨道大小流的分配,以适应不同的网络情况。

  1. 引入 5 种状态表示当前网络拥塞情况:

    1. 无拥塞状态:正常网络。

    2. 预拥塞状态:表示可能即将发生拥塞。

    3. 拥塞状态:表明网络已发生拥塞。

    4. 预拥塞恢复中:拥塞的"预警"消失,用于短暂的状态过渡从而避免频繁状态切换。

    5. 拥塞恢复中:拥塞的"滞后"状态,用于短暂的状态过渡从而避免频繁状态切换。

  2. 拥塞检测时机,基于事件触发和时间触发:

    1. 事件触发:TWCC 组包反馈报告

    2. 时间触发:定时器

  3. 状态转移条件,基于拥塞信号和状态超时:

    1. 拥塞信号

      * numGroups 为包组数

      * duration 为所有包组里的发送时间跨度, 即 maxSendTime (最晚发送时间) - minSendTime (最早发送时间)

      * loss 丢包率

      e335c7a9436642e0932ddab80530fa31.png

    2. 状态超时

      1. 预拥塞恢复中状态:500ms 超时,转移到正常网络状态;

      2. 拥塞恢复中状态:3s 超时,转移到正常网络状态;

  4. 状态切换完整逻辑:

    6ee91ea70b07492e08fdbda12277ae4f.png

  5. 用一个例子来说明该状态机如何变化:

    1. 正常网络:TWCC 反馈报告显示数据包延迟正常,无丢包。

    2. 拥塞预警:TWCC 反馈报告延迟轻微升高或偶现丢包且超过阈值,触发 [可能拥塞] 信号,网络状态切换到 {预拥塞} 状态。

    3. 拥塞发生:TWCC 反馈报告延迟持续升高且丢包率持续变大且超过阈值,触发 [确定拥塞] 信号,网络状态切换到 {拥塞} 状态。

    4. 拥塞恢复阶段:延迟和丢包率下降,不再触发 [确定拥塞] 信号,但仍不完全稳定,进入 {拥塞恢复} 状态。

    5. 网络完全恢复:TWCC 反馈报告所有指标恢复正常,返回到正常网络。

3.2 大小流自动化编排

我们通过上面的方法在 SFU 中准确地的捕捉到了拉流端网络是否拥塞,在大小流模式下,SFU 可以利用拥塞状态迅速对拉流端进行轨道分配的调整,从而有效缓解带宽拥塞,提高观看体验和会议质量。

  1. 视频流自动化分配的核心挑战和解决思路

    1. 挑战 1:带宽变化的不可预测性

      解决思路:结合实时反馈动态调整轨道分配,既不能超出带宽,又不能过分保守。

    2. 挑战 2:轨道分配优先级冲突

      解决思路:结合不同产品形态,会议场景下,优先保障屏幕共享、主讲人视频画面,再公平分配其他普通参会者。

    3. 挑战 3:用户体验和带宽限制的平衡

      解决思路:在用户订阅带宽不足时,保证在画面连续性的同时,最大化流质量。

  2. 拥塞网络下视频流的主要分配策略

a. 策略1:拥塞状态下统一降层策略

分配原则:迅速降层,逐步提升。

核心流程:

  1. 优先将带宽分配给屏幕共享及其他高优先级(如主讲人等),如果剩余可用带宽为0或不足以分给其他任意一条小流,则暂停下发流,避免造成进一步的拥塞;

  2. 从最小流开始分配,优先保障小流的视频流畅性;

  3. 小流分配完毕后,如果仍有多余带宽,遍历小流逐一升层直至无可用带宽,以提高用户体验;

进一步优化实践:

  1. 当网络状态刚切换到拥塞时,带宽估计可能不够准确,导致流的分配方案也可能不是最优的,进而不足以减少拥塞。这个时候,我们通过持续监控 rtp 包收发速率变化且进行采样,并利用 Kendall’s Tau 计算方法来分析数据包收发率的样本,可以得到网络传输效率的变化趋势呈「上升」还是「下降」 ,以确保即使在持续在拥塞状态下的带宽分配也和最新带宽估计一致,可以进一步调整分配从而缓解拥塞。

  2. 数据包收发速率可以被计算为 send delta / (recv delta + loss penalty),各参数具体解释为:

1.send delta:发送端相邻 rtp 包发送的时间间隔增量

2.recv delta:TWCC反馈报告接收端相邻 rtp 包接收的时间间隔增量

3.loss penalty:丢包惩罚加权,模拟丢失的数据包在队列中堆积时可能带来的排队延迟

rtp 包收发速率的趋势方向判定条件和阈值表以及相应动作,如下:

578f6353b80bf276409cea05ca59b662.png

b.策略2:拥塞状态下定期尝试升层策略

分配原则:一次尝试只提升一个轨道,优先级从远到近,确保资源分配的稳健和公平。

85a937ce19905058a4e56d7ca4176fca.png

核心流程:

  1. 计算当前通道的剩余带宽,如果没有,直接退出;

  2. 获取缺乏带宽分配的视频轨道, 按它们距离最大目标层的距离从远到近排序;

  3. 遍历排序后轨道尝试为其分配下一个更高的层

  4. 只要当前带宽满足一个轨道升层,则退出遍历,以免导致加剧拥塞;

c. 策略3:新增订阅轨道面临拥塞状态下带宽重分配策略

分配原则:合作性让渡,优先级从近到远。

d142a1c976c99824d176cf73b08a819c.png

核心流程:

  1. 计算不计入当前新增订阅轨道时的可用带宽余量,如果有余量,尝试提升轨道到最高层(遍历比当前层更高的层),直至找到满足条件的层级;

  2. 如果没有足够余量,尝试通过降低其他轨道层级释放带宽;

  3. 获取已分配带宽的视频轨道(屏幕共享除外),按它们距离最大目标层从近到远排序;

  4. 遍历轨道,计算可以通过降层释放的带宽;

  5. 如果累计释放的带宽满足当前新增订阅轨道的需求,对需要释放带宽的轨道进行降层,并将释放的带宽分配至新增订阅轨道;

  6. 如果可释放的带宽不足以分配给新增订阅轨道,则暂停下发该轨道的流;

4

e107a7000388f7a15da17c803f006b52.gif

端上的进一步优化

推流端(上行链路)
  • 推流端省流

    SFU 可以实时通过信令通道,每当订阅情况发生变化,则实时告知推流端,端上依据订阅情况,动态开启/暂停相关层级视频的编码,从而节省推流端上行带宽,减小大小流模式带来的副作用。

    d986cbfe80a55c98376105222af5838f.png

拉流端(下行链路)
  • 拉流端省流

    我们以常见的宫格式翻页的视频会议布局为例:

    对于当前页可见的视频轨道,端上实时追踪这些轨道所附加的视频元素大小,通过与 SFU 的实时信令通道进行反馈,从而获得 SFU 进行分析后认为质量更加合适的视频层(因为渲染轨道的视频元素的大小可能会有所不同,有时甚至会隐藏,总是获取高分辨率视频但仅将其渲染在比较小的框中将是极其浪费的)。而对于其他页不可见的视频轨道,端上可以通知 SFU 暂停下发不可见层的视频流数据。结合实际场景,交互式的实现拉流端获得自适应流的方式,从而节约拉流端的带宽,也一定程度上缓解了 SFU 的压力。

    95a99e7037f1d090d51c815193213752.png

  • 弱网场景下动态增加延迟,抵御频繁卡顿

    拉流端通过RTCRtpReceiver.jitterBufferTarget方法,可以支持动态调整jitterBufferTarget的大小(最大4000ms, 值越大,网络抖动的时候越不容易卡顿、延迟越大;反之缓冲器越小,网络抖动的时候越容易卡顿、延迟越低)。基于这种方式,端上可以依据 SFU 评估出来的网络质量评分,在网络情况越来越差的时候,动态增加延迟来降低卡顿的发生。


    推荐阅读:

视频云服务质量(Qos)之抗丢包策略

视频云:级联SFU的设计与实现

更多技术和产品文章,请关注??

如果您对哪个产品感兴趣,欢迎留言给我们,我们会定向邀文~

360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。
目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。
智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值。
官网:https://zyun.360.cn 或搜索“360智汇云”
客服电话:4000052360
欢迎使用我们的产品!??

相关文章:

WebRTC Simulcast 大小流介绍与优化实践

Simulcast 是 WebRTC 中的一种标准化技术 ,简称大小流。通过 Simulcast,客户端可以同时发送同一视频的多个版本。每个版本都以不同的分辨率和帧率独立编码,带宽较多的拉流端可以接收较高质量的视频流,带宽有限的拉流端则可以接收较…...

软件测试之测试用例

文章目录 测试用例测试用例的编写总结 测试用例 测试用例:描述测试点执行的文档(测试输入、执行条件、预期结果等) 作用 1.测试点能被精准执行 2.便于团队合作测试用例核心内容 用例编号、用例标题、所属模块、优先级、前置条件、测试步骤、测试数据、预期结果 测试用例的编写…...

Redis--通用命令学习

目录 一、引言 二、基础命令 1.set 2.get 3.keys 3.1 keys ? 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的过期策略(面试题) 1.惰性删除 2.定期删除 …...

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能,确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW,可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法,并结合硬件选型提供实…...

一篇文章学会HTML

目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...

48页PPT|2024智慧仓储解决方案解读

本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先,从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策,这些政策强调了自动化、标准化、信息化水平的提升,以及智能化立体仓库的建设&#xff0…...

React Props 完整使用指南

React Props 完整使用指南 1. 类组件中的 Props 1.1 基本使用 // 父组件 class ParentComponent extends React.Component {render() {return (<ChildComponent name"John"age{25}isStudent{true}hobbies{[reading, swimming]}/>);} }// 子组件 class Child…...

金融数据可视化实现

一、设计题目 金融数据可视化 二、设计目的 使学生掌握用Pandas第三方库数据计算、数据分析的知识与能力。Pandas是专门用于数据分析的库&#xff0c;其提供的read_excel()方法可以方便的读取xlsx格式的文件中的数据到Pandas中的DataFrame中。 DataFrame.plot(kindline)&am…...

逆袭之路(6)——解析数据世界的灵动基石——变量

困厄铸剑心&#xff0c;逆袭展锋芒。 寒苦凝壮志&#xff0c;腾跃绘华章。 我要逆袭。 目录 一、引言 二、变量的定义 三、变量的性质 &#xff08;一&#xff09;可变性 &#xff08;二&#xff09;有界性 &#xff08;三&#xff09;关联性 四、变量的类型 &#xff…...

【云原生】kubeadm搭建的kubernetes1.28集群上自建ingress-nginx服务

1、查询兼容性 先确认下kubernetes版本与ingress-nginx版本兼容性 Ingress-NGINX 版本支持的 k8s 版本Alpine 版本Nginx 版本Helm Chart 版本v1.12.0-beta.01.31, 1.30, 1.29, 1.283.20.31.25.54.12.0-beta.0v1.11.31.30, 1.29, 1.28, 1.27, 1.263.20.31.25.54.11.3v1.11.21.3…...

分布式协同 - 分布式事务_TCC解决方案

文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC&#xff08;Two-Phase Commit&#xff0c;二阶段提交&#xff09;3PC&#xff08;Three-Phase Commit&#xff0c;三阶段提交&#xff09;TCC&#xff08;Try-Confirm-Cancel&#xff09;2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…...

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了...

SpringBoot3整合FastJSON2如何配置configureMessageConverters

在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤&#xff0c;包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…...

数据库安全-redisCouchdb

1.redis未授权访问 默认端口:6379 1.1 Redis沙盒逃逸漏洞RCE-CVE-2022-0543 介绍&#xff1a;Redis 是一套开源的使用 ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库&#xff0c;并提供多种语言的API。Redis 如果在没有开启认证的情况下&#xff0c;…...

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…...

ASP.NET |日常开发中常见问题归纳讲解

ASP.NET &#xff5c;日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态&#xff08;在ASP.NET Web Forms 中&#xff09; 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击&#xff08;XSS&#xff09; 三、状态管理问题3.1 会话状态&#xff08;Session …...

Jenkins安全部署规范及安全基线

Jenkins安全部署规范及安全基线 进入安全设置界面启用安全Disable remember me访问控制——安全域&#xff08;Security Realm&#xff09;servlet容器代理&#xff08;Delegate to servlet container&#xff09;Jenkins专有用户数据库&#xff08;Jenkins’ own user databas…...

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…...

文本文件和二进制文件

1.为什么使用文件 使用文件我们可以将数据直接存放在电脑的硬盘上&#xff0c;做到了数据的持久化。 2. 什么是文件 磁盘上的文件是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09…...

Linux 常见用例汇总

注&#xff1a;本文为 Linux 常见用例文章合辑。 部分内容已过时&#xff0c;未更新整理。 检查 Linux 上的 glibc 版本 译者&#xff1a;joeren | 2014-11-27 21:33 问&#xff1a;检查 Linux 系统上的 GNU C 库&#xff08;glibc&#xff09;的版本&#xff1f; GNU C 库&…...

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…...

Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit

可以搭建属于公司内部或者个人的Git服务器&#xff0c;方便程序代码及文档版本管理。 官网&#xff1a;http://www.gitblit.com/ Windows环境下安装 提前已经安装好了JDK。 官网下载Windows版的GitBlit。 将zip包解压到自己想要放置的文件夹下。 建立版本库路径&#xff0c…...

《Web 应用项目开发:从构思到上线的全过程》

目录 一、引言 二、项目启动与需求分析 三、设计阶段 四、技术选型 五、开发阶段 六、测试阶段 七、部署与上线 八、维护与更新 九、总结 一、引言 在数字化浪潮席卷全球的当下&#xff0c;Web 应用如繁星般在互联网的苍穹中闪烁&#xff0c;它们形态各异&#xff0c…...

ctf相关总结

CTF比赛定义&#xff1a; CTF&#xff08;Capture The Flag&#xff09;是一种信息安全竞赛形式&#xff0c;参赛队伍通过破解题目获取flag来得分。 比赛流程&#xff1a; 参赛队伍在题目平台上登录&#xff0c;选择题目进行解答&#xff0c;提交flag后由系统自动评分。 三…...

v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。

一、背景、目的、简介。 一般来说&#xff0c;通过uboot将屏幕参数传给kernel&#xff0c;是通过修改设备树。 uboot和kernel都需要屏幕点亮。uboot侧重于显示一张图片。而kernel则多是动画。 在这里&#xff0c;我先是找到了一个裸机点屏的代码。将其编译成静态库后&#x…...

学习笔记(prism--视频【WPF-prism核心教程】)--待更新

《一》框架介绍 prism是一个用于WPF…和winUI中构建的松散耦合&#xff0c;可维护和可测试的应用程序框架。帮助WPF开发人员以简化编写&#xff0c;维护和扩展来设计应用程序。 优点&#xff1a;遵循特定的约定&#xff0c;可自动将view/ViewModel建立DataContext的关系&#…...

从AI换脸到篡改图像,合合信息如何提升视觉内容安全?

本文目录 引言一、AI“真假之战”下的发展现状与考验挑战1.1 视觉内容安全现状与技术分类1.2视觉内容安全企业1.3视觉内容安全领域挑战 二、开山之石&#xff1a;引领视觉内容安全的创新之路2.1合合内容安全系统2.2发起编制相关技术规范2.3参与篡改检测挑战赛 三、视觉内容安全…...

12.12【java exp4】react table全局搜索tailwindcss 布局 (Layout) css美化 3. (rowId: number

react table 创建一个下拉菜单&#xff0c;允许用户选择要搜索的列。创建一个输入框&#xff0c;用于输入搜索关键词。根据用户的选择&#xff0c;动态地应用过滤器到指定的列 全局搜索 import React from react; import { useTable, useFilters, useGlobalFilter, useSortBy…...

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…...

频繁拿下定点,华玉高性能中间件迈入商业化新阶段

伴随着智能驾驶渗透率的快速增长&#xff0c;中国基础软件市场开始进入黄金窗口期。 近日&#xff0c;华玉通软&#xff08;下称“华玉”&#xff09;正式获得某国内头部轨道交通产业集团的智能化中间件平台定点项目。这将是华玉在基础软件领域深耕和商业化发展过程中的又一重…...

装饰者模式

代码详解&#xff1a;【设计模式】Java 设计模式之装饰者模式&#xff08;Decorator&#xff09;_java 装饰者模式-CSDN博客 // 抽象构件角色 public interface Component {void operation(); }// 具体构件角色 public class ConcreteComponent implements Component {Override…...

【河南新标】豫财预〔2024〕105号-《关于省级政务信息化建设项目支出预算标准的规定》-费用标准解读系列29

2024年12月3日&#xff0c;河南省财政厅发布了《关于省级政务信息化建设项目支出预算标准的规定》豫财预〔2024〕105号。《关于省级政务信息化建设项目支出预算标准的规定 &#xff08;试行&#xff09;》&#xff08;豫财预 〔2020〕81号&#xff09;同时废止。新的豫财预〔20…...

Android 蓝牙开发-传输数据

概述 传统蓝牙是通过建立REFCCOM sockect来进行通信的&#xff0c;类似于socket通信&#xff0c;一台设备需要开放服务器套接字并处于listen状态&#xff0c;而另一台设备使用服务器的MAC地址发起连接。连接建立后&#xff0c;服务器和客户端就都通过对BluetoothSocket进行读写…...

使用VSCode Debugger 调试 React项目

一般我们调试代码时&#xff0c;用的最多的应该就是console.log方式了&#xff0c;还有的是使用Chrome DevTools 通过在对应的 sourcemap代码位置打断点进行调试&#xff0c;除了上面两种方式外还有一种更好用的调试方式&#xff1a; VSCode Debugger。 VSCode Debugger可以直…...

ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关

目录 应用 1&#xff1a;它是相关性还是托布勒第一定律&#xff1f; 应用 2&#xff1a;将空间带入非空间模型 结论 在 ArcGIS Pro 3.4 中&#xff0c;我们在新的空间组件实用程序&#xff08;Moran 特征向量&#xff09;工具集中发布了一个新工具 - 从字段过滤空间自相关。…...

Flink SQL Cookbook on Zeppelin 部署使用

简介&#xff1a;对于初学者来说&#xff0c;学习 Flink 可能不是一件容易的事情。看文档是一种学习&#xff0c;更重要的是实践起来。但对于一个初学者来说要把一个 Flink SQL 跑起来还真不容易&#xff0c;要搭各种环境&#xff0c;真心累。很幸运的是&#xff0c;Flink 生态…...

用二进制方式向文件读写一组数据

【例10.4】从键盘输入10个学生的有关数据&#xff0c;然后把它们转存到磁盘文件上去。 #include<stdio.h> struct Student{char name[20];int number;int age; }; int main(){int i;struct Student stu;FILE *fp;fp fopen("1.txt","wb");if(fp N…...

WebChat——一个开源的聊天应用

Web Chat 是开源的聊天系统&#xff0c;支持一键免费部署私人Chat网页的应用程序。 开源地址&#xff1a;https://github.com/loks666/webchat 目录树 TOC ??? 开始使用 & 交流?? 开箱即用 [这里是代码001] 使用 Docker 部署[这里是代码002] 使用 Docker-compose …...

易语言 OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…...

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…...

重温设计模式--设计模式七大原则

文章目录 1、开闭原则&#xff08;Open - Closed Principle&#xff0c;OCP&#xff09;定义&#xff1a;示例&#xff1a;好处&#xff1a; 2、里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;定义&#xff1a;示例&#xff1a;好处&#…...

【Python-中级】Python中的线程池:ThreadPoolExecutor

Python中的线程池:from concurrent.futures import ThreadPoolExecutor 在Python中,实现多线程编程的方法有很多,而ThreadPoolExecutor 是一个简单且高效的线程池工具。它提供了高层次的接口,用于并发地运行任务,同时隐藏了许多复杂的底层细节,非常适合日常的多线程任务…...

【终端工具】FinalShell v4.5.12 官方版

1.下载地址 【终端工具】FinalShell v4.5.12 官方版 2.简介 FinalShell是一款免费的跨平台远程管理工具&#xff0c;专为开发者和运维人员设计。它支持通过 SSH、SFTP 等方式连接到 Linux 和 Windows 服务器&#xff0c;提供类似于终端的操作界面。除了常规的远程登录功能&a…...

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么&#xff1a; WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具&#xff0c;它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL&#xff1a; Docker 依赖 Linux 内核功能&#xff0c;WSL 2 提供了一个高性能、轻量级的…...

基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建一个图书馆仓储管理系统是一个涉及多个功能模块的项目&#xff0c;包括但不限于图书管理、读者管理、借阅管理、归还管理等。 1. 环境准备 确保你已经安装了以下工具和环境&#xff1a; Java Developmen…...

《智驱新材合成:AI 点亮创新路径之光》

在科技浪潮汹涌澎湃的当下&#xff0c;新材料的探寻成为众多领域突破发展瓶颈的关键钥匙。而人工智能&#xff08;AI&#xff09;作为前沿科技的璀璨星辰&#xff0c;正以其独特的创新光芒照亮新材料合成路径的未知之境&#xff0c;引发了科研界与产业界的广泛关注与热议&#…...

【C++ 基础】命名空间

命名空间 命名空间 头文件:内有许多库函数&#xff08;相当于书柜&#xff09;&#xff0c;对库函数进行管理 命名空间:内有许多函数&#xff08;相当于书柜的一个分区&#xff09;&#xff0c;对函数进行管理 语法格式 namespace 命名空间标识符{...命名空间成员}//花括号…...

120页PPT讲解ChatGPT如何与财务数字化转型的业财融合

此方案主要聚焦于利用ChatGPT技术与数字化转型推动业财融合&#xff0c;实现企业的价值最大化。首先&#xff0c;通过ChatGPT技术&#xff0c;企业可以构建生成式对话机器人&#xff0c;自动回答常见问题&#xff0c;减轻人工客服的压力&#xff0c;提高响应速度。这种机器人具…...

新闻网站的安全性:保护信息与用户隐私

2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…...

Flutter动画学习二

如何在 Flutter 中使用自定义动画和剪裁&#xff08;clipping&#xff09;实现一个简单的动画效果。 前置知识点学习 AnimationController AnimationController 是 Flutter 动画框架中的一个核心类&#xff0c;用于控制动画的生命周期和状态。它提供了一种灵活的方式来定义动…...