WebRTC(八):SDP
SDP
概念
- SDP 是一种描述多媒体通信会话的文本格式(基于 MIME,RFC 4566)。
- 本身 不传输数据,仅用于在会话建立阶段传递信息。
- 常与 SIP(VoIP)、RTSP、WebRTC 等协议配合使用。
用途
- 描述媒体类型(音频、视频等);
- 指定编解码器、媒体格式;
- 提供媒体的传输信息(IP 地址、端口、传输协议等);
- 协商媒体能力(能力协商);
- 描述时钟信息(同步);
- 支持多路流(多 track)。
结构
字段 | 含义 | 示例 | 说明 |
---|---|---|---|
v= | 协议版本 | v=0 | 始终为 0,表示 SDP 的版本 |
o= | 会话起始者 | o=john 2890844526 2890842807 IN IP4 192.0.2.1 | 包含用户名、会话 ID、版本号、网络类型、地址类型和 IP 地址 |
s= | 会话名称 | s=Example Session | 必填项,但可为任意字符串 |
i= | 会话信息 | i=A demo of SDP | 可选项,对会话的简要描述 |
u= | URI | u=http://example.com | 可选项,指向更多信息 |
e= | 电子邮件地址 | e=john@example.com | 可选项 |
p= | 电话号码 | p=+1 555 555 5555 | 可选项 |
c= | 连接信息 | c=IN IP4 203.0.113.1 | 指定媒体的传输地址(可用于全局或每个媒体段) |
b= | 带宽信息 | b=AS:2000 | 可选,AS 表示应用带宽,单位 kbps |
t= | 会话活动时间 | t=0 0 | 表示会话起止时间,0 0 表示无限期 |
r= | 重复时间 | r=604800 3600 0 90000 | 可选项,描述周期性会话 |
z= | 时区调整 | z=2882844526 -3600 2898848070 0 | 可选项,调整为夏令时等 |
k= | 加密密钥 | k=clear:password | 已弃用,不推荐使用 |
a= | 属性字段 | 多种形式 | 详见下文“属性字段详解” |
m= | 媒体信息 | m=audio 49170 RTP/AVP 0 | 定义媒体类型、端口、传输协议和 payload type |
y= | 会话标识符(非标准) | - | 某些系统私有扩展 |
f= | 格式参数(非标准) | - | 某些系统私有扩展 |
WebRTC中的SDP
在 WebRTC 中,SDP(Session Description Protocol) 是用于完成多媒体会话协商的关键格式,尽管 WebRTC 本身并不强依赖 SDP 协议(也有 ORTC 替代方案),但当前主流实现如 Chrome、Firefox、Safari 都基于 SDP 的 Offer/Answer 模型进行媒体协商。
基本结构
WebRTC 中 SDP 文本结构遵循 SDP 规范(RFC 4566)+ 一些扩展,主要由两部分组成:
- Session-level(全局)字段:描述整个会话的元数据;
- Media-level 字段:每个音频、视频流的参数(每个 m= 开头段落)。
常见结构如下:
v=0 # SDP版本
o=- 12345 2 IN IP4 0.0.0.0 # 会话起始者
s=- # 会话名(必须字段)
t=0 0 # 时间
a=group:BUNDLE 0 1 # BUNDLE分组
a=msid-semantic: WMS # Media Stream 语义m=audio 9 UDP/TLS/RTP/SAVPF 111
...m=video 9 UDP/TLS/RTP/SAVPF 96
...
SDP字段
会话级别字段(Session-Level)
字段 | 示例 | 说明 |
---|---|---|
v= | v=0 | 版本号,固定为 0 |
o= | o=- 123456 2 IN IP4 127.0.0.1 | 会话拥有者:用户名、会话ID、版本、IP等 |
s= | s=- | 会话名,必须存在但可为 - |
t= | t=0 0 | 时间,0 0 表示永远有效 |
a=group:BUNDLE 0 1 | 表示将 media MID 为 0 和 1 的媒体复用到一个 DTLS/ICE 通道 | |
a=msid-semantic: WMS | 表示支持 MediaStream 概念 | |
a=ice-lite | 某些场景中表示是 ICE Lite 模式的端(如 SFU) |
媒体描述字段(Media-Level)
m= 行:媒体定义
m=audio 9 UDP/TLS/RTP/SAVPF 111
含义:
audio
:媒体类型9
:端口(通常为 9,占位,由 ICE 协商真实端口)UDP/TLS/RTP/SAVPF
:传输协议,表示使用 SRTP over DTLS111
:payload type,用于后续a=rtpmap
对应实际编解码器
ICE 相关字段(NAT 穿透)
字段 | 示例 | 说明 |
---|---|---|
a=ice-ufrag | a=ice-ufrag:F7gI | ICE用户名 |
a=ice-pwd | a=ice-pwd:x9cml/Yz... | ICE密码 |
a=candidate: | a=candidate:1 1 udp 2130706431 192.168.1.2 5000 typ host | 描述网络候选地址(host, srflx, relay) |
a=end-of-candidates | 表示候选地址发送完毕 | |
a=ice-options:trickle | 表示支持 trickle ICE(边发送边收集候选) |
DTLS 安全字段(加密通道)
字段 | 示例 | 说明 |
---|---|---|
a=fingerprint: | a=fingerprint:sha-256 AB:CD:... | DTLS 指纹,用于身份验证 |
a=setup: | a=setup:actpass | 指示 DTLS 握手的角色:active / passive / actpass (默认) |
媒体流属性
字段 | 示例 | 说明 |
---|---|---|
a=mid:0 | 媒体 ID,与 group:BUNDLE 搭配使用 | |
a=sendrecv | 表示媒体方向,其他有 sendonly , recvonly , inactive | |
a=rtpmap: | a=rtpmap:111 opus/48000/2 | 映射 Payload Type 到 编解码器名称 |
a=fmtp: | a=fmtp:111 minptime=10;useinbandfec=1 | 格式参数(如 Opus 的 FEC) |
a=rtcp-mux | 表示 RTP 和 RTCP 使用同一端口 | |
a=rtcp-rsize | 表示使用 Reduced-Size RTCP |
媒体同步与标识
字段 | 示例 | 说明 |
---|---|---|
a=msid:stream1 track1 | MediaStream ID 和 Track ID,用于 Web 应用层标识流 | |
a=ssrc:<ssrc-id> cname:<value> | a=ssrc:1234 cname:abcd | 标识 RTP 流的同步源 SSRC 及同步名字 |
a=ssrc:<id> msid:<stream-id> <track-id> | 指定 track 对应的 ssrc |
rtpmap
功能
描述 RTP 载荷类型(Payload Type)对应的编解码器信息。
SDP 中的 a=rtpmap
用于将 动态载荷类型(PT)编号 映射到 实际的编解码器名称、采样率、声道数 等信息。
语法格式
a=rtpmap:<payload-type> <codec-name>/<clock-rate>[/<channels>]
作用总结
- 明确指定每个 PT 对应的编解码器;
- 告诉接收方如何解析接收到的 RTP 包;
- 提供采样率和声道信息(音频)或 RTP 时钟频率(视频);
示例
a=rtpmap:111 opus/48000/2
说明 PT 111 表示 Opus 编码,采样率 48kHz,双声道。
fmtp
功能
提供编解码器的格式化参数(Format Parameters)。
SDP 中的 a=fmtp
是 rtpmap
的扩展,用于定义该编解码器的具体参数,如打包方式、Profile、Level、纠错支持等。
语法格式
a=fmtp:<payload-type> <parameter1>=<value1>; <parameter2>=<value2>; ...
作用总结
- 指定编解码器的高级参数;
- 协商功能特性(如 H264 的
packetization-mode
); - 确保发送端和接收端兼容配置,避免播放异常;
示例(H.264):
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
含义:
- 允许编码解码器使用不同的 Level;
- 使用 NALU 分片打包方式;
- 使用 H.264 Baseline profile level 3.1
Payload Type列表
Payload Type | Codec | 示例 rtpmap | 示例 fmtp | 用途 |
---|---|---|---|---|
111 | Opus | a=rtpmap:111 opus/48000/2 | a=fmtp:111 minptime=10; useinbandfec=1 | 音频,WebRTC 默认 |
103 | ISAC (16kHz) | a=rtpmap:103 ISAC/16000 | — | 音频 |
104 | ISAC (32kHz) | a=rtpmap:104 ISAC/32000 | — | 音频 |
9 | G722 | a=rtpmap:9 G722/8000 | — | 音频(静态) |
0 | PCMU | a=rtpmap:0 PCMU/8000 | — | 音频(静态) |
8 | PCMA | a=rtpmap:8 PCMA/8000 | — | 音频(静态) |
96 | VP8 | a=rtpmap:96 VP8/90000 | — | 视频,兼容性好 |
98 | VP9 | a=rtpmap:98 VP9/90000 | a=fmtp:98 profile-id=0 | 视频,高压缩率 |
102 | H264 | a=rtpmap:102 H264/90000 | level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f | 视频(通常会配多个) |
109 | H264 | a=rtpmap:109 H264/90000 | 同上 | 视频(动态 PT) |
100 | RTX (VP8) | a=rtpmap:100 rtx/90000 | a=fmtp:100 apt=96 | VP8 重传流 |
101 | Telephone-event | a=rtpmap:101 telephone-event/8000 | — | DTMF |
示例
v=0
o=private 51472368 2 IN IP4 0.0.0.0
s=PlaySession
t=0 0
a=ice-lite
a=group:BUNDLE 0 1
a=msid-semantic: WMS live/xxx
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:0
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=ssrc:849342908 cname:zzz
a=ssrc:849342908 label:audio-41rt248x
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0
m=video 9 UDP/TLS/RTP/SAVPF 109
c=IN IP4 0.0.0.0
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 3C:BF:C9:FA:D7:BD:14:F5:99:EA:11:0E:4D:80:70:FA:B0:58:FC:95:B2:C3:52:47:87:83:4E:CF:8A:C8:79:1F
a=setup:passive
a=mid:1
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:109 H264/90000
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
a=candidate:0 1 udp 2130706431 112.118.101.218 16938 typ host generation 0
a=candidate:1 1 udp 2130706431 127.0.0.1 16938 typ host generation 0
a=candidate:2 1 udp 2130706431 112.20.4.5 16938 typ host generation 0
会话级字段(全局)
v=0
- SDP 协议版本,始终为 0。
o=private 51472368 2 IN IP4 0.0.0.0
- o=用户名(private);
- 51472368:会话ID;
- 2:版本号(每次修改递增);
IN IP4 0.0.0.0
:网络类型和地址(一般占位符,实际由 ICE 决定)。
s=PlaySession
- 会话名称,可为任意字符串。
t=0 0
- 表示 SDP 会话有效期为永久(起始时间 = 截止时间 = 0)。
a=ice-lite
- 表示该端是 ICE-lite 模式(常用于服务端,如 SFU,表示只被动响应 ICE 协商,不发起连接)。
a=group:BUNDLE 0 1
- 表示启用 BUNDLE,将 MID 为 0(音频)和 1(视频)的媒体流复用在同一个传输通道上(节省端口/资源)。
a=msid-semantic: WMS live/xxx
- 表示使用 MediaStream 语义,流名为
live/xxx
,供 JavaScript 层识别 track 属于哪个 stream。
音频媒体段(m=audio)
m=audio 9 UDP/TLS/RTP/SAVPF 111
- 音频媒体,端口为占位符
9
(真实由 ICE 协商); UDP/TLS/RTP/SAVPF
:表示使用 DTLS 加密的 SRTP;111
是 payload type,后续用rtpmap
指定编码类型。
c=IN IP4 0.0.0.0
- 网络地址(无实际含义,占位,真实通过 ICE 协议确定)。
a=ice-ufrag:02150669
a=ice-pwd:xxx
- ICE 协商用户名片段和密码,用于 STUN 交互过程。
a=fingerprint:sha-256 3C:BF:...:1F
a=setup:passive
- DTLS 指纹,用于验证传输安全性;
setup:passive
表示此端 不发起 DTLS 握手,对端应 actpass/active。
a=mid:0
- 媒体流的唯一标识(用于 BUNDLE 映射)。
a=sendonly
- 表示此媒体方向是只发送(如服务端推流)。
a=rtcp-mux
a=rtcp-rsize
- 使用 RTP 和 RTCP 端口复用;
- 使用缩减大小的 RTCP(节省带宽)。
a=rtpmap:111 opus/48000/2
111
编解码器为 Opus,48kHz 采样,双声道。
a=ssrc:849342908 cname:xxx
a=ssrc:849342908 label:audio-41rt248x
- SSRC(同步源 ID)= 849342908,用于标识此 RTP 流;
cname
:跨媒体同步标识;label
:track label(供 JS 层识别)。
a=candidate:...112.118.101.218...
- 提供 ICE 候选地址:
typ host
表示本地 IP;- generation 0 表示首次协商;
- 提供了多个候选,包括公网、私网地址。
视频媒体段(m=video)
m=video 9 UDP/TLS/RTP/SAVPF 109
- 视频媒体流,使用 PT = 109;
- 支持 SRTP over DTLS。
a=rtpmap:109 H264/90000
- PT 109 映射为 H.264 编解码器,90kHz 时钟。
a=fmtp:109 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
- 描述 H264 的特性参数:
level-asymmetry-allowed=1
:允许解码器水平不对称;packetization-mode=1
:分片模式,必需用于 WebRTC;profile-level-id=42e01f
:表示 Baseline Profile Level 3.1。
a=ssrc:849342909 cname:xxx
a=ssrc:849342909 label:video-6v319bim
- 视频 RTP 流 SSRC;
label
标识该 track。
a=ice-ufrag:02150669
a=ice-pwd:xxx
a=fingerprint:sha-256 ...
- 和音频共享相同的 ICE 参数;
- 多路复用(BUNDLE)场景下,音视频媒体共享 ICE 通道(节省资源)。
a=mid:1
a=sendonly
a=rtcp-mux
mid:1
:媒体 ID;sendonly
:只发送视频;rtcp-mux
:复用 RTP/RTCP;
相关文章:
WebRTC(八):SDP
SDP 概念 SDP 是一种描述多媒体通信会话的文本格式(基于 MIME,RFC 4566)。本身 不传输数据,仅用于在会话建立阶段传递信息。常与 SIP(VoIP)、RTSP、WebRTC 等协议配合使用。 用途 描述媒体类型…...
《哈希表》K倍区间(解题报告)
文章目录 零、题目描述一、算法概述二、算法思路三、代码实现四、算法解释五、复杂度分析 零、题目描述 题目链接:K倍区间 一、算法概述 计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合,高效地统计满足条件的子数组。 需要注…...
牛津大学开源视频中的开放世界目标计数!
视频中的开放世界目标计数 GitHub PaPer Niki Amini-Naieni nikianrobots.ox.ac.uk Andrew Zisserman azrobots.ox.ac.uk 视觉几何组(VGG),牛津大学,英国 图 1:视频中的目标计数:给定顶行的视频&#…...
1.2、CAN总线帧格式
1、帧类型 2、帧类型介绍 (1)数据帧 扩展格式是为了扩展ID,ID号每4位一个字节(11位最大ID号为0x7FF) (2)遥控帧 遥控帧由于没有Data,所以DLC可能没有意义,可给任意值&am…...
DeepSeek今天喝什么随机奶茶推荐器
用DeepSeek生成了一个随机奶茶推荐器-今天喝什么,效果非常棒!UI界面美观。 提示词prompt如下 用html5帮我生成一个今天喝什么的网页 点击按钮随机生成奶茶品牌等,要包括中国常见的知名的奶茶品牌 如果不满意还可以随机再次生成 ui界面要好看 …...
词编码模型怎么进行训练的,输出输入是什么,标签是什么
词编码模型怎么进行训练的,输出输入是什么,标签是什么 词编码模型的训练本质是通过数据驱动的方式,将离散的文本符号映射为连续的语义向量。 一、训练机制:从符号到向量的映射逻辑 1. 核心目标 将单词/子词(Token)映射为低维向量,使语义相关的词在向量空间中距离更近…...
LSTM、GRU 与 Transformer网络模型参数计算
参数计算公式对比 模型类型参数计算公式关键组成部分LSTM4 (embed_dim hidden_size hidden_size hidden_size)4个门控结构GRU3 (embed_dim hidden_size hidden_size hidden_size)3个门控结构Transformer (Encoder)12 embed_dim 9 embed_dim ff_dim 14 embed_dim…...
nnv开源神经网络验证软件工具
一、软件介绍 文末提供程序和源码下载 用于神经网络验证的 Matlab 工具箱,该工具箱实现了可访问性方法,用于分析自主信息物理系统 (CPS) 领域中带有神经网络控制器的神经网络和控制系统。 二、相关工具和软件 该工具箱利用神经…...
SQLite3 在嵌入式系统中的应用指南
SQLite3 在嵌入式系统中的应用指南 一、嵌入式系统中 SQLite3 的优势 SQLite3 是嵌入式系统的理想数据库解决方案,具有以下核心优势: 特性嵌入式系统价值典型指标轻量级适合资源受限环境库大小:500-700KB零配置无需数据库管理员开箱即用无…...
原生微信小程序网络请求与上传接口封装实战指南
本文基于微信小程序原生 API,封装 request 和 uploadFile 接口,最终实现统一请求管理、请求拦截、错误处理等能力。 📦 一、为什么要封装网络请求? 微信小程序提供了 wx.request 和 wx.uploadFile 原生 API,但直接使用…...
电路图识图基础知识-塔式起重机控制电路识图与操作要点(三十五)
引言: 塔式起重机作为建筑施工中不可或缺的大型起重运输机械设备,其控制电路的识图与操作对于确保施工安全和效率至关重要。本文将详细介绍塔式起重机的控制电路识图,帮助操作人员更好地理解和掌握其工作原理。 一、塔式起重机概述 塔式起重…...
基于SpringBoot + Vue 的网上拍卖系统
基于springbootvue的在线拍卖系统| Java | vue | 配万字文档 | springboot001 〔运行环境〕 Java版本:jdk1.8 node版本:13.x python版本:2.7 IDE类型:idea或exlipse 数据库:MySQL(5.x或8.x版本都…...
用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践
聚类分析作为无监督学习的核心技术,能在客服数据中发现隐藏的用户群体或问题模式。尽管 Excel/WPS 并非专业统计软件,但巧妙利用其内置功能,也能实现基础的聚类分析,为中小型客服团队提供快速洞察。以下介绍具体方法及智能客服场景…...
利用mold加快rust程序构建
我用rust的cargo build命令编译polars-cli时,用时达到14分钟,如下所示。 Finished dev profile [unoptimized debuginfo] target(s) in 14m 19s,通过核对时间戳,发觉其中最后一步生成可执行文件花了6分钟。 于是向DeepSeek请教&a…...
leetcode543-二叉树的直径
leetcode 543 思路 路径长度计算:任意两个节点之间的路径长度,等于它们的最低公共祖先到它们各自的深度之和递归遍历:通过后序遍历(左右根)计算每个节点的左右子树深度,并更新全局最大直径深度与直径的关…...
(三)yolov5——模型训练
一、准备数据 先准备一个MP4的视频 1.测试一帧 使用opencv来提取每一个视频的帧 先使用以下代码查看一帧的内容,是否符合预期 import cv2 import matplotlib.pyplot as plt# 打开视频文件 video cv2.VideoCapture("111.mp4") # 读取一帧 ret, frame…...
STM32对接霍尔传感器
STM32对接霍尔传感器的技术解析与应用实现,结合测速原理、硬件设计、代码实现及进阶应用,涵盖从基础到实战的全流程指南,可以应用到金属检测等功能。 ⚙️ 一、霍尔传感器基础 工作原理 霍尔传感器基于霍尔效应,当磁铁靠近时输出电平变化(常开型无磁铁时输出高电平,靠近时…...
SpringCloud系列(32)--使用Hystrix进行全局服务降级
前言:在上一节中我们使用Hystrix进行了服务降级,但是要在每个方法上面配置HystrixCommand才能实现服务降级,如果需要进行服务降级的方法多了,HystrixCommand也就得配置很多遍,所以本节内容则是使用Hystrix进行了全局服…...
Origin绘制三Y轴柱状图、点线图、柱状点线图
三Y轴柱状图是一种高级数据可视化形式,它通过三个独立的纵轴在同一个图表中展示不同量纲或量级的数据系列。其主要用于揭示不同量级指标间的关联性(例如高销售额是否伴随高利润率)。 当数据满足以下条件时,即可绘制三Y轴图&#x…...
通信网络编程3.0——JAVA
主要添加了私聊功能 1服务器类定义与成员变量 public class ChatServer {int port 6666;// 定义服务器端口号为 6666ServerSocket ss;// 定义一个 ServerSocket 对象用于监听客户端连接//List<Socket> clientSockets new ArrayList<>();// 定义一个列表用于存储…...
4-深度学习网络层
深度学习模型 Embedding层 Embedding矩阵是可训练的参数,一般会在模型构建时随机初始化 也可以使用预训练的词向量来做初始化,此时也可以选择不训练Embedding层中的参数 输入的整数序列可以有重复,但取值不能超过Embedding矩阵的列数 核心…...
【LeetCode】用双指针解决移除元素问题、合并两个有序数组求解
🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,…...
车载诊断架构协议篇 --- OBDonUDS和ZEVonUDS
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从&#x…...
医学 Agent:自带医学深度调研 deep research,优化治疗策略+药物参考
医学 Agent:自带医学深度调研deep research,优化治疗策略药物参考 第一版代码输出结果,居然连不上网运行结果梳理 第二版结果测试 第一版代码 医疗顾问AI系统 - 基于Qwen API 的智能医疗助手 最终目标:构建一个能够查询疾病治疗方…...
硬件工程师笔试面试高频考点汇总——(2025版)
目录 1 电子器件部分 1.1 电阻 1.1.1 电阻选型时一般从哪几个方面进行考虑? 1.1.2 上拉下拉电阻的作用 1.1.3 PTC热敏电阻作为电源电路保险丝的工作原理 1.1.4 如果阻抗不匹配,有哪些后果 1.1.5 电阻、电容和电感0402、0603和0805封装的含义 1.1.6 电阻、电…...
春秋云镜【CVE-2017-18349】fastjson wp
知识点 fastjson反序列化 将json转为java对象的过程 漏洞存在版本 Fastjson<1.2.24 漏洞原理 fastjson引入的autotype功能,本来是为了区分同名同元素但是不同类型的对象序列化后内容一致无法还原的问题,但是这一操作允许了json数据中通过type来指定对…...
网络编程:八股文
一.Reactor网络模型 ------------------- | 应用主线程 | -------------------|v ------------------- | Reactor | | (事件分发器) | -------------------|v ------------------- | 事件多路分发器 | <--- epoll/poll/select -----------------…...
设计模式精讲 Day 11:享元模式(Flyweight Pattern)
【设计模式精讲 Day 11】享元模式(Flyweight Pattern) 文章内容 在软件开发过程中,我们常常需要处理大量相似对象的创建和管理问题。如果这些对象之间存在大量的重复信息,直接创建每一个对象会导致内存占用过高、系统性能下降。享…...
常用终端命令(Linux/macOS/bash 通用)分类速查表
文件与目录操作 命令作用说明pwd显示当前路径ls列出当前目录内容ls -l以列表形式显示文件详细信息ls -a显示所有文件(包括隐藏文件)cd <目录名>进入指定目录cd ..返回上一级目录cd ~回到用户主目录mkdir <目录名>创建目录mkdir -p a/b/c创建…...
Robyn高性能Web框架系列04:事件、中间件与错误处理
请求-响应过程 应用启动、关闭事件1、启动事件(Startup Events)2、关闭事件(Shutdown Events) 中间件1、前置中间件(BeforeRequest)2、后置中间件(AfterRequest)3、示例:…...
深入理解JavaScript设计模式之迭代器模式
文章目录 深入理解JavaScript设计模式之迭代器模式定义官方翻译白话翻译 实现jQuery中的each迭代器实现数组迭代器迭代器实现创建Dom元素 内部迭代器和外部迭代器内部迭代器外部迭代器 迭代类数组对象和字面量对象倒序迭代器中止迭代器迭代器的应用举例音乐播放器案例待输出更新…...
【项目管理】项目管理资料文档模板(ZIP,PPT,WORD)
项目交付文档 01项目详细调研计划编写规范V1.0.doc 03项目详细调研报告编写规范V1.0.doc 07软件需求规格说明书评审规范V1.0.doc 10.软件需求规格说明.doc 产品检查单,xls 工程评审.zip 软件标准过程集.zip 系统测试管理规程.docx 四)项目管理计划.doc 项目管理系统实施项目管理…...
DeepSeek中的提示库及其用法示例
《DEEPSEEK原生应用与智能体开发实践 图书》【摘要 书评 试读】- 京东图书 为了深入探索DeepSeek提示词样例的丰富内涵,充分挖掘其背后潜藏的无限可能,同时致力于为用户打造更为卓越、便捷且高效的使用体验,DeepSeek官网的API文档匠心独运地…...
292. Nim 游戏
292. Nim 游戏 - 力扣(LeetCode) 想法 枚举问题: n 1 ~ 3 ,由于我先手,我可以直接拿走全部的石头,所以我赢n 4,由于我先手,我拿掉 1 - 3 块石头 ,剩下的可能就是 1 -…...
STM32 串口通信②:蓝牙模块HC-05控制单片机
一 前言 上一篇我们已经成功实现单片机和电脑的连接,接下来,我们学习一个有趣的板块,HC-05蓝牙模块,这个蓝牙模块,我们就要建立手机和单片机的通讯啦,还是比较有趣的一个过程,大家可以跟着多操作…...
艾立泰数字化重塑汽车零部件包装租赁行业
在汽车零部件包装租赁行业,资产利用率低、流转效率差、运输成本高等痛点长期困扰企业。艾立泰科技通过数字化解决方案,成为该行业降本增效的关键合作伙伴,助力企业实现从传统管理模式向智能化的跃迁。 精准库存管理:告别“盲人摸…...
Windows电脑数据恢复终极指南:从原理到实战
Windows电脑数据恢复终极指南:从原理到实战 数据丢失是每个电脑用户都可能遭遇的噩梦。本文将为您全面解析Windows平台下的数据恢复技术,从基础原理到高级技巧,帮助您在文件误删、格式化、系统崩溃等情况下找回宝贵数据。 一、数据恢复基础…...
进入python虚拟环境的方法
首先,切换到虚拟环境所在的目录(即包含venv文件夹的目录): Cmd cd D:\phd\phd1spring\July\pythonstduy\projecton 然后,激活虚拟环境: Cmd .\venv\Scripts\activate 如果上述方法不行,还可…...
大数据时代UI前端的变革:从静态展示到动态交互
hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在大数据时代,信息以前所未有的速度和规模增长。这种数据环境的变化,深…...
海拔案例分享-门店业绩管理小程序
在各大电商平台和直播带货如火如荼来的当下,各行各业的门店都在积极寻求创新的管理方式,以提升业绩、优化运营。长沙的一家策划运营公司,敏锐地捕捉到这一市场需求,他们见过太多门店老板对着Excel表格叹气:美容店算错提…...
Python中的数据可视化:使用Matplotlib绘制图表
数据可视化是将复杂数据集转换为图形或图像表示的过程,旨在简化信息的解释和传达。Python作为一种多功能编程语言,提供了多种强大的库来实现这一目标,其中最受欢迎和广泛使用的是Matplotlib。 首先,我们需要确保已经安装了必要的…...
【VUE】1.准备工作
一、环境准备(本机仅需一次) 安装 Node.js(推荐 LTS 版本,包含 npm) 打开 VSCode,安装插件(推荐): Vetur 或 Volar(用于 Vue 支持) ESLint / Pr…...
Linux下的版本控制器Git(15)
文章目录 如何理解版本控制(9-0.00.00)Git 的理解Git 的历史具体操作和用法补充细节 简介:那个对Git的理解,是我用自己的话语结合故事进行阐述,可能理解的不到位,有些错误还请多多包含!说句实话…...
UI设计 | 审美积累 | 极繁风格(Maximalism / Complex UI)
如果极简追求“只保留必须的”,那极繁的设计思路就是“有条理地堆叠信息和情绪”。它不是无序的炫技,而是在秩序中有意识地填满视觉空间:字体层叠、图文混排、大量干扰信息并置,却又彼此克制。最终目标,是让用户在强信…...
MocapApi 中文文档 和github下载地址 NeuronDataReader(以下简称 NDR)的下一代编程接口
以下是 MocapApi 技术文档 github https://github.com/pnmocap/MocapApi?tabreadme-ov-file 国内可以查找getcode 英文文档 https://mocap-api.noitom.com/mocap_api_en.html 概述 MocapApi 是 NeuronDataReader(以下简称 NDR)的下一代编程接口&…...
c++面试题每日一学记录-C++类型转换
一、C++ 类型转换体系 C++ 提供 4 种命名转换操作符,比 C 风格转换更安全、意图更明确: 转换类型关键字主要用途安全检查静态转换static_cast相关类型转换(数值、类层次上行/下行)编译期动态转换dynamic_cast多态类型的安全下行转换运行时常量转换const_cast添加/移除 con…...
Maven 多模块项目调试与问题排查总结
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【C#】C#异步编程:异步延时 vs 阻塞延时深度对比
文章目录 前言一、阻塞延时:Thread.Sleep1、 实现方式2、 工作原理3、 缺点 二、异步延时:Task.Delay1、 实现方式2、 工作原理3、 优点 三、深度对比四、实际应用示例对比1、 阻塞延时在UI应用中的问题2、 异步延时在UI应用中的正确用法3、 带取消功能的…...
c#实现halcon的rle编码blob分析
效果展示 实现功能 connection膨胀腐蚀开运算闭运算特征计算 核心代码 using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Drawing; using System.Linq;namespace view3d {// 基础对象类,类似于 Halcon 的 HO…...
python基于微信小程序的广西文化传承系统
文章目录 具体实现截图本项目支持的技术路线源码获取详细视频演示:文章底部获取博主联系方式!!!!本系统开发思路进度安排及各阶段主要任务java类核心代码部分展示主要参考文献:源码获取/详细视频演示 ##项目…...