音视频入门基础:RTCP专题(3)——RTCP协议简介(中)
本文接着《音视频入门基础:RTCP专题(2)——RTCP协议简介(上)》,继续对RTCP协议进行简介。本文的一级标题从“九”开始。
九、Sender and Receiver Reports
本段内容对应《RFC 3550》的第6.4节。根据《RFC 3550》第29页,RTP 接收器(RTP receivers)使用 RTCP报告数据包提供接收质量反馈,报告数据包(report packets)有两种形式,取决于接收器是否同时也是发送器。除了数据包类型代码外,发送方报告 (sender report,SR) 和接收方报告 (receiver report,RR) 形式之间的唯一区别是,发送方报告包含一个20字节的发送方信息部分,供活动发送方使用。如果一个站点在上次或前一次报告发出后的时间间隔内发送了任何数据包,则发出SR报告,否则发出RR报告。
SR和RR两种形式都包括零个或多个接收报告块,自上次报告后,每个同步源(synchronization sources)都有一个接收报告块(reception report blocks),该接收器从这些同步源接收RTP数据包。对于CSRC列表中列出的贡献源(contributing sources),不发布报告。每个接收报告块都提供从该块所示特定源接收到的数据的统计信息。由于SR或RR 数据包中最多可容纳31个接收报告块,因此应根据需要在初始SR或RR数据包后堆叠附加RR数据包,以包含自上次报告后的间隔期间听到的所有信源的接收报告。如果信号源太多,无法在不超过网络路径MTU的情况下将所有必要的RR数据包放入一个复合 RTCP数据包中,则每个间隔中只应包含可放入一个MTU的子集。应在多个时间间隔内循环选择子集,以便报告所有来源。
《RFC 3550》接下来的章节将定义这两份报告的格式,如果应用需要额外的反馈信息,如何以特定配置文件的方式对其进行扩展,以及如何使用这些报告。《RFC 3550》第7节将详细介绍译码器(translators )和混合器(mixers)的接收报告。
十、SR: Sender Report RTCP Packet
本段内容对应《RFC 3550》的第6.4.1节:
根据《RFC 3550》第30页,发送方报告数据包(sender report packet)由三个部分组成,后面可能还有第四个特定配置文件的扩展部分(profile-specific extension section,如果已定义)。
(一)第一部分
第一部分是报头(header),长度为8个八位字节。字段含义如下:
version (V):占2位,标识RTP的版本。RTCP数据包中的版本与RTP 数据包中的版本相同,值都为2。
padding (P):占1位,为填充位。如果设置了填充位,则该单个RTCP数据包在末尾包含一些额外的填充八位字节,这些八位字节不是控制信息的一部分,而是包含在长度(length)字段中。某些具有固定数据块大小的加密算法可能需要使用填充。在一个复合RTCP数据包中,由于复合数据包是作为一个整体按照《RFC 3550》第9.1节中的方法进行加密的,因此只需要在一个单独的数据包中添加填充。因此,必须只在最后一个单独数据包中添加填充,如果在该数据包中添加了填充,则必须只在该数据包中设置填充位。这一约定有助于进行《RFC 3550》附录A.2所述的包头有效性检查(header validity checks),并能检测出某些早期实现中错误设置第一个单独数据包的填充位并在最后一个单独数据包中添加填充的数据包。
reception report count (RC):占5位。该数据包中包含的接收报告块(reception report blocks)的数量,值可以为0。
packet type (PT):占8位。包含常数200,用于将其标识为RTCP SR数据包。
length:占16位。该RTCP数据包的长度(32 位字减去1),包括报头(header)和任何填充(padding)。(1的偏移使0成为有效长度,避免了扫描复合RTCP数据包时可能出现的无限循环,而计算32 位字则避免了对4的倍数进行有效性检查)。
SSRC:占32位。该SR数据包发起方的同步源标识符。
(二)第二部分
第二部分是发送方信息(sender information),长度为20个八位字节,存在于每个发送方报告数据包(sender report packet)中。它总结了该发送方的数据传输情况。字段含义如下:
NTP timestamp:占64位。表示发送此报告时的挂钟(wallclock )时间(见《RFC 3550》第4节),以便与其他接收机接收报告(reception reports)中返回的时间戳结合使用,测量到这些接收机(receivers)的往返传播。接收方应注意,时间戳的测量精度可能远低于NTP时间戳的分辨率。在没有挂钟时间概念但有一些特定系统时钟(如“系统正常运行时间”)的系统上,发送方可以使用该时钟作为参考来计算相对NTP时间戳。选择一个常用的时钟非常重要,这样如果使用不同的实现来生成多媒体会话的各个数据流,所有实现都将使用相同的时钟。在2036年之前,相对时间戳和绝对时间戳在高位上会有差异,因此(无效)比较会显示很大的差异;希望到那时不再需要相对时间戳。没有挂钟或经过时间概念的发送方可以将NTP时间戳设为零。
挂钟时间(Wallclock time,绝对日期和时间)使用网络时间协议(NTP)的时间戳格式表示,其单位是相对于1900 年1 月1 日0h UTC的秒数。全分辨率NTP时间戳是一个64 位无符号定点数,整数部分在前 32 位,小数部分在后 32 位。在某些需要更紧凑表示的领域,只使用中间的 32 位,即整数部分的低 16 位和小数部分的高 16 位。整数部分的高 16 位必须独立确定。
要使用 RTP,执行程序不需要运行网络时间协议。可以使用其他时间源,或根本不使用时间源(参见RFC 3550》第6.4.1节中对NTP时间戳字段的描述)。不过,运行NTP可能有助于同步从不同主机传输的数据流。
NTP时间戳将在2036年的某个时候归零,但对于RTP而言,只使用NTP时间戳对之间的差值。只要可以假定这两对时间戳相差在68年以内,使用模块化算术进行减法和比较就不会出现绕零现象。
RTP timestamp:占32位。与NTP时间戳(上面的NTP timestamp)对应,但单位和随机偏移量与数据包中的RTP时间戳相同。这种对应关系可用于NTP时间戳同步的源的媒体内和媒体间同步,也可用于独立于媒体的接收器估算名义上的(nominal)RTP时钟频率。请注意,在大多数情况下,该时间戳并不等同于任何相邻数据包中的RTP时间戳。相反,必须利用RTP时间戳计数器与实时时间之间的关系,从相应的NTP时间戳中计算得出,而这种关系是通过在采样瞬间定期检查挂钟时间来维持的。
sender’s packet count: 占32位。发送方从开始传输到生成此SR数据包为止传输的RTP数据包总数。如果发送方更改了SSRC标识,则应重置该计数。
sender’s octet count:占32位。发送方从开始传输到生成此SR数据包为止在RTP 数据包中传输的有效载荷(payload )字节总数(即不包括报头或填充)。如果发送方更改了SSRC标识,则应重置该计数。该字段可用于估算平均有效负载数据速率。
(三)第三部分
第三部分包含0个或多个接收报告块(reception report blocks),取决于自上次报告以来该发件人听到的其他信号源的数量。每个接收报告块都传达了从单个同步源接收RTP数据包的统计数据。当信号源因碰撞而改变其SSRC标识时,接收方不应该继承统计数据。这些统计信息包括:
SSRC n (source identifier):占32位。该接收报告块中的信息所涉及的源的SSRC标识符。
fraction lost:占8位。自上一个SR或RR数据包发送后,从源SSRC_n丢失的RTP 数据包的分数,以二进制点位于字段左边缘的定点数表示(相当于将丢失分数乘以256后取整数部分)。《RFC 3550》附录A.3列出了实现方法。如果由于重复数据包造成的丢失为负数,则丢失分数设为0。需要注意的是,接收方无法判断在收到最后一个数据包后是否有任何数据包丢失,而且如果在最后一次报告间隔期间从某一数据源发送的所有数据包均已丢失,则不会为该数据源发出接收报告块。
cumulative number of packets lost:占24位。自开始接收以来,从源SSRC_n丢失的RTP数据包总数。这个数字的定义是预期数据包数减去实际接收到的数据包数,其中接收到的数据包数包括任何延迟或重复的数据包。因此,延迟到达的数据包不计入丢失,如果有重复数据包,丢失(loss)可能为负数。预期数据包数的定义是:已收到的扩展最后序列号(定义见下文)减去已收到的初始序列号。计算方法见《RFC 3550》附录A.3。
extended highest sequence number received:占32位。低16位包含从源SSRC_n 接收到的RTP数据包中的最高序列号,最重要的16位用相应的序列号周期计数扩展该序列号,序列号周期计数(count of sequence number cycles)可根据《RFC 3550》附录A.1中的算法进行维护。请注意,如果同一会话中的不同接收方的开始时间相差很大,它们将生成不同的序列号扩展(extensions to the sequence number)。
interarrival jitter:32位。RTP数据包到达时间统计方差的估计值,以时间戳单位测量,用无符号整数表示。到达间抖动 J 定义为一对数据包的接收方与发送方数据包间距差D的平均偏差(smoothed absolute value,平滑绝对值)。如下式所示,这相当于两个数据包的 “相对传输时间(relative transit time) ”之差;相对传输时间是数据包的 RTP时间戳和接收器时钟在到达时的差值,以相同单位测量。
如果Si是数据包i的RTP时间戳(RTP timestamp),Ri是数据包i以 RTP时间戳为单位的到达时间,那么对于两个数据包i和j,D可以表示为:
D(i, j)=(Rj − Ri) − (Sj − Si)=(Rj − Sj ) − (Ri − Si)
从源SSRC_n接收到每个数据包i时,应连续计算到达间抖动(interarrival jitter),利用该数据包与前一个数据包i - 1的差值D,按到达顺序(不一定是先后顺序),计算公式为:
J(i) = J(i − 1) + (|D(i − 1, i)| − J(i − 1))/16
每当接收报告(reception report)发出时,J 的当前值就会被采样。抖动(jitter)计算必须符合此处指定的公式,以便独立于配置文件的监测器对来自不同实现的报告做出有效解释。该算法是最佳的一阶估计器,增益参数 1/16 在保持合理收敛速度的同时,还提供了良好的降噪比(noise reduction)。《RFC 3550》附录A.8展示了一个实现示例。关于不同数据包持续时间和传输前延迟的影响,请参见《RFC 3550》第6.4.4节。
last SR timestamp (LSR):占32位。作为源SSRC_n 最近RTCP发送方报告 (SR) 数据包的一部分接收到的NTP时间戳(如《RFC 3550》第4节所述)64位中的中间32位。
delay since last SR (DLSR):占32位。从源SSRC_n接收最后一个SR数据包到发送此接收报告块之间的延迟,单位为1/65536秒。如果尚未收到来自SSRC_n的SR数据包,则DLSR字段置0。
让SSRC_r表示发布该接收报告的接收者(receiver)。源SSRC_n可通过记录收到该接收报告块的时间A,计算到SSRC_r 的往返传播延迟。它使用最后SR时间戳(last SR timestamp,LSR)字段计算总往返时间A-LSR,然后减去该字段,得出往返传播延迟为(A-LSR-DLSR)。下图举例说明了这一点。时间显示为32位字段的十六进制表示法和等效的浮点十进制表示法。
虽然有些链路的延迟很不对称,但这可以作为群集接收器距离(cluster receivers)的近似度量。
十一、RR: Receiver Report RTCP Packet
本段内容对应《RFC 3550》的第6.4.2节:
根据《RFC 3550》第35页,接收方报告(RR)数据包的格式与SR数据包的格式相同,只是数据包类型字段包含常量201,且省略了五个发送方信息(sender information)字段(这些是NTP和RTP时间戳以及发送方数据包和八进制数)。其余字段的含义与SR数据包相同。
当没有数据发送或接收报告时,必须在复合RTCP数据包的头部放置一个空RR数据包(RC = 0)。
十二、Extending the Sender and Receiver Reports
本段内容对应《RFC 3550》的第6.4.3节。根据《RFC 3550》第35页,如果需要定期报告有关发送方或接收方的其他信息,则配置文件应定义发送方报告和接收方报告的特定配置文件扩展(profile-specific extensions)。应优先使用这种方法,而不是定义另一种RTCP数据包类型,因为它所需的开销较少:
1.数据包中的八位字节较少(无RTCP头或SSRC字段);
2.扩展字段(extension fields)是发送方或接收方报告数据包中的第四部分,位于接收报告块(如有)之后的末尾。如果需要额外的发件人信息(additional sender information),那么对于发件人报告(sender reports),这些信息将首先包含在扩展部分,但对于收件人报告(receiver reports),这些信息将不会出现。如果要包含接收方信息,数据结构应为与现有接收报告块数组平行的块数组;也就是说,块数(the number of blocks)将由RC字段表示。
十三、Analyzing Sender and Receiver Reports
本段内容对应《RFC 3550》的第6.4.4节。根据《RFC 3550》第36页,预计接收质量反馈(reception quality feedback)不仅对发送方(sender)有用,而且对其他接收方(receivers)和第三方监测器(third-party monitors)也有用。发送方可根据反馈修改其传输;接收方可确定问题是局部的、区域性的还是全球性的;网络管理员(network managers)可使用只接收RTCP数据包而不接收相应RTP数据包的独立于配置文件的监控器(profile-independent monitors)来评估其网络的组播分发性能。
发送方信息(sender information)和接收方报告块(receiver report blocks)中都使用了累积计数(Cumulative counts),这样就可以计算任意两份报告之间的差值,从而对长短时间段进行测量,并提供防止丢失报告的复原力。最后收到的两份报告之间的差值可用来估计最近的分发质量。其中包含NTP时间戳(NTP timestamp),这样就可以根据两份报告之间的差值来计算速率(rates)。由于时间戳与数据编码的时钟速率无关,因此可以实现与编码和配置文件无关的质量监控器(quality monitors)。
一个计算实例是两次接收报告之间的数据包丢失率(packet loss rate)。累计丢包数的差值就是该时间间隔内的丢包数。最后收到的扩展序列号的差值给出了该时间间隔内的预期数据包数量。两者的比值就是该时间段内的数据包丢失率。如果两份报告是连续的,则该比率应等于丢失分数段,否则可能不相等。用丢失分数除以NTP时间戳的差值(以秒为单位),就可以得出每秒的丢失率。收到的数据包数是预期数据包数减去丢失的数据包数。预期数据包数也可用于判断任何损失估计的统计有效性。例如,5个数据包中丢失1个的重要性低于1000个数据包中丢失200个的重要性。
根据发送方信息,第三方监控器(third-party monitor)可计算出平均有效载荷数据速率(average payload data rate)和未接收数据的时间间隔内的平均数据包速率(average packet rate)。求出两者的比值,就得到了平均有效载荷大小(average payload size)。如果假定数据包丢失与数据包大小无关,那么特定接收器接收到的数据包数量乘以平均有效载荷大小(或相应的数据包大小)就得出了该接收器可用的表观吞吐量(apparent throughput)。
累积计数(cumulative counts)可利用不同报告之间的差异进行长期数据包丢失测量,除此之外,丢失分数字段(fraction lost field)还可通过单个报告进行短期测量。随着会话规模的扩大,可能无法为所有接收器保存接收状态信息,或者报告之间的间隔时间变长,某个特定接收器可能只收到一份报告,这一点就变得更加重要。
到达间抖动字段(interarrival jitter field)是衡量网络拥塞(network congestion)的第二个短期指标。数据包丢失跟踪(Packet loss tracks)的是持续性拥塞,而抖动测量跟踪(jitter measure tracks)的是瞬时性拥塞。抖动测量(jitter measure)可在导致数据包丢失之前显示拥塞情况。到达间抖动字段(interarrival jitter field)只是报告时抖动的一个快照,并不用于定量分析,而是用于比较一个接收器在一段时间内或多个接收器(如在一个网络内)在同一时间发出的多份报告。为便于比较不同接收器的抖动情况,所有接收器必须根据相同的公式计算抖动。
由于抖动计算(jitter calculation)基于RTP时间戳(RTP timestamp),而RTP时间戳代表数据包中第一个数据被采样的瞬间,因此采样瞬间与数据包传输时间之间延迟的任何变化都会影响计算出的抖动结果。这种延迟变化会出现在不同持续时间的音频数据包中。视频编码也会出现这种情况,因为一帧中所有数据包的时间戳都是相同的,但这些数据包并不是同时传输的。传输前的延迟变化确实会降低抖动计算本身作为网络行为测量的准确性,但考虑到接收器缓冲区必须容纳这种变化,将其包括在内是合适的。当使用抖动计算作为比较测量时,会减去传输前延迟变化造成的(常数)分量,这样就可以观察到网络抖动分量的变化,除非这种变化相对较小。如果变化较小,则可能无关紧要。
相关文章:
音视频入门基础:RTCP专题(3)——RTCP协议简介(中)
本文接着《音视频入门基础:RTCP专题(2)——RTCP协议简介(上)》,继续对RTCP协议进行简介。本文的一级标题从“九”开始。 九、Sender and Receiver Reports 本段内容对应《RFC 3550》的第6.4节。根据《RFC …...
嵌入式工程师多线程编程(二)生产者-消费者模式
生产者-消费者模式详解:多线程编程的核心范式 生产者-消费者模式(Producer-Consumer Pattern)是多线程编程中最经典的设计模式之一,它通过解耦生产者和消费者的工作流程,实现了线程间的高效协作与资源管理。本文将深入剖析这一模式的原理、实…...
秒杀系统的性能优化
秒杀任务总体QPS预期是每秒几十万,对tomcat、redis、JVM参数进行优化。 tomcat线程数 4核8G的机器,一般就是开200-300个工作线程,这是个经验值。每秒一个线程处理3-5个请求,200多个线程的QPS可以达到1000左右。线程不能太多&…...
MySQL学习笔记集--索引
索引 索引是数据库中用于提高查询效率的一种数据结构。 它类似于书籍的目录,通过索引可以快速定位到表中的特定行,而无需扫描整个表。 索引的类型 主键索引(Primary Key Index) 自动创建,用于唯一标识表中的每一行。…...
深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画
在前端开发中,CSS 动画是提升用户体验的重要手段,但很多开发者在使用动画时并不了解浏览器背后的渲染机制,导致动画卡顿甚至影响整体性能。本文将带你深入理解 CSS 中的两大核心概念 —— 重排(Reflow) 与 重绘&#x…...
Elasticsearch 从入门到实战:文档聚合操作及总结
四、文档操作:数据的增删改查 4.1 添加文档 文档(Document)是索引中的最小数据单元,使用 POST 或 PUT 添加: json POST /products/_doc/1 { "name": "华为Mate50 Pro", "price": 6…...
前缀和和差分笔记
前缀和和差分笔记 一维前缀和 示意图如下: 代码: **核心公式:sum[i]sum[i-1]a[i];(计算前缀和的)**#include<bits/stdc.h> using namespace std; const int N10000; #define ll long long int a[N],sum[N]; i…...
SSRF漏洞利用的小点总结和实战演练
含义理解: SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统。 攻击者通过篡改URL…...
IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化
全球领先的嵌入式系统开发软件解决方案供应商IAR正式发布全新云就绪平台,为嵌入式开发团队提供企业级的可扩展性、安全性和自动化能力。该平台于在德国纽伦堡举办的embedded world 2025展会上正式亮相,标志着将现代DevSecOps工作流集成到嵌入式软件开发中…...
瓦片数据合并方法
影像数据 假如有两份影像数据 1.全球底层影像0-5级别如下: 2.局部高清影像数据级别9-14如下: 合并方法 将9-14文件夹复制到全球底层0-5的目录下 如下: 然后合并xml文件 使得Tileset设置到最高级(包含所有级别)&…...
RISC-V AIA学习---IPI 处理器间中断
对于有多个hart的机器,必须为每个 hart 提供一个由具体实现定义的内存地址。向这个地址写入数据,就能向该 hart 发送一个机器级软件中断(主代码为 3)。换句话说,机器级的 IPI 可以通过这种方式,以机器级软件…...
Automattic 裁员16%,Matt Mullenweg称此举旨在提升盈利能力并增强投资实力
2025年4月3日,Automattic——这家以 WordPress.com、Tumblr 和 WooCommerce 等产品闻名的公司,宣布裁减其全球员工队伍的16%。这一决定是在周三通过公司博客文章和 Slack 内部消息向员工透露的。根据裁员前 Automattic 官网显示的员工人数(1,…...
图解AUTOSAR_SWS_FlexRayInterface
AUTOSAR FlexRay Interface 模块分析 本文档基于AUTOSAR SWS FlexRayInterface规范,对FlexRay Interface模块进行详细分析。 1. FlexRay Interface 模块架构 1.1 模块架构概览 1.2 架构说明 FlexRay Interface模块是AUTOSAR中的ECU抽象层组件,为上层模块提供统一的抽象接…...
AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析
我们之前做了做了几期的AIGIS的分享。我们今天要再次做一个分享。 AI赋能ArcGIS Pro——水系网络智能提取全解析 DeepSeek结合ArcGIS Pro制作一个批量建库的脚本工具(代码一字未改,直接运行) 看老外如何玩DeepSeek!15分钟快速创…...
STM32江科大----IIC
声明:本人跟随b站江科大学习,本文章是观看完视频后的一些个人总结和经验分享,也同时为了方便日后的复习,如果有错误请各位大佬指出,如果对你有帮助可以点个赞小小鼓励一下,本文章建议配合原视频使用❤️ 如…...
RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)
在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...
【leetcode hot 100 763】划分字母区间
解法一:用map记录<字母,字母出现的次数>,循环取出value-1,每次判断已经取出的字母(Set记录)是否还在后面存在(value>1),若存在继续循环,若不存在开启…...
PCB工艺:现代电子产品的核心制造技术
引言 PCB(Printed Circuit Board,印刷电路板)是电子设备的核心组成部分,几乎所有现代电子产品,从智能手机到航天设备,都依赖于PCB实现电路连接。PCB制造工艺的进步直接影响电子产品的性能、可靠性和成本。…...
【UE5 C++课程系列笔记】34——结构体与Json的相互转化
目录 准备工作 一、结构体转Json 二、Json转结构体 三、复杂结构体与Json的转换 主要通过借助FJsonObjectConverter类实现结构体和 JSON 之间的相互转换。 准备工作 首先新建一个结构体如下 添加两个方法分别用于将Struct转为Json、Json转为Struct 一、结构体转Json FStri…...
2025最新系统 Git 教程(二)
第2章 Git基础 2.1 Git 基础 - 获取 Git 仓库 如果你只想通过阅读一章来学习 Git,那么本章将是你的不二选择。 本章涵盖了你在使用 Git 完成各种工作时将会用到的各种基本命令。 在学习完本章之后,你应该能够配置并初始化一个仓库(reposito…...
力扣hot100_动态规划
动态规划 hot100_198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。…...
玄机-第六章-哥斯拉4.0流量分析的测试报告
目录 一、测试环境 二、测试目的 三、操作过程 Flag1 Flag2 Flag3 Flag4 Flag5 Flag6 Flag7 Flag8 Flag9 Flag10 Flag11 Flag12 Flag13 pam_unix.so关键代码 四、结论 一、测试环境 靶场介绍:国内厂商设置的玄机靶场,以应急响应题目著…...
【Hadoop入门】Hadoop生态圈概述:核心组件与应用场景概述
1 Hadoop生态圈概述 Hadoop生态圈是以 HDFS(分布式存储) 和 YARN(资源调度) 为核心,围绕大数据存储、计算、管理、分析等需求发展出的一系列开源工具集合。 核心特点: 模块化:各组件专注解决特定…...
深度学习实战电力设备缺陷检测
本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化,该数据集包含丰富的电力设备缺…...
随机产生4位随机码(java)
Random类: 用于生成随机数 import java.util.Random; 导入必要的类 generateVerificationCode()方法: 这是一个静态方法,可以直接通过类名调用 返回一个6位数字的字符串,首位不为0 生成首位数字: random.nextInt…...
音视频入门基础:RTCP专题(4)——RTCP协议简介(下)
本文接着《音视频入门基础:RTCP专题(3)——RTCP协议简介(中)》,继续对RTCP协议进行简介。本文的一级标题从“十四”开始。 十四、SDES: Source Description RTCP Packet 本段内容对应《RFC 3550》的第6.5节…...
PyCharm2024.3.5专业版解决Conda executable is not found问题
项目场景: pycharm使用anaconda 内的虚拟环境 pycharm 2024.3.5 专业版 C:\Users\Administrator>conda infoactive environment : transmute_recipe_generatoractive env location : D:\anaconda3\envs\transmute_recipe_generatorshell level : 1user config…...
滑动窗口思想 面试算法高频题
基本思想 滑动窗口思想其实就是快慢型的特例 计算机网络中滑动窗口协议(Sliding Window Protocol),该协议是TCP实现流量控制等的核心策略之一。事实上在与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度来思考问题࿰…...
Linux中特殊的变量
1.$# 含义:表示传入脚本或函数的参数数量。 用法:用于检查用户是否提供了足够的参数。 示例: #!/bin/bash echo "参数数量: $#"2.$? 含义:表示上一条命令的退出状态。如果命令成功执行,值为 0;…...
Linux文件系统与日志分析
目录 一.日志 1.1日志的定义 1.2日志的功能 1.3日志的分类 1.4日志的文件格式 1.5用户日志 1.6一些常见的日志 1.7日志消息的级别 二.系统日志管理 rsyslog 2.1rsyslog的定义 2.2rsyslog 配置文件 2.3rsyslog的实际应用----单独显示某一服务的日志 1.编辑rsyslog配…...
从传统物流到智能调度的全链路升级
一、TMS系统升级的核心目标与整体框架 (一)为什么要升级?传统物流管理的三大痛点 调度效率低下:过去依赖人工分单、手动匹配承运商,订单量大时容易出错,比如不同区域的订单混排导致运输路线绕路ÿ…...
UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题
【[metablriger] UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题】 UE5中如何修复后处理动画蓝图带来的自然状态下的metablriger身体绑定形变(如耸肩)问题...
STL_vector_01_基本用法
👋 Hi, I’m liubo👀 I’m interested in harmony🌱 I’m currently learning harmony💞️ I’m looking to collaborate on …📫 How to reach me …📇 sssssdsdsdsdsdsdasd🎃 dsdsdsdsdsddfsg…...
css2学习总结之尚品汇静态页面
css2总结之尚品汇 一、布局 在 PC 端网页中,一般都会有一个固定宽度且水平居中的盒子,来显示网页的主要内容,这是网页 的版心。 版心的宽度一般是 960 ~ 1200 像素之间。 版心可以是一个,也可以是多个。 二、布局相关名词 我…...
Lua 第5部分 表
表( Table )是 Lua 语言中最主要(事实上也是唯一的)和强大的数据结构。 使用表,Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。 Lua语言也使用表来表示包( package &am…...
01分数规划
https://ac.nowcoder.com/acm/contest/22353/1011 并不需要高级数据结构,对答案二分即可。 假定当前二分的答案为 x x x,则 ∑ v i ∑ w i ≥ x \frac{ \sum_{v_i} }{\sum_{w_i}} ≥ x ∑wi∑vi≥x 成立时 x x x 才可能是最后的答案。 化简式…...
无人机动力系统全维度解析:技术演进、选型策略与未来趋势
一、动力系统技术理念与设计逻辑 (一)核心技术指标 能量密度:决定续航能力的关键参数,单位为 Wh/kg。当前主流锂聚合物电池能量密度约 250-300Wh/kg,氢燃料电池可达 500-800Wh/kg,航空燃油则高达 12,000W…...
重新审视中国的GB标准(44495 – 44497)
此前,我们深入探讨了中国新推出的智能互联汽车(ICV)网络安全标准GB Standard 44495-2024。我们探讨了该标准对汽车制造商的影响、与UNECE R155和ISO/SAE 21434等全球标准的一致性,以及该标准对未来汽车网络安全的意义。 然而,GB 44495-2024并…...
Linux进程控制(五)之做一个简易的shell
文章目录 做一个简易的shell预备知识代码实现运行结果 做一个简易的shell 重谈Shell shell是操作系统的一层外壳程序,帮我们用户执行指令, 获取到指令后,交给操作系统,操作系统执行完后,把执行结果通过shell交给用户…...
Apache Kafka全栈技术解析
目录 第一章 Kafka概述与核心价值 1.1 消息队列的演进与Kafka的诞生 1.2 Kafka的核心应用场景 1.3 Kafka生态全景图 第二章 Kafka核心概念与架构解析 2.1 核心概念深度剖析 2.2 Kafka架构设计精要 第三章 Kafka环境搭建与配置 3.1 单机部署实战 3.2 集群部署最佳实践 …...
结合 Flink/Spark 进行 AI 大数据处理(实时数据 + AI 推理的应用场景)
随着企业对实时智能决策的需求日益增强,将 Flink / Spark 等流批计算框架 与 大模型推理能力相结合,正在成为 AI 工业化落地的重要实践路径。本篇文章将深入介绍如何将 AI 模型集成到大数据流处理系统中,实现实时感知、智能判断与自动反馈。 1. 为什么需要“实时数据 + AI 推…...
开发PDF时,如何比较 PDF 文件
在 PDF 论坛上,“如何比较 PDF 文件”是一个经常被提到的问题。在开始之前,重要的是要明确你想要比较的内容是什么。 不同的 PDF 文件可能看起来一样吗? 是的,可能。不同的 PDF 创建工具可能会生成在视觉上完全相同的页面&#x…...
自动提取pdf公式 ➕ 输出 LaTeX
# 创建打包脚本的主内容 script_content """ from doc2x.extract_formula import extract_formula_imgs from pix2text import Pix2Text from PIL import Image import osdef main():pdf_path "your_file.pdf" # 将你的PDF命名为 your_file.pdf 并…...
abaqus二次开发python程序集
abaqus二次开发python程序集 1、设置字体背景色等2、读取模态频率并写入 csv 文件3、在两个窗口快速对比各价模态 1、设置字体背景色等 # _*_ coding:UTF-8 _*_from abaqusConstants import* def fontsize(sessionNone):#设置字体session.viewports[Viewport: 1].viewportAnno…...
高级java每日一道面试题-2025年3月23日-微服务篇[Nacos篇]-如何使用Nacos进行服务发现?
如果有遗漏,评论区告诉我进行补充 面试官: 如何使用Nacos进行服务发现? 我回答: 在Java高级面试中讨论如何使用Nacos进行服务发现时,可以从多个角度深入探讨,包括基本概念、配置步骤、代码示例以及高级特性。以下是综合了多种信息的详细回…...
k8s核心资源对象一(入门到精通)
本文将深入探讨Kubernetes中的核心资源对象,包括Pod、Deployment、Service、Ingress、ConfigMap和Secret,详细解析其概念、功能以及实际应用场景,帮助读者全面掌握这些关键组件的使用方法。 一、pod 1 pod概念 k8s最小调度单元,…...
了解 DeepSeek R1
了解DeepSeek R1 R1探索纯强化学习是否可以在没有监督微调的情况下学会推理的能力。 ‘Aha’ Moment 这种现象有点类似于人类在解决问题时突然意识到的方式,以下是它的工作原理: 初始尝试:模型对解决问题进行初始尝试识别:识别…...
【C语言】大小端字节序和字节序判断
前言: 在上章介绍了整形在内存的储存,了解了原码,反码,补码,知道了整数在内存的储存一般是补码,解决了负数相加的问题。 那么在本章为大家讲解一下大小端字节序。 一那字节序是什么呢? 字节…...
DrissionPage移动端自动化:从H5到原生App的跨界测试
一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战: 设备碎片化:Android/iOS版本、屏幕分辨率差异 混合应用架构:H5页面与原生组件的深度耦合 交互复杂性:多点触控、手势操作、传感器模拟 性能监控:内存…...
ARM 汇编启动代码详解:从中断向量表到中断处理
ARM 汇编启动代码详解:从中断向量表到中断处理 引言 在嵌入式系统开发中,ARM 处理器(如 Cortex-A 系列)的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态(如关闭缓存和 MMU&a…...