【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(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是…...
Java垃圾回收与JIT编译优化
1. Java中的垃圾回收 垃圾回收是Java内存管理的核心,负责自动回收不再被应用程序引用的对象内存,从而防止内存泄漏并优化资源使用。以下详细介绍垃圾回收的机制、算法及优化实践。 1.1 垃圾回收的必要性 垃圾回收解决了手动内存管理中的常见问题,如内存泄漏和悬空指针。它…...
mmaction2——tools文件夹下
build_rawframes.py 用法示例 python tools/data/build_rawframes.py data/videos data/frames --task rgb --level 2 --ext mp4 --use-opencv --num-worker 8总结: 只需要 RGB 帧,推荐 --use-opencv,简单高效,无需额外依赖。 …...
论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL
地址:Next-Generation Database Interfaces: A Survey of LLM-based Text-to-SQL 摘要 由于用户问题理解、数据库模式解析和 SQL 生成的复杂性,从用户自然语言问题生成准确 SQL(Text-to-SQL)仍是一项长期挑战。传统的 Text-to-SQ…...
Devicenet主转Profinet网关助力改造焊接机器人系统智能升级
某汽车零部件焊接车间原有6台焊接机器人(采用Devicenet协议)需与新增的西门子S7-1200 PLC(Profinet协议)组网。若更换所有机器人控制器或上位机系统,成本过高且停产周期长。 《解决方案》 工程师选择稳联技术转换网关…...
【HTML-5】HTML 实体:完整指南与最佳实践
1. 什么是 HTML 实体? HTML 实体是一种在 HTML 文档中表示特殊字符的方法,这些字符如果直接使用可能会与 HTML 标记混淆,或者无法通过键盘直接输入。实体由 & 符号开始,以 ; 分号结束。 <p>这是一个小于符号的实体&am…...
MySQL 索引详解与原理分析
MySQL 索引详解与原理分析 一、什么是索引? 索引(Index)是数据库表中一列或多列的值进行排序的一种数据结构,可以加快数据的检索速度。索引类似于书本的目录,通过目录可以快速定位到想要的内容,而不用全书…...
游戏引擎学习第303天:尝试分开对Y轴和Z轴进行排序
成为我们自己的代码精灵α 所以现在应该可以正常使用了。不过,这两周我们没办法继续处理代码里的问题,而之前留在代码里的那个问题依然存在,没有人神奇地帮我们修复,这让人挺无奈的。其实我们都希望有个神奇的“代码仙子”&#…...
javaweb-html
1.交互流程: 浏览器向服务器发送http请求,服务器对浏览器进行回应,并发送字符串,浏览器能对这些字符串(html代码)进行解释; 三大web语言:(1)html:…...
3.2.3
# 导入必要的库 import onnx import numpy as np from PIL import Image import onnxruntime as ort # 定义预处理函数,用于将图片转换为模型所需的输入格式 def preprocess(image_path): input_shape (1, 1, 64, 64) # 模型输入期望的形状,这里…...
Redis 8.0 GA,重回开源
在数字化浪潮的推动下,实时数据处理已成为现代应用的核心需求。作为全球广泛使用的 NoSQL 数据库,Redis 8.0 不仅通过 30 余项性能改进重新定义了实时数据处理的速度极限,更通过整合社区资源与开放授权模式,进一步巩固其在开源生态…...
心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究
摘要:在心联网(社群经济)理论框架下,本文构建了开源AI智能名片、链动21模式与S2B2C商城小程序源码的技术协同体系,提出"情感连接-利益驱动-生态裂变"三维创新模型。通过实证分析与案例研究,验证该…...
【图像大模型】Hunyuan-DiT:腾讯多模态扩散Transformer的架构创新与工程实践
Hunyuan-DiT:腾讯多模态扩散Transformer的架构创新与工程实践 一、架构设计与技术创新1.1 核心架构解析1.2 关键技术突破1.2.1 多粒度训练策略1.2.2 动态路由MoE 二、系统架构解析2.1 完整生成流程2.2 性能对比 三、实战部署指南3.1 环境配置3.2 基础推理代码3.3 高…...
TASK04【Datawhale 组队学习】构建RAG应用
目录 将LLM接入LangChain构建检索问答链运行成功图遇到的问题 langchain可以便捷地调用大模型,并将其结合在以langchain为基础框架搭建的个人应用中。 将LLM接入LangChain from langchain_openai import ChatOpenAI实例化一个 ChatOpenAI 类,实例化时传入超参数来…...
YOLOv11旋转目标检测Hrsc2016
from ultralytics import YOLOmodel YOLO(/kaggle/input/model-v11-obb/yolo11n-obb.pt) model.train(data/kaggle/input/hrscobb4/HRSC-YOLO/data.yaml, epochs30) 1使用的训练平台为Kaggle 数据集:HRSC的三种形式 一级分类:船 有水平框版本&…...
Debian重装系统后
安装配置java环境 手动安装 下载openJDK:openJDK 设置替代项 sudo update-alternatives --install /usr/bin/java java /opt/jdk-21.0.2/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-21.0.2/bin/javac 1 sudo update-alternat…...
野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2
RKNN Toolkit Lite2 是瑞芯微专为RK系列芯片开发的NPU加速推理API。若不使用该工具,计算任务将仅依赖CPU处理,无法充分发挥芯片高达6TOPS的NPU算力优势。 按照官方文档先拉一下官方代码库,然后通过whl文件安装,因为我是python3.1…...
ElasticSearch导读
ElasticSearch 简介:ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…...
【STM32】自定义打印函数
STM32 学习笔记:理解 my_printf 与 va_start 在嵌入式开发中,我们常常需要实现类似标准 C 中 printf 的调试输出功能。为了支持“任意数量参数”的传递,C 语言提供了对 可变参数(variable arguments) 的支持。其中&am…...
基于 STM32 的 PC ARGB 风扇控制器设计与实现
一、项目背景 最近购入的 X99 系列主板,没有风扇的 ARGB 彩灯接口,并且在 Ubuntu 系统上 4pin 的风扇接口调速也是非常的难用,sensor 扫描不到传感器,于是决定手搓一个风扇控制器,来实现转速自定义和彩灯控制。 我控制…...
【软件设计师】计算机网络考点整理
以下是软件设计师考试中 计算机网络 的核心考点总结,帮助您高效备考: 一、网络体系结构与协议 OSI七层模型 & TCP/IP四层模型 各层功能(物理层-数据链路层-网络层-传输层-会话层-表示层-应用层)对应协…...
在 Qt 中实现动态切换主题(明亮和暗黑)
目录 步骤 1:准备主题文件步骤 2:将 QSS 文件加入资源系统步骤 3:创建主题管理类步骤 4:在应用程序中切换主题步骤 5:处理自定义控件和动态资源步骤 6:保存用户主题偏好步骤 7:处理图片资源切换…...
JavaEE 初阶文件操作与 IO 详解
一、文件操作基础:File 类 作用:操作文件或目录(创建、删除、获取信息)。 核心方法: exists():文件是否存在createNewFile():创建新文件mkdir():创建目录delete():删除…...
基于Qt的app开发第十天
写在前面 笔者昨天刚刚收到课设的截止时间要求,距离写这篇博客的时间还有一个月,我从申请自命题课设到今天已经27天了,先用两周时间学Qt,然后就开始做这个项目,现在已经快把基础功能全部实现了。 目前的打算是完成基础…...
QT中信号和事件的区别
好的,简单来说,Qt 的信号(Signal)和事件(Event)虽然都用于组件间通信和交互,但它们的机制和用途是不同的: 1. 信号(Signal) 概念:信号是对象发出的…...
AUTOSAR图解==>AUTOSAR_SRS_PWMDriver
AUTOSAR PWM驱动模块详解 基于AUTOSAR 4.4.0 SRS 规范文档 目录 1. PWM驱动概述2. PWM驱动架构3. PWM驱动配置4. PWM驱动API接口5. PWM驱动状态管理6. PWM驱动典型应用场景7. 总结1. PWM驱动概述 AUTOSAR PWM驱动是AUTOSAR基础软件中的一个重要组件,属于微控制器抽象层(MCAL)…...
SQL数据处理流程
一、数据处理 1、数据清洗 对空值处理:删除/填充为0 -- 用 0 填充 NULL SELECT COALESCE(sales, 0) AS sales FROM orders;-- 删除含 NULL 的记录 DELETE FROM users WHERE email IS NULL; COALESCE(bonus, 0) 相当于IF(bonus IS NULL, 0, bonus),当…...
Mysql差异备份与恢复
1.练习差异备份 差异备份:备份完全备份后,新产生的数据。 在192.168.88.50主机完成差异备份 步骤一:练习差异备份//周一完全备份 mysql> select * from test.one; --------------------- | name | age | sex | ------------------…...
目标检测 Lite-DETR(2023)详细解读
文章目录 迭代高级特征跨尺度融合高效的低层次特征跨尺度融合KDA:Key-aware Deformable Attention 论文翻译: CVPR 2023 | Lite DETR:计算量减少60%!高效交错多尺度编码器-CSDN博客 DINO团队的 (Lightweight Transfo…...
【Java学习方法】类变量
类变量 引出关键字:static 又名:静态变量,静态字段,类字段(字段又名属性,成员方法),类属性 是什么? 供该(同一个类)的所有对象共享的变量 &am…...
智能手表为什么需要做 EN 18031 认证?
EN 18031 是欧盟针对电磁兼容性(EMC)中人体暴露于电磁场的安全要求制定的标准,全称为 《Electromagnetic compatibility (EMC) - Standards for protective measures against electromagnetic fields with regard to human exposure》&#x…...
什么是 Agent 的 Message
Messages 2.4.1 概述 什么是 Agent 的 Message? 当你和朋友聊天、在网上搜索信息或是对手机语音助手说“帮我查一下天气”时,其实你都在向某个“代理者(Agent)”发送一条“信息(Message)”。这里的“代理者”既可以是一个人,也可以是一个能执…...
如何用JAVA手写一个Tomcat
一、初步理解Tomcat Tomcat是什么? Tomcat 是一个开源的 轻量级 Java Web 应用服务器,核心功能是 运行 Servlet/JSP。 Tomcat的核心功能? Servlet 容器:负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器:监听端口…...
WebRTC与RTSP|RTMP的技术对比:低延迟与稳定性如何决定音视频直播的未来
引言 音视频直播技术已经深刻影响了我们的生活方式,尤其是在教育、医疗、安防、娱乐等行业中,音视频技术成为了行业发展的重要推动力。近年来,WebRTC作为一种开源的实时通信技术,成为了音视频领域的重要选择,它使得浏览…...
COMPUTEX 2025 | 广和通创新解决方案共筑AI交互新纪元
5月20日至23日,广和通携多领域创新解决方案亮相2025年台北国际电脑展(COMPUTEX 2025),台北南港展览馆#K0727a展位。此次展会,广和通围绕“Advancing Connectivity Intelligent Future”为主题,设置四大核心…...
COMPUTEX 2025 | 广和通率先发布基于MediaTek T930 平台的5G模组FG390
5月19日,全球领先的无线通信模组和AI解决方案提供商广和通率先发布基于MediaTek T930平台的5G模组FG390系列。FG390系列模组为以5G固定无线接入(Fixed Wireless Access,FWA)为代表的MBB终端产品而设计,将在CPE…...
Power Integrations 汽车电源管理方案:为汽车应用增加系统价值
在新能源汽车产业蓬勃发展的当下,高效的电源管理方案成为提升汽车性能与可靠性的关键。近期,Power Integrations 举办线上交流会,介绍了基于其 1700V InnoSwitch3-AQ 反激式开关 IC 的五款全新参考设计,旨在为 800V 纯电动汽车提供…...
汽车转向系统行业2025数据分析报告
汽车转向系统市场概况 2024年全球汽车转向系统市场规模约为2769.4亿元,预计到2031年将增长至3296.3亿元,年均复合增长率(CAGR)为2.5%。这一增长主要得益于汽车行业的持续发展以及转向系统技术的不断进步。 市场驱动因素 汽车转…...
Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?
首先,预处理的主要功能包括宏展开、头文件包含、条件编译等。用户的问题主要集中在宏展开和头文件包含,所以需要分别考虑这两个部分。 关于宏展开,首先需要解析#define指令。编译器在预处理阶段需要维护一个符号表,用来存储宏的名…...
谈谈 Kotlin 中的构造方法,有哪些注意事项?
在 Kotlin 中,构造方法分为主构造方法(Primary Constructor)和次构造方法(Secondary Constructor)。 1 主构造方法 主构造方法是类的核心构造方法,直接在类头声明,位于类名之后。 1.1 基本语…...
Elasticsearch常用命令
以下是 Elasticsearch 查看集群状态配置和索引完整操作流程的详细命令: 一、查看集群状态与配置 1. 集群健康状态 curl -X GET "localhost:9200/_cluster/health?pretty" 关键参数: level=indices:显示每个索引的健康状态 level=shards:显示每个分片的详细状…...
深入解读RTP协议:RFC 3550的技术分析与应用
引言 实时传输协议(RTP),作为一项重要的技术规范,在多媒体通信中扮演着至关重要的角色。尤其在音视频传输中,RTP为媒体流提供了端到端的传输机制,能够支持高质量、低延迟的音视频数据流传输。随着互联网及…...
使用 electron-builder 打包与发布 Electron 应用
基于 electron-vite-vue 项目结构 本文将基于 electron-vite-vue 脚手架,详细介绍如何使用 electron-builder 实现: ✅ 多平台打包(Windows / macOS / Linux)✅ 自动更新发布配置✅ 常用构建脚本与输出结构 📁 项目结…...
命令行删除node_modules
文章目录 前言一、linux二、windows 前言 最近公司在重构项目,使用的monorepo,这就导致多个项目有多个node_modules。所以在主项目的package.json中写一个清除所有项目的node_modules。第一次研究命令行的代码,记录一下。但我感觉我写的不太…...
naive-ui切换主题
1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 获取存储的主题类…...
开源Vue表单设计器FcDesigner中组件联动的配置教程
在用FcDesigner表单开发中,经常需要实现组件之间的联动行为,例如当某个输入框的值满足特定条件时,动态显示或隐藏其他组件。FormCreate 提供了强大的组件联动功能,通过 control 配置项实现组件的加载、显示、禁用和必填等状态控制…...
使用 Shadcn UI 构建 Java 桌面应用
许多桌面应用程序,如 Slack、Notion、Microsoft Teams 和 Linear,都采用基于 Web 的用户界面。这已成为现代软件开发中的常见做法,开发者可以借助熟悉的 Web 技术构建应用,从而简化开发流程。 在本篇文章中,我们将向您…...
25_05_19Linux实战篇、第一章_01若依前后端部署之路(后端)
Linux_实战篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:若依前后端动静分离(后端 ) 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.20 适用环境: Rocky9.5 文档说明 本文围绕 Linux 实战展开&#x…...
Python慕课学习记录
中国大学MOOC(慕课)观看记录: Python123课后相应的练习、考试记录...
2025年渗透测试面试题总结-快手[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 快手[实习]安全工程师 一面问题分析与详细回答 1. 自我介绍 4. 项目问题与解决 7. 防止SQL注入&…...