【ffmpeg】SPS与PPS的概念
PPS(Picture Parameter Set)详解
PPS(图像参数集)是H.264/H.265视频编码标准中的关键数据结构,与SPS(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是全面解析:
1. PPS 是什么?
- 定义:
PPS(Picture Parameter Set)是H.264/H.265码流中的一种参数集,存储单帧图像的解码参数(如熵编码模式、分片信息等)。 - 作用:
- 为解码器提供解码单帧所需的配置信息。
- 与SPS(序列参数集)配合,减少码流冗余(多个帧可共享同一PPS)。
2. PPS 与 SPS 的关系
参数集 | 名称 | 作用范围 | 内容示例 |
---|---|---|---|
SPS | 序列参数集 | 整个视频序列 | 分辨率、帧率、Profile/Level |
PPS | 图像参数集 | 单帧或一组帧 | 熵编码模式、分片数量、QP偏移量 |
PPS中包含的解码关键参数:
-
熵编码模式
entropy_coding_mode_flag
:0
:使用CAVLC(简单场景)。1
:使用CABAC(高效压缩,但计算复杂)。
-
分片(Slice)控制
num_slice_groups_minus1
:分片组数量(通常为0,表示不分片)。slice_group_map_type
:分片组的映射方式。
-
量化参数(QP)
pic_init_qp_minus26
:初始QP值(影响图像质量与码率)。chroma_qp_index_offset
:色度分量的QP偏移量。
-
去块滤波(Deblocking Filter)
deblocking_filter_control_present_flag
:是否启用去块滤波。
3. PPS 在码流中的位置
-
存储位置:
- 通常位于视频文件的头部(如MP4的
moov
盒子中)。 - 在直播或流媒体中,可能周期性重复插入(防止丢包导致无法解码)。
- 通常位于视频文件的头部(如MP4的
-
查看方法:
使用ffprobe
提取H.264/H.265的PPS信息:ffprobe -v error -show_data -show_packets -select_streams v test.h264 | grep "PPS"
4. 为什么PPS很重要?
(1) 解码依赖
- 解码器必须获取PPS才能正确解析帧数据。若丢失PPS,会导致花屏或解码失败。
- 示例:
直播中若丢失PPS包,后续视频帧可能无法解码,直到收到新的PPS。
(2) 码流优化
- 通过调整PPS参数(如QP值),可平衡视频质量与压缩率。
- 动态PPS:
某些编码器允许在视频中动态更新PPS(适应场景变化)。
(3) 容错性
- 在H.264的
Baseline Profile
中,PPS/SPS需频繁重复发送,提升抗丢包能力。
SPS(Sequence Parameter Set)详解
SPS(序列参数集)是H.264/H.265视频编码标准中的核心元数据,存储视频流的全局解码参数,是解码器正确解析视频的基础。以下是深度解析:
1. SPS的作用
- 定义视频流的全局属性
包括分辨率、帧率、编码档次(Profile)、级别(Level)等。 - 提供解码器的初始化配置
解码器必须先读取SPS,才能正确解析后续的PPS和视频帧数据。 - 与PPS协同工作
SPS(全局参数) + PPS(帧级参数) = 完整的解码配置。
2. SPS包含的关键参数
参数 | 说明 |
---|---|
profile_idc | 编码档次(如Baseline、Main、High Profile),决定支持的编码工具。 |
level_idc | 级别(如3.1、4.0),限制最大分辨率、帧率和码率。 |
pic_width/height | 视频分辨率(需通过计算得出,见下文)。 |
log2_max_frame_num | 帧编号的最大比特数,影响GOP(关键帧间隔)长度。 |
chroma_format | 色度采样格式(如4:2:0、4:4:4)。 |
bit_depth | 像素位深(8bit、10bit)。 |
vui_parameters | 视频可用性信息(如帧率、色彩空间、宽高比)。 |
3. 如何从SPS计算分辨率?
SPS中的分辨率通过以下参数间接表示:
width = (pic_width_in_mbs_minus1 + 1) * 16;
height = (pic_height_in_map_units_minus1 + 1) * 16 * (2 - frame_mbs_only_flag);
- 示例:
若pic_width_in_mbs_minus1=44
,则宽度为(44+1)*16 = 720
。
4. SPS在码流中的位置
-
存储位置
- 文件格式(如MP4):存储在
moov
盒子的avcC
/hvcC
中。 - 裸流(H.264 Annex B):以NALU单元形式存在,NALU类型为7(H.264)或33(H.265)。
- 文件格式(如MP4):存储在
-
查看方法
使用FFmpeg提取SPS:ffmpeg -i input.mp4 -c:v copy -bsf:v trace_headers -f h264 - 2>&1 | grep "SPS"
5. SPS与PPS的关系
特性 | SPS | PPS |
---|---|---|
作用范围 | 整个视频序列 | 单帧或一组帧 |
主要内容 | 分辨率、Profile/Level | 熵编码模式、QP值、分片信息 |
NALU类型 | 7(H.264)、33(H.265) | 8(H.264)、34(H.265) |
依赖关系 | PPS引用SPS(通过pps_id ) | 帧数据引用PPS |
PPS与SPS的组织
PPS(Picture Parameter Set)和SPS(Sequence Parameter Set)在H.264/H.265视频码流中通过严格的二进制语法结构存储,其物理组织分为 逻辑结构 和 存储格式 两部分。
1. 逻辑结构:NALU单元
PPS和SPS在码流中以 NALU(Network Abstraction Layer Unit) 的形式存在,每个NALU包含独立的参数集数据。
组件 | 说明 |
---|---|
NALU Header | 1字节,包含类型标识(NALU Type)和其他控制位。 |
NALU Payload | 存储PPS/SPS的实际参数数据,采用 指数哥伦布编码(Exp-Golomb)。 |
- NALU类型标识:
- H.264:SPS=7,PPS=8
- H.265:VPS=32,SPS=33,PPS=34
2. 存储格式
(1) Annex B格式(裸流)
常见于.h264
/.h265
裸流文件或直播流,通过 起始码(Start Code) 分隔NALU:
0x00000001 [NALU Header] [Payload] // SPS
0x00000001 [NALU Header] [Payload] // PPS
0x00000001 [NALU Header] [Payload] // 视频帧数据
- 起始码:
0x00000001
(4字节)或0x000001
(3字节)。
(2) AVCC格式(MP4容器)
MP4等容器将PPS/SPS存储在 avcC
(H.264)或hvcC
(H.265)盒子 中,结构如下:
moov
├── trak
│ └── mdia
│ └── minf
│ └── stbl
│ └── avcC (Box)
│ ├── configurationVersion (1字节)
│ ├── AVCProfileIndication (1字节, Profile)
│ ├── profile_compatibility (1字节)
│ ├── AVCLevelIndication (1字节, Level)
│ ├── lengthSizeMinusOne (1字节, NALU长度字段大小)
│ ├── numOfSPS (1字节, SPS数量)
│ ├── SPS数据 (变长)
│ ├── numOfPPS (1字节, PPS数量)
│ └── PPS数据 (变长)
- SPS/PPS数据:以长度前缀(通常2字节) + NALU Payload形式存储,无起始码。
3. PPS/SPS的二进制语法
以H.264的SPS为例,其Payload按以下顺序组织(部分字段):
profile_idc (8bit) → constraint_flags (3bit) → level_idc (8bit) → seq_parameter_set_id (Exp-Golomb)
→ log2_max_frame_num_minus4 (Exp-Golomb) → pic_order_cnt_type (Exp-Golomb)
→ num_ref_frames (Exp-Golomb) → gaps_in_frame_num_value_allowed_flag (1bit)
→ pic_width_in_mbs_minus1 (Exp-Golomb) → pic_height_in_map_units_minus1 (Exp-Golomb)
→ frame_mbs_only_flag (1bit) → direct_8x8_inference_flag (1bit)
→ frame_cropping_flag (1bit) → vui_parameters_present_flag (1bit) → ...
- Exp-Golomb编码:用于压缩变长整数(如
pic_width_in_mbs_minus1
)。
4. PPS/SPS的引用关系
-
层级依赖:
- 每个PPS通过
seq_parameter_set_id
关联到对应的SPS。 - 每个视频Slice通过
pic_parameter_set_id
关联到PPS。
- 每个PPS通过
-
多组PPS/SPS:
一个视频流可能包含多组PPS/SPS(例如动态调整QP参数),通过ID区分。
5. 工具验证
(1) 提取NALU
ffmpeg -i input.mp4 -c:v copy -bsf:v trace_headers -f h264 - 2>&1 | grep -A 10 "SPS\|PPS"
(2) 解析二进制内容
使用h264_analyzer
或Elecard StreamEye
工具可视化参数:
SPS NALU:profile_idc: 100 (High)level_idc: 31 (3.1)pic_width_in_mbs: 45 → 720x1280chroma_format_idc: 1 (4:2:0)
在RTSP视频流中,PPS(Picture Parameter Set)和SPS(Sequence Parameter Set)的组织方式直接影响视频流的解码和播放。以下是RTSP流中PPS/SPS的详细组织方式和传输机制:
rtsp视频流的组织
1. RTSP流中PPS/SPS的传输方式
RTSP(Real-Time Streaming Protocol)通常通过RTP(Real-time Transport Protocol)封装H.264/H.265视频流。PPS和SPS的传输分为两种模式:
(1) 内联模式(In-Band)
- 特点:PPS/SPS与视频帧数据混合在RTP包中传输。
- 触发条件:
- 首次连接时发送。
- 关键帧(IDR帧)前必须附带PPS/SPS。
- 动态参数变更时(如分辨率调整)。
- RTP包类型:
- SPS:NALU类型=7(H.264)或33(H.265)。
- PPS:NALU类型=8(H.264)或34(H.265)。
(2) 外联模式(Out-of-Band)
- 特点:通过SDP(Session Description Protocol)在RTSP的
DESCRIBE
响应中传递PPS/SPS。 - SDP示例:
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
sprop-parameter-sets
:Base64编码的SPS(第一个参数)和PPS(第二个参数)。packetization-mode=1
:表示使用分片传输模式(需内联PPS/SPS)。
2. RTP封装的PPS/SPS格式
(1) 单NALU模式(Packetization Mode 0)
- 规则:每个RTP包仅包含一个完整的NALU(包括PPS/SPS)。
- 示例:
RTP Header | NALU Header (0x67) | SPS Payload RTP Header | NALU Header (0x68) | PPS Payload
(2) 分片模式(Packetization Mode 1)
- 规则:PPS/SPS作为独立的NALU发送,视频帧可能分片。
- 要求:
- 关键帧前必须发送PPS/SPS(通常组合为一个RTP包)。
- 使用**STAP-A(Single-Time Aggregation Packet)**封装多个NALU:
RTP Header | STAP-A Header (0x78) | NALU1 Size | NALU1 (SPS) | NALU2 Size | NALU2 (PPS)
(3) 关键帧前的PPS/SPS
- 标准做法:在IDR帧前发送
SPS + PPS + IDR
的组合包:[RTP Packet 1]: SPS [RTP Packet 2]: PPS [RTP Packet 3]: IDR Frame (分片)
3. 实际抓包分析
通过Wireshark捕获RTSP流,可以看到PPS/SPS的传输逻辑:
- RTSP DESCRIBE响应:SDP中携带Base64编码的PPS/SPS。
- RTP流:
- 首个视频包为SPS(NALU类型7)。
- 第二个包为PPS(NALU类型8)。
- 后续为视频帧数据(分片或完整NALU)。
4. 常见问题与解决
(1) 播放器报错"No SPS/PPS"
- 原因:RTSP流未正确发送或SDP未包含PPS/SPS。
- 解决:
- 检查服务器配置,确保关键帧前发送PPS/SPS。
- 在SDP中强制声明参数集:
a=fmtp:96 sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
(2) 动态分辨率切换
- 处理:分辨率变化时,需重新发送新的SPS/PPS。
- 实现:通过RTSP的
SET_PARAMETER
请求通知客户端参数更新。
5. 代码示例(FFmpeg推流)
使用FFmpeg推送带PPS/SPS的RTSP流:
ffmpeg -re -i input.mp4 -c:v copy -f rtsp -rtsp_transport tcp rtsp://server/live.stream
-c:v copy
:保留原始SPS/PPS。-rtsp_transport tcp
:确保参数集可靠传输。
6. 总结
关键点 | RTSP中的实现方式 |
---|---|
首次传输 | 通过SDP(Out-of-Band)或首个RTP包(In-Band)发送。 |
关键帧关联 | 每个IDR帧前必须附带PPS/SPS。 |
封装格式 | 单NALU、STAP-A或分片模式,依赖packetization-mode 。 |
动态更新 | 通过SDP或新的RTP包组通知客户端。 |
容错要求 | 需周期性重复发送(尤其直播场景),避免新观众无法解码。 |
如果需要验证具体流的PPS/SPS组织,可通过Wireshark抓包或FFmpeg日志分析:
ffmpeg -i rtsp://server/stream -c:v copy -bsf:v trace_headers -f null - 2>&1 | Select-String "SPS\|PPS"
Wireshark抓包分析
1.过滤 RTSP/RTP 流量
-
基础过滤语法:
rtsp || rtp || udp.port == 554
rtsp
:过滤 RTSP 控制协议(如 DESCRIBE/SETUP/PLAY)。rtp
:过滤 RTP 媒体流。udp.port == 554
:RTSP 默认端口(TCP/UDP 554)。
-
精确过滤(按流地址):
ip.addr == 192.168.1.100 && (rtsp || rtp)
触发视频流
- 在播放器或设备中发起 RTSP 连接(如
rtsp://192.168.1.100/live
)。
2. 定位 PPS/SPS
(1) 通过 SDP 获取(DESCRIBE 响应)
- 查找 RTSP
DESCRIBE
请求的响应包(200 OK
)。 - 展开报文中的 SDP 部分,定位
sprop-parameter-sets
:a=fmtp:96 sprop-parameter-sets=Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ,aO48sA==;
- Base64 解码:
- 第一个参数是 SPS(
Z2QAH6zZQFAFuhAAAAMAEAAAAwPI8YMQ
)。 - 第二个参数是 PPS(
aO48sA==
)。
- 第一个参数是 SPS(
- Base64 解码:
(2) 通过 RTP 包获取
- 过滤 RTP 包:
rtp && rtp.payloadtype == 96 // 96 是常见的动态负载类型
- 查找 NALU 类型:
- SPS:RTP 负载首字节
0x67
(H.264)或0x42 0x01
(H.265 SPS,NALU 类型=33)。 - PPS:RTP 负载首字节
0x68
(H.264)或0x42 0x02
(H.265 PPS,NALU 类型=34)。
- SPS:RTP 负载首字节
- 关键帧前必带 PPS/SPS:
- 在 IDR 帧(关键帧)前的 RTP 包中,通常会连续出现 SPS → PPS → IDR。
4. 分析示例
(1) Wireshark 中的关键字段
- RTP 头:
Payload Type
:96(动态负载类型)。Sequence Number
:检查丢包。Timestamp
:同步音视频。
- RTP 负载:
- NALU 头:首字节的低 5 位表示类型(如 7=SPS,8=PPS)。
- 负载数据:SPS/PPS 的二进制参数。
(2) 十六进制解析
右键点击 RTP 包 → “Show Packet Bytes” → 查看负载部分:
67 64 00 1E AC D9 40 ... // SPS (0x67)
68 E9 7B 1C ... // PPS (0x68)
65 88 80 ... // IDR Frame (0x65)
5. 高级技巧
(1) 解码参数集
- 使用
h264_parse
工具(FFmpeg 内置)解析 SPS/PPS:ffmpeg -hide_banner -i input.h264 -c:v copy -bsf:v trace_headers -f null - 2>&1 | grep -A 10 "SPS\|PPS"
(2) 过滤关键帧
- 查找 IDR 帧(NALU 类型=5):
rtp.payload[0] & 0x1F == 5 // H.264 IDR
(3) 保存特定流
- 右键点击目标 RTP 流 → “Decode As” → 选择 RTP → 导出为
.pcap
文件。
6. 常见问题
(1) 抓不到 RTP 包
- 原因:可能走了 TCP 传输(如 RTSP over TCP)。
- 解决:过滤 TCP 流量:
tcp.port == 554 || tcp.payload contains "RTP/AVP"
(2) SPS/PPS 不完整
- 解决:检查是否在 IDR 帧前发送,或通过 SDP 补充。
7. 总结
步骤 | 操作 |
---|---|
1. 抓包 | 选择网卡 → 开始捕获 → 过滤 `rtsp |
2. 定位 PPS/SPS | 通过 SDP 或 RTP 包(NALU 类型 7/8)。 |
3. 分析关键帧 | 确认 IDR 帧前是否有 SPS → PPS → IDR 的顺序。 |
4. 调试工具 | Wireshark 十六进制视图 + FFmpeg 解析。 |
通过此方法,可以精准捕获并验证 RTSP 流中 PPS/SPS 的组织方式,确保解码器能正确初始化。
相关文章:
【ffmpeg】SPS与PPS的概念
PPS(Picture Parameter Set)详解 PPS(图像参数集)是H.264/H.265视频编码标准中的关键数据结构,与SPS(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是…...

uniapp vue 开发微信小程序 分包梳理经验总结
嗨,我是小路。今天主要和大家分享的主题是“uniapp vue 开发微信小程序 分包梳理经验总结”。 在使用 UniAppvue框架开发微信小程序时,当项目比较大的时候,经常需要分包加载。它有助于控制主包的大小,从而提升小程序的启…...

什么是VR展示?VR展示的用途
随着科技的迅猛发展,我们步入一个全新的数字时代。在这个时代,虚拟现实(VR)技术崭露头角,逐步改变我们对世界的认知。全景展示厅作为VR技术与传统展览艺术的完美结合,以独特的全景视角,引领我们…...

.NET外挂系列:4. harmony 中补丁参数的有趣玩法(上)
一:背景 1. 讲故事 前面几篇我们说完了 harmony 的几个注入点,这篇我们聚焦注入点可接收的几类参数的解读,非常有意思,在.NET高级调试 视角下也是非常重要的,到底是哪些参数,用一张表格整理如下ÿ…...

Go语言中new与make的深度解析
在 Go 语言中,new 和 make 是两个用于内存分配的内置函数,但它们的作用和使用场景有显著区别。 理解它们的核心在于: new(T): 为类型 T 分配内存,并将其初始化为零值,然后返回一个指向该内存的指针 (*T)。make(T, ar…...

3、ubantu系统 | 通过vscode远程安装并配置anaconda
1、vscode登录 登录后通过pwd可以发现目前位于wangqinag账号下,左侧为属于该账号的文件夹及文件。 通过cd ..可以回到上一级目录,通过ls可以查看当前目录下的文件夹及文件。 2、安装 2.1、下载anaconda 通过wget和curl下载未成功,使用手动…...

【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…...
深度学习之用CelebA_Spoof数据集搭建一个活体检测-用MNN来推理时候如何利用Conan对软件包进行管理
我为什么用Conan 前面的文章:深度学习之用CelebA_Spoof数据集搭建一个活体检测-训练好的模型用MNN来推理有提到怎么使用MNN对训练好的模型进行推理,里面并没有提到我是怎么编译和进行代码依赖包的管理的详细步骤,在这里我是用的是Conan:一个C/C++包管理器,可以管理项目依赖…...
React 常见的陷阱之(如异步访问事件对象)
文章目录 前言1. 异步访问事件对象问题解决方案 2. 事件传播的误解**问题**解决方案 **3. 事件监听器未正确卸载****问题****解决方案** **4. 动态列表中的事件绑定****问题****解决方案** **5. 第三方库与 React 事件冲突****问题****解决方案** **6. 表单输入与受控组件****问…...

Swagger在java的运用
Swagger 是一个广泛使用的工具,用于设计、构建、记录和使用 RESTful Web 服务。它通过提供交互式的 API 文档、客户端 SDK 生成和 API 发现功能,极大地简化了 API 的开发和使用过程。以下是对 Swagger 的详细介绍,包括它的功能、使用场景、如…...

代码随想录算法训练营 Day49 图论Ⅰ 深度优先与广度优先
图论 基础 图的概念 图的概念 概念清单有向图 (a)无向图 (b)有向/无向如图 a 所示每条边有指向如图 b 所示每条边没有箭头指向权值每条边的权值每条边的权值度-有几条边连到该节点 (eg V 2 V_2 V2 度为 3)入度/出度出度:从该节点出发的边个数入度:…...

.NET外挂系列:1. harmony 基本原理和骨架分析
一:背景 1. 讲故事 为什么要开这么一个系列,是因为他可以对 .NET SDK 中的方法进行外挂,这种技术对解决程序的一些疑难杂症特别有用,在.NET高级调试 领域下大显神威,在我的训练营里也是花了一些篇幅来说这个…...

HarmonyOS NEXT端云一体化工程目录结构
视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 端云一体化开发工程由端开发工程(Application)和云开发工程(CloudProgram)两大核心模块构成。 1)端开发工程目录结构 端开发工程主要用于开发应用端侧的业务代码,通用云开发模板的端开发工程目录结构如下图所示: …...

Ajax研究
简介 AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用…...

学习 Android(十)Fragment的生命周期
简介 Android 的 Fragment 是一个具有自己生命周期的 可重用 UI 组件,能够在运行时灵活地添加、移除和替换,从而支持单 Activity 多界面、动态布局和响应式设计。掌握 Fragment 的生命周期有助于正确地在各个阶段执行初始化、资源绑定、状态保存与释放操…...
flutter 常用组件详细介绍、屏幕适配方案
一、常用组件 1.基础组件 组件说明示例Text显示文本Text(‘Hello Flutter’, style: TextStyle(fontSize: 20))Image显示图片Image.network(‘https://example.com/image.jpg’)Icon显示图标Icon(Icons.home, size: 30, color: Colors.blue)RaisedButton / ElevatedButton按钮…...
Elasticsearch生产环境性能调优指南
#作者:朱雷 文章目录 一、背景二、优化项2.1. 磁盘优化2.2.配置文件优化2.3. jvm 配置2.4. 关闭或禁用 swap2.5. 最大文件描述符2.6. 段合并流量设置2.7. thread_pool相关 三、总结 一、背景 Elasticsearch是基于Lucene的开源分布式搜索与分析引擎,支持…...
野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(一)conda环境搭建
先安装miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh chmod x Miniconda3-latest-Linux-aarch64.sh bash Miniconda3-latest-Linux-aarch64.sh source ~/.bashrc conda --version按照MobileFaceNet的github官方指南,需要…...

RT Thread FinSH(msh)调度逻辑
文章目录 概要FinSH功能FinSH调度逻辑细节小结 概要 RT-Thread(Real-Time Thread)作为一款开源的嵌入式实时操作系统,在嵌入式设备领域得到了广泛应用。 该系统不仅具备强大的任务调度功能,还集成了 FinSH命令行系统,…...
Kotlin 极简小抄 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)
Kotlin 概述 Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可…...
CSS display有几种属性值
在 CSS 中,display 属性是控制元素布局和渲染方式的核心属性之一。它有多种属性值,每个值都决定了元素在文档流中的表现形式。以下是 display 的主要属性值分类及说明: 1. 块级和行内布局 块级元素 (block) 特性:独占一行&…...
【后端】【UV】【Django】 `uv` 管理的项目中搭建一个 Django 项目
🚀 一步步搭建 Django 项目(适用于 uv pyproject.toml 项目结构) 🧱 第 1 步:初始化一个 uv 项目(如果还没建好) uv init django-project # 创建项目,类似npm create vue⚙️ 第 …...

单片机设计_四轴飞行器(STM32)
四轴飞行器(STM32) 想要更多项目私wo!!! 一、系统简介 四轴飞行器是一种通过四个旋翼产生的升力实现飞行的无人机,其核心控制原理基于欧拉角动力学模型。四轴飞行器通过改变四个电机的转速来实现六自由度控制(前后、左右、上下…...
kafka配置SASL_PLAINTEXT简单认证
Kafka ZooKeeper 开启 SASL_PLAINTEXT 认证(PLAIN机制)最全实战教程 💡 本教程将手把手教你如何为 Kafka 配置基于 SASL_PLAINTEXT PLAIN 的用户名密码认证机制,包含 Kafka 与 ZooKeeper 的全部配置,适合入门。 &…...
PostgreSQL简单使用
一、PostgreSQL概念 特点 开源与自由 标准符合性 数据类型丰富 事务与并发 扩展性 安全性 优势 高性能 高可用性 灵活性 社区支持 成本效益 PostgreSQL结构 多层逻辑结构 第一层:实例(xxx.xxx.xxx.xxx…...

【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践
目录 1.前言 2.正文 2.1配置文件的格式 2.2properties 2.2.1基础语法 2.2.2value读取配置文件 2.2.3缺点 2.3yml 2.3.1基础语法 2.3.2配置不同数据类型 2.3.3配置读取 2.3.4配置对象和集合 2.3.5优缺点 2.4综合练习:验证码案例 2.4.1分析需求 2.4.2…...

算法优选系列(9.BFS 解决拓扑排序)
目录 拓扑排序简介: 编辑 课程表(medium): 课程表II(medium): 火星词典(hard): 拓扑排序简介: 有向无环图(DAG图) 如上图每条边…...
(1)Java 17/18/19 新特性面试题
Java 17/18/19 新特性面试题 🚀 掌握前沿技术,成为顶尖 Java 工程师 1️⃣ Java 17/18/19 新特性价值点 👉 点击展开题目 Java 17/18/19新特性中,你认为最有价值的是哪些?请结合实际场景说明 密封类(Sealed Classes…...
LAN(局域网)和WAN(广域网)
你的问题非常清晰!我来用一个直观的比喻实际拓扑图帮你彻底理解LAN(局域网)和WAN(广域网)如何协同工作,以及路由器在其中的位置。你可以把整个网络想象成一座城市: 1. 比喻:城市交通…...

【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?
一、全链路超时建模:从用户需求到系统分解 1.1 端到端时间预算分配 黄金公式: 用户期望响应时间 = 网络传输时间 + 服务处理时间 + 下游调用时间 + 缓冲时间典型分配策略(以1秒目标为例): 环节时间预算优化目标客户端渲染100ms骨架屏(Skeleton)预渲染边缘节点(CDN)…...