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

音视频之H.265/HEVC速率控制

 H.265/HEVC系列文章:

1、音视频之H.265/HEVC编码框架及编码视频格式

2、音视频之H.265码流分析及解析

3、音视频之H.265/HEVC预测编码

4、音视频之H.265/HEVC变换编码

5、音视频之H.265/HEVC量化

6、音视频之H.265/HEVC环路后处理

7、音视频之H.265/HEVC熵编码

8、音视频之H.265/HEVC网络适配层

9、音视频之H.265/HEVC编解码并处理    

10、音视频之H.265/HEVC率失真优化

11、音视频之H.265/HEVC速率控制


        视频传输带宽通常都会受到一定限制,为了在满足信道带宽和传输时延限制的情况下有效传输视频数据,保证视频业务的播放质量,需要对视频编码过程进行速率控制。所谓速率控制,就是通过选择一系列编码参数,使得视频编码后的比特率满足所需要的速率限制,并且使得编码失真尽量小。速率控制属于率失真优化的范畴,速率控制算法的重点是确定与速率相关的量化参数(QuantizationParameter,QP)。

一、视频编码速率控制:

        1、速率控制的基本原理:

        音视频之H.265/HEVC率失真优化中剖析了视频编码的率失真特性,同一视频使用不同的编码参数将产生不同的编码速率和视频质量。因此,可以通过调节编码参数使得编码速率与目标速率一致,以达到速率控制的目的。在率失真优化准则下确定的编码参数中,视频编码速率主要与量化参数密切相关,并且遵循一定的规律。速率控制的主要工作是建立编码速率与量化参数的关系模型,根据目标码率确定视频编码参数中的量化参数。

        基于率失真优化知识,一个视频序列的速率控制问题可以描述为:在总编码比特数小于或等于R_{C}的条件下,为每一个编码单元确定最优的量化参数,使得总失真最小,即

        以图像作为编码单元为例,其中N为该序列包含的图像数,D_{i}为第i幅图像的失真,Q^{*} = (Q^{*}, ...,Q_{N}^{*})为各图像的最优量化参数。实际视频编码标准中拥有独立量化参数的最小单位通常是宏块(H.265/HEVC为CU),如果允许控制宏块级的量化参数,速率控制就需要确定所有宏块的最优量化参数。另外,对于变速率的情形,可能需要控制每个编码单元使其满足一定的编码比特限制,即

        其中,R_{j.c}为第i个编码单元的编码比特数限制。

        由于视频编码算法采用了大量的帧内、帧间预测技术,导致编码单元的率失真性能相互依赖,直接根据式(12-1)利用率失真优化技术确定编码单元的量化参数复杂度极高,因此,实际的速率控制方案通常会被分解为两个步骤:

  1. 考虑视频在空域、时域的相关性,根据总的目标比特数确定每个编码单元的最优目标比特数,这被称为比特分配;
  2. 依据编码速率与量化参数的关系模型,为每个编码单元根据其目标比特数独立确定其量化参数。

        比特分配的目的是为每个编码单元分配最优的目标比特数,使得视频编码后总的失真最小,即利用率失真优化技术为每个编码单元分配目标比特数,可以描述为

        由于各编码单元的率失真性能相互依赖,因此该步骤的关键是考虑各编码单元之间率失真性能的相关性,实现最优比特分配。

        当每个编码单元的目标比特数确定后,速率控制的第二个步骤即为根据每个编码单元的目标比特数独立确定其量化参数,可以描述为:

        由于编码单元的编码速率主要与量化参数相关,其他编码参数的影响较小,因此编码速率与量化参数有着较为确定的关系,可以基于这一关系直接根据编码单元的目标比特数确定其量化参数。

        这一环节需要强调的是,编码速率和量化参数的关系与视频的内容特性密切相关。图12.1给出了视频序列“BQSquare”采用HM10.0测试模型得到的编码速率(单位为bits),采用低时延模式,每一幅图像使用相同的量化参数32,GOP大小为4。从图12.1可以看出,在量化参数保持不变的情况下,编码速率随着编码时间的变化而变化。在第3~4秒之间,编码比特数迅速增加,这是由于视频序列发生了场景切换,时域复杂度较高;而在第4~7秒内,编码比特数呈下降趋势,这是由于这一段视频内容的时域和空域复杂度较低。一般来说,当量化参数一定时,视频序列空、时域复杂度越高,产生的编码比特数也越高;反之,则会产生较少的编码比特数,编码速率将会随着视频内容的变化而不断变化。

      

        2、缓冲机制:

           视频的编码速率与编码参数、编码结构、视频内容等诸多因素密切相关,速率控制算法通常无法保证实际编码速率与目标速率完全一致。为了减小二者之间的差别,通常会在编码器和传输信道间建立一个数据缓存区,称为“缓冲(buer)机制”,用于平滑编码速率和信道速率之间的差别。此外,缓冲区还可以容忍一定的速率波动,以避免编码速率与信道速率随时保持一致而引起的视频质量波动。

        图12.2给出了一个实际的视频传输系统,编码器输出的视频码流首先进入缓冲区,缓冲区中的数据以“先进先出”(FirstInFirst Out,FIFO)的原则按信道速率进行传输。与之对应,在解码器和信道间也通过缓冲区来调节信道速率与编码速率的差异。

        缓冲机制可以使编码速率更好地匹配信道速率,然而,它的存在不但会消耗一定的存储空间,而且会引入时延。一般来说,缓冲区越大,消耗的存储空间也越大,适应信道速率的能力越强,但也会导致解码时延增大。因此,在实际应用中,缓冲区的大小往往由允许的最大时延及运营成本决定。对于有限的缓冲区,在进行速率控制时需要避免缓冲区溢出。

        为了设计含有缓冲区的速率控制算法,通常将缓冲区的动态变化过程用流体流量模型来表示。令B_{c}(n)表示时刻的缓冲区充盈度,则n+1时刻的缓冲区充盈度为

        其中,A(n)表示n时刻的实际编码速率,u(n)为时刻的信道速率式(12-3)反映了缓冲区充盈度的动态变化,视频编码速率的流体流量控制模型如图 12.3所示。

        为了有效发挥缓冲区的作用,需要将缓冲区内的数据量维持在一定水平,以应对信道速率的变化以及编码速率与目标速率的匹配误差。使用缓冲区的视频编码速率控制的基本思想如下:如果实际编码速率比可用的信道带宽高,则多余的比特会在缓冲区中积累。当缓冲区中的比特数累积到一定高度时,速率控制算法会采取一定措施适量减小实际编码速率,以降低缓冲区充盈度;反之,当缓冲区充盈度低于一定程度时,速率控制算法会适量增加实际编码速率,使得缓冲区充盈度回升至一定水平。

        3、速率控制技术:

        视频编码中的速率控制过程如图12.4所示,首先为编码单元进行目标比特分配,即根据视频内容、缓冲区状态和信道带宽为编码单元分配恰当的目标比特数;进而为编码单元独立确定量化参数实现分配的目标比特,其关键是确定量化参数,因此这个环节称为量化参数确定。

        目标比特分配:

        视频编码标准中拥有独立量化参数的最小单元通常是宏块(H.265/HEVC为CU),即速率控制可以为每个宏块确定不同的量化参数。因此,实际的速率控制算法可以作用于不同的编码单元等级,如图像组(GOP)级、图像(Frame)级、片(Slice)级、宏块(Macroblock)级等,这主要取决于与目标速率的匹配精度需求和速率控制算法复杂度限制。如图像级速率控制为每幅图像确定一个量化参数,因此该图像所有宏块都采用这一量化参数,这将无法精确匹配目标速率以毫秒级变化的无线信道,并且无法反映出不同宏块内容所具有的不同率失真性能,进而影响编码效率,但图像级速率控制具有复杂度低的优点。

        对于宏块级速率控制,每个宏块拥有独立的量化参数,可以为视频提供更精细的速率控制。一个视频序列拥有大量的宏块,直接对宏块进行目标比特分配仍然过于复杂。因此,通常采用分级的方式来简化目标比特分配问题,依次可以是GOP级、图像级、宏块级,即首先为每个GOP确定目标比特数,其次根据每个GOP的目标比特数确定其中每一幅图像的目标比特数,最终确定每个宏块的目标比特数。

        如式(12-2),每个层级的比特分配都需要利用率失真优化技术为每个编码单元分配目标比特数,以达到最优的编码性能。对于率失真性能相对独立的编码单元,如GOP之间通常独立编码,不同编码单元的率失真性能主要与编码单元的内容特性相关。而对于率失真性能相互依赖的编码单元,如采用了帧间预测技术的各编码图像,则需要重点考虑编码单元率失真性能间的相互依赖关系。下面将以图像层为例讨论率失真性能相互依赖的编码单元的比特分配,以宏块层为例讨论率失真性能独立的编码单元的比特分配。

        1)图像层目标比特分配:

        图像层目标比特分配的重点是关注图像率失真性能间的相互依赖关系,因为参考图像的率失真性能直接影响当前图像的率失真性能。已知当前GOP的目标比特数R_{c},则图像层的目标比特分配问题可描述为

        其中,N为该GOP包含的图像数,D_{i}为第i幅图像的失真,R_{i}为第i幅图像的编码比特数,R_{T}^{*} = (R_{T_{i}}^{*},...,R_{T_{N}}^{*})为最佳比特分配方式。采用拉格朗日优化方法可以将其转换为无约束条件下的求极值问题:

        如式(12-6),第i幅图像的失真D_{i},不仅与该图像的编码比特数R_{i}有关,还与己编码图像的失真相关。但当已编码图像的失真确定后,D_{i}只与该图像的编码比特数R_{i}相关。\omega _{i}D_{i}包含了该图像对其他后续图像的影响。因此,

        然而,式(12-10)中的参数\alpha _{i},\omega _{i},\lambda分别与视频的内容、时域预测结构、总目标比特数相关,多变的视频内容以及复杂的编码算法使得实际中往往无法准确获得相关参数,通常并不直接使用式(12-10)确定每一幅图像的最优目标比特数。但对于固定的时域预测结构,内容特性稳定的视频,不同图像之间的最优目标比特数具有较为稳定的关系:

        再结合\sum_{i= l}^{N}R_{i} = R_{c}可以实现目标比特分配。因此,在实际速率控制中的目标比特分配环节,可以根据不同的时域预测结构为不同的图像分配不同的权重。需要注意的是,每幅图像的权重应与视频内容特性、时域预测结构以及总的目标比特数相关。 

        2)宏块层目标比特分配:

         对于宏块层的比特分配,采用帧内预测模式宏块的率失真性能与参考宏块的率失真性能关系密切;对于使用帧间预测模式的宏块,其运动信息也可由空域相邻宏块预测得到,但由于运动信息可以有多个选择,以至于使用帧间预测模式宏块的率失真性能受相邻宏块影响较小。因此,对于允许采用帧间预测的P图像,采用间模式的宏块占大多数,通常忽略宏块间率失真性能的依赖性进行比特分配。

        可以看出,每个宏块的目标比特数与视频内容直接相关,如背景区域待编码的残差较小,其分配的码率应较少;而细节和运动比较剧烈的区域待编码的残差较大,其分配的码率应较大。

        需要注意的是,实际编码单元的失真并不是加性的,视频序列的质量并不是所有图像质量的求和或求平均,图像的质量也不是所有宏块质量的求和或求平均。但是由于对人的视觉认知机制还不清楚,目前仍没有可以准确体现视频主观质量的客观测度。大量主观实验已经表明,空域、时域的质量波动容易影响视频序列的整体质量,视频时空域质量的一致性已经成为了衡量速率控制算法性能的一个重要方面。因此,在使用式(12-1)进行优化的过程中,需要考虑视频时空域的质量波动,通常的做法是将质量波动控制在一定范围内。

        量化参数确定:

        速率控制的第二个步骤是根据编码单元的目标比特数独立确定其量化参数。在基于块的混合视频编码框架下,编码速率主要取决于量化参数。因此,该步骤的关键是建立速率一量化参数(R-QP)模型,进而用其估计目标编码速率所对应的量化参数。下面将以二次R-QP模型为例分析其合理性,并简单介绍其他R-OP模型。

        1)二次模型:

        实验表明,采用早期视频编码标准得到的DCT系数服从拉普拉斯分布,其率失真函数为

        2)一阶线性模型:

        3)对数模型:

        4)指数模型:

        5)分段模型:

        根据变换系数服从方差为\sigma ^{2}的拉普拉斯分布,可以得到如下的分段模型。

        6)R-\lambda -QP模型

        7)R-\sigma -QP模型:

二、H.265/HEVC速率控制:

        速率控制是视频编码器中必备的关键模块,H.265/HEVC编码器同样需要相应的速率控制算法。与以前的视频编码标准相比,H.265/HEVC标准采用了大量的新编码技术,这使得以前标准所推荐的速率控制算法,如MPEG-2的 TM5、H.263的TMN8和 H.264/AVC的JVT-G012等不能直接用于H.265/HEVC。这主要是因为:时域预测技术使帧间的率失真性能关系复杂;新的帧内预测及运动信息的空间预测使得CTU间也具有复杂的率失真性能依赖关系;新的CABAC技术更好地利用了变换系数间的相关性,使得R-Q关系更加复杂。

        H.265/HEVC 的速率控制算法仍然可以采用传统的两步骤方式:目标比特分配和量化参数确定。

  • 目标比特分配的核心在于:考虑视频帧率失真间的相互依赖关系实现图像级的目标比特分配,考虑视频内容的CTU级目标比特分配。
  • 量化参数确定环节的核心在于:根据视频内容建立编码比特数与量化参数的关系模型。

        如前文所述,速率控制不属于H.265/HEVC 标准化的内容。但由于速率控制是视频编码器中必备的关键模块,因此随着H.265/HEVC标准关键技术的确定,相应的速率控制算法也不断出现。在2012年2月JCT-VC第8次会议上,提案H0213提出了基于R-Q模型的速率控制算法。Bin Li等以λ为纽带建立了R-λ与λ-QP 模型用于确定编码单元的量化参数,并于JCT-VC第11次会议中提出了K0103速率控制提案。与H0213相比,K0103提案速率控制更为精确,比特波动更小,因此该提案加入了HM9.0测试模型中并取得了良好的编码性能。在此基础上,提案 M0036对每个编码单元的比特分配权重进行了改进。

        JCTVC-K0103是H.265/HEVC测试模型HM10.0的速率控制算法,本节将对其进行详细介绍。该速率控制算法主要分为两个步骤:

  1. 根据目标码率为不同编码单元分配目标比特数;
  2. 根据 R与λ,λ与QP的关系模型确定不同编码单元的量化参数。

      1、目标比特分配:

        该目标比特分配算法仍采用分级策略(GOP级、图像级、CTU级)依次为不同编码单元分配目标比特。

        GOP级目标比特分配:

        视频序列在编码时通常被划分为多个连续的GOP,GOP通常采用固定的时域编码结构,是速率控制算法需要处理的最大编码单元。GOP级目标比特分配是指根据信道速率和缓冲区状态为每个GOP分配目标比特数。当前GOP的总目标比特数T_{G}

         图像级目标比特分配:

        

        CTU级目标比特分配:

        2、量化参数确定:

        实验表明,双曲函数能够很好地反映H.265/HEVC 视频码率和失真之间的关系:

        其中,C和K是与视频内容特性有关的模型参数。则拉格朗日优化因子λ为:

        其中,\alpha\beta与视频内容特性有关。另外,实验结果表明量化参数QP和\ln \lambda之间存在如下线性关系:

        因此,联合式(12-18)和式(12-19)就可以根据编码单元的目标比特数确定其量化参数。

        JCTVC-K0103 提案就采用了这一思路,量化参数确定过程具体可分为两个步骤:

  • 根据编码单元的目标比特数得到其对应的λ值:
  • 由λ和量化参数的关系确定每个编码单元的量化参数。下面详细介绍图像级、CTU 级量化参数的确定方法。

        图像级量化参数确定:

        

        CTU级量化参数确定:

参考资料:

                《新一代高效视频编码 H.265/HEVC 原理、标准与实现》——万帅 杨付正 编著

相关文章:

音视频之H.265/HEVC速率控制

H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...

jsmpeg+java+ffmpeg 调用摄像头RTSP流播放

原理就是这样&#xff0c;明白吧。本次用springboot netty起这个2个服务&#xff0c;执行拉代码执行即可 <!-- netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.68.Final</ver…...

深度剖析ZooKeeper

1. ZooKeeper架构总览 ZooKeeper 是一个分布式协调服务&#xff0c;广泛用于分布式系统中的配置管理、命名服务、分布式锁和领导选举等场景。以下是对 ZooKeeper 架构、通信机制、容错处理、数据一致性与可靠性等方面的详细剖析。 一、ZooKeeper 主从集群 ZooKeeper 采用 主从…...

Zookeeper 集群安装与脚本化管理详解

安装之前:先关闭所有服务器的防火墙&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; systemctl stop firewalld 关闭防火墙 systemctl disable firewalld 开机不启动防火…...

第10天-Python操作MySQL数据库全攻略:从基础连接到高级应用

一、环境准备 1. 安装MySQL驱动 bash 复制 下载 # 官方推荐驱动 pip install mysql-connector-python# 或使用PyMySQL(兼容性更好) pip install pymysql 2. 创建测试数据库 sql 复制 下载 CREATE DATABASE python_db; USE python_db;CREATE TABLE users (id INT AU…...

Spring Cloud Gateway深度解析:原理、架构与生产实践

文章目录 前言一、概述二、核心架构设计及设计原理2.1 分层架构模型网络层&#xff08;I/O模型&#xff09;核心处理层 2.2 核心组件协作流程路由定位阶段过滤器执行阶段 2.3 响应式编程模型实现Reactor上下文传递背压处理机制 2.4 动态路由设计原理2.5 异常处理体系2.6 关键路…...

Trae 04.22版本深度解析:Agent能力升级与MCP市场对复杂任务执行的革新

我正在参加Trae「超级体验官」创意实践征文&#xff0c;本文所使用的 Trae 免费下载链接&#xff1a;Trae - AI 原生 IDE 目录 引言 一、Trae 04.22版本概览 二、统一对话体验的深度整合 2.1 Chat与Builder面板合并 2.2 统一对话的优势 三、上下文能力的显著增强 3.1 W…...

股指期货模型,简单易懂的套利策略

在股指期货投资领域&#xff0c;有不少实用的模型和策略&#xff0c;今天咱们就用大白话来唠唠其中几个重要的概念。 一、跨期套利&#xff1a;合约间的“差价游戏” 跨期套利简单来说&#xff0c;就是投资者以赚取期货合约之间的价差为目的&#xff0c;在同一个期货品种的不…...

MySQL 故障排查与生产环境优化

目录 1. MySQL单实例故障排查 2. MySQL 主从故障排查 3. MySQL 优化 3.1 硬件方面 3.2 MySQL 配置文件 3.3 SQL 方面 1. MySQL单实例故障排查 &#xff08;1&#xff09; 故障现象1 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql…...

Java泛型 的详细知识总结

一、泛型的核心作用 类型安全&#xff1a;在编译期检查类型匹配&#xff0c;避免运行时的ClassCastException。代码复用&#xff1a;通过泛型逻辑统一处理多种数据类型。消除强制转换&#xff1a;减少显式的类型转换代码。 二、泛型基础语法 1. 泛型类/接口 定义&#xff1a…...

k8s 配置 Kafka SASL_SSL双重认证

说明 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&#xff0c;用于在客户端和服务器之间进行身份验证的过程&#xff0c;其中SASL/PLAIN是基于账号密码的认证方式。 SSL&#xff1a; 是一种加密协议&#xff0c;…...

电商虚拟户:重构资金管理逻辑,解锁高效归集与智能分账新范式

一、电商虚拟户的底层架构与核心价值 在数字经济浪潮下&#xff0c;电商交易的复杂性与日俱增&#xff0c;传统账户体系已难以满足平台企业对资金管理的精细化需求。电商虚拟户作为基于银行或持牌支付机构账户体系的创新解决方案&#xff0c;通过构建“主账户子账户”的虚拟账户…...

从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)

从混乱到高效&#xff1a;我们是如何重构 iOS 上架流程的 在开发团队中&#xff0c;有一类看不见却至关重要的问题&#xff1a;环境依赖。 特别是 iOS App 的发布流程&#xff0c;往往牢牢绑死在一台特定的 Mac 上。每次需要发版本&#xff0c;都要找到“那台 Mac”&#xff…...

01 基本介绍及Pod基础

01 查看各种资源 01-1 查看K8s集群的内置资源 [rootmaster01 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 …...

DAY31-文件的规范拆分和写法

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 &#xff08;一&#xff09;文件拆分 思考&#xff1a;如何把一个文件&#xff0c;拆分成多个具有着独立功能的文件&#xff0c;然后通过import的方式&#xff0c;来调用这些文件。这样具有几个…...

[创业之路-369]:企业战略管理案例分析-9-战略制定-差距分析的案例之华为

一、综合案例 在战略制定中&#xff0c;华为通过差距分析明确战略方向&#xff0c;以应对市场挑战和实现长期发展目标。 以下为具体案例与分析&#xff1a; 1、案例背景 华为在通信设备领域崛起过程中&#xff0c;始终将差距分析作为战略制定的核心环节。面对国际竞争对手&…...

【华为鸿蒙电脑】首款鸿蒙电脑发布:MateBook Fold 非凡大师 MateBook Pro,擎云星河计划启动

文章目录 前言一、HUAWEI MateBook Fold 非凡大师&#xff08;一&#xff09;非凡设计&#xff08;二&#xff09;非凡显示&#xff08;三&#xff09;非凡科技&#xff08;四&#xff09;非凡系统&#xff08;五&#xff09;非凡体验 二、HUAWEI MateBook Pro三、预热&#xf…...

深入理解Redis Cluster:架构、原理与实践

Redis 是一个高性能的键值存储数据库&#xff0c;广泛应用于缓存、会话存储、消息队列等场景。随着数据量和并发量的增长&#xff0c;单机 Redis 可能面临性能瓶颈和单点故障问题。为了解决这些问题&#xff0c;Redis 提供了 Redis Cluster&#xff0c;一种分布式解决方案&…...

分析 redis 的 exists 命令有一个参数和多个参数的区别

在 redis 中&#xff0c;exists 命令是用来查询某个或多个 key 是否存在的&#xff0c;返回存在的 key 的个数。 由于 redis 是按照键值对方式存储数据的&#xff0c;于是一个 key 只能对应一组数据&#xff0c;那么上述的 key 的个数指的即是需要查询的 key 中有几个 key 是存…...

[概率论基本概念1]什么是经验分布

一、说明 描述一个概率模型&#xff0c;有密度函数很好描述。如果写不出密度函数&#xff0c;退而用分布函数也能完整刻画&#xff0c;因此&#xff0c;分布函数表示比密度函数表示更加宽泛普适。本片讲述经验分布拟合分布函数的基础概念。 二、经验分布直观解释 在统计学中…...

使用Java实现Navicat密码的加密与解密

在日常开发过程中&#xff0c;我们有时需要处理各种软件保存的凭据信息&#xff0c;比如数据库连接密码等。这篇文章将介绍如何使用Java对Navicat保存的数据库密码进行加密和解密。 一、背景介绍 Navicat是一款强大的数据库管理工具&#xff0c;支持多种数据库系统。为了保护…...

怎么样进行定量分析

本文章将教会你如何对实验结果进行定量分析&#xff0c;其需要一定的论文基础&#xff0c;文末有论文撰写小技巧&#xff0c;不要看基础原理的人可以直接调到文章末尾。 一、什么是定量分析 定量分析是一种基于数据和数学模型的分析方法&#xff0c;它在众多领域中发挥着至关…...

python学习day2

今天主要学习了变量的数据类型&#xff0c;以及如何使用格式化符号进行输出。 一、认识数据类型 在python里为了应对不同的业务需求&#xff0c;也把数据分为不同的类型。 代码如下&#xff1a; """ 1、按类型将不同的变量存储在不同的类型数据 2、验证这些…...

FreeMarker

概述&#xff1a;FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c;是一款程序…...

JDK 21新特性详解

JDK 21新特性详解&#xff1a;现代Java开发的重大更新 Java开发工具包(JDK)21作为最新的长期支持(LTS)版本&#xff0c;于2023年9月发布&#xff0c;带来了许多令人兴奋的新特性。作为Java开发者&#xff0c;了解这些新功能对于保持技术竞争力至关重要。本文将详细介绍JDK 21中…...

使用MCP驱动IDA pro分析样本

最近国外的牛人开发了一个ida pro的mcp server&#xff0c;项目的地址为mrexodia/ida-pro-mcp: MCP Server for IDA Pro&#xff0c;实现了通过自然对话来分析样本。 今天我们试用一下。 MCP Server for IDA Pro项目简介 这个mcp server提供下面这些工具&#xff0c;基本涵盖…...

Web前端开发:@media(媒体查询)

什么是媒体查询&#xff1f; 媒体查询是CSS3的一个功能&#xff0c;允许你根据设备的特性&#xff08;如屏幕宽度、设备方向、分辨率等&#xff09;应用不同的CSS样式。简单来说&#xff0c;就是让网页在不同设备上&#xff08;手机、平板、电脑&#xff09;自动调整布局和样式…...

psotgresql18 源码编译安装

环境&#xff1a; 系统&#xff1a;centos7.9 数据库&#xff1a;postgresql18beta1 #PostgreSQL 18 已转向 DocBook XML 构建体系&#xff08;SGML 未来将被弃用&#xff09;。需要安装 XML 工具链&#xff0c;如下&#xff1a; yum install -y docbook5-style-xsl libxsl…...

如何在VSCode中更换默认浏览器:完整指南

引言 作为前端开发者&#xff0c;我们经常需要在VSCode中快速预览HTML文件。默认情况下&#xff0c;VSCode会使用系统默认浏览器打开文件&#xff0c;但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一&#xff1a;使用VSCo…...

Python Day26 学习

继续NumPy的学习 数组的索引 一维数组的索引 创建及输出 arr1d np.arange(10) # 数组: [0 1 2 3 4 5 6 7 8 9] arr1d array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 取出数组的第一个元素&#xff0c;最后一个元素 代码实现 arr1d[0] arr1d[-1] 取出数组中索引为3&#x…...

2025年PMP 学习二十一 14章 项目立项管理

2025年PMP 学习二十一 14章 项目立项管理 项目立项管理 项目建议 (Project Proposal)项目可行性分析 (Project Feasibility Analysis)项目审批 (Project Approval)项目招投标 (Project Tendering)项目合同谈判和签订 (Project Contract Negotiation and Signing) 文章目录 20…...

Ubuntu开机自启服务

一、准备启动脚本 在你的项目文件夹&#xff08;例如 /home/ubuntu/Plant_Diease_Recongnization_Server_1&#xff09;中创建一个启动脚本 run_ui_main.sh&#xff1a; #!/usr/bin/env bash # run_ui_main.sh&#xff1a;激活 yolov8 环境并启动 ui_main.py# 设置 Anaconda/…...

使用Docker部署React应用与Nginx

这个教程将帮助您使用Docker部署一个带有React的Nginx容器&#xff0c;并通过卷(volumes)将本地代码绑定到Docker容器中。这种设置非常适合开发环境&#xff0c;因为它允许您在本地编辑代码&#xff0c;而容器中的应用会自动更新。 步骤概述 创建Nginx配置文件创建Dockerfile…...

基于SpringBoot的小型民营加油站管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

Triton介绍和各平台支持情况分析

文章目录 &#x1f49e;Triton介绍&#x1f9e0; Triton 是什么&#xff1f;&#x1f50d; Triton 的核心特点&#x1f680; Triton 在 PyTorch 中的作用&#x1f4e6; Triton 的典型使用场景&#x1f9ea; 示例&#xff1a;Triton 编写的向量加法&#xff08;GPU 并行&#xf…...

HTTPS核心机制拆解

目录 引言 HTTPS和HTTP的区别 常见加密方式 数据摘要 数字证书与数据签名 HTTPS请求过程 结语 引言 HTTPS是什么&#xff1f;是一个应用层协议&#xff0c;在HTTP协议的基础上引入了一层加密层。为什么需要HTTPS&#xff1f;答案是显而易见的&#xff0c;要加密&#xf…...

我的食物信使女友

第一章&#xff1a;初识那是一个普通的周三下午&#xff0c;阳光透过咖啡馆的玻璃窗洒在木质的桌子上&#xff0c;空气中弥漫着咖啡的香气和轻柔的爵士乐。我坐在角落的一个位置&#xff0c;手中捧着一本已经翻了几十页的小说&#xff0c;但心思却完全不在文字上。我的生活就像…...

【D1,2】 贪心算法刷题

文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1&#xff0c;因为如果有障碍物&#xff0c;后面的都不能到达 也不能整列初始化为0&#xff0c;因为状态转移的时候第一行第一列都没有检查&#xff0c;因此不能部分初始化 整数拆分 需要考虑几种情况…...

C++多态的详细讲解

【本节目标】 1. 多态的概念 2. 多态的定义及实现 3. 抽象类 4. 多态的原理 5. 单继承和多继承关系中的虚函数表 前言 需要声明的&#xff0c;本博客中的代码及解释都是在 vs2013 下的 x86 程序中&#xff0c;涉及的指针都是 4bytes 。 如果要其他平台下&#xff0c;部…...

UE5在Blueprint中判断不同平台

在Unreal Engine 5的蓝图中&#xff0c;可以通过以下方法判断当前运行的平台&#xff08;如Android、Windows、iOS等&#xff09;&#xff0c;并根据平台执行不同的逻辑&#xff1a; 方法1&#xff1a;使用 Get Platform Name 节点 步骤&#xff1a; 在蓝图图表中右键点击&am…...

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量&#xff08;如单卡 24GB&#xff09;&#xff0c;Ollama 不会自动启用多卡 在run…...

MAC电脑中右键后复制和拷贝的区别

在Mac电脑中&#xff0c;右键菜单中的“复制”和“拷贝”操作在功能上有所不同&#xff1a; 复制 功能&#xff1a;在选定的位置创建一个与原始文件相同的副本。快捷键&#xff1a;CommandD用于在当前位置快速复制文件&#xff0c;CommandC用于将内容复制到剪贴板。效果&…...

打卡第二十二天

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-SNE降维 还有一些其他的降维方式&#xff0c;也就是最重要的词向量的加工&#xff0c;我们未来再说。 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让AI给你出…...

【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、InputSystem配置二、GameInput 游戏输入脚本1.实现思路2.完整代码三、Player 游戏人物移动脚本1.实现思路2.完整代码四、场景脚本设置1.组件设置五、问题解决1.人物一直下落2.人物跳跃时,…...

Python实现的在线词典学习工具

Python实现的在线词典学习工具 源码最初来自网络&#xff0c;根据实际情况进行了修改。 主要功能&#xff1a; 单词查询 通过Bing词典在线获取单词释义&#xff08;正则提取网页meta描述&#xff09;&#xff0c;支持回车键快速查询 内置网络请求重试和异常处理机制 在线网页…...

软考 系统架构设计师系列知识点之杂项集萃(63)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;62&#xff09; 第102题 以下关于系统性能评估方法的描述&#xff0c;错误的是&#xff08;&#xff09;。 A. 指令执行速度法常用每秒百万次指令运算&#xff08;MIPS&#xff09;评估系统性能…...

python重庆旅游系统-旅游攻略

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

如何使用GIT管理项目代码

介绍 ​ Git是目前世界上最流行甚至最好的开源分布式版本控制系统&#xff0c;不论是很小的项目还是很大的项目&#xff0c;它都能有效并且高效的处理项目版本管理&#xff0c;初衷是为了帮助管理linux内核代码而开发的一个开放源码的版本控制软件。 GIT常用分支名称 分支分…...

Android 11.0 动画缩放默认值改为0.5的功能实现

1.前言 在11.0的系统rom定制化开发中,在关于设置动画的时候,系统有相关参数要求,设置默认的 动画缩放默认值等功能,来实现相关功能,接下来分析下相关的动画默认缩放值的设置功能实现 2.动画缩放默认值改为0.5的功能实现的核心类 frameworks/base/packages/SettingsProv…...

第35周Zookkeeper+Dubbo 面试题精讲

面试题精讲 一、算法面试答题思路 理解思路的重要性:算法面试比基础面试更复杂,需先想清楚思路,与面试官沟通确认题目条件(如数据范围、是否包含负数/零等),这有助于理清解题思路并展示技术实力。变量命名清晰:算法中变量命名要明确含义和范围,避免使用模糊的变量名,…...