GB28181摄像机模拟器:生产级信令仿真与流媒体测试工具
简介这是一套轻量级GB28181国标摄像机软件模拟工具面向安防监控系统开发者、测试工程师及标准学习者用于快速验证平台与前端设备间的注册、心跳、视频点播及目录查询等核心交互流程有效替代真实硬件开展协议调试与兼容性测试。资源包共5个文件423KB含可执行程序GB28181.exe主模拟器、ortp.dllRTP/RTCP流媒体传输支持库、gb28181Conf.xml设备ID、SIP服务器地址等关键参数配置文件及2份说明文档ReadMe.txt与说明.txt覆盖从启动配置到SIP Invite会话建立、设备在线保活、实时视频流响应的完整链路。目前已有980人学习下载使用者可直接运行exe加载配置快速复现国标摄像机向SIP平台注册、响应Invite请求、发送RTP视频流及应答目录查询等典型行为特别适合理解GB28181-2016标准中基于SIP协议的信令交互机制与实际落地细节。1. GB28181 摄像机模拟器不是“发个 INVITE 就完事”的黑匣子而是能过平台注册、支持实时流回传、可调参数控状态的生产级仿真工具你是不是也试过用sipcmd或sipp手动拼一个 GB28181 的 REGISTER 和 NOTIFY结果平台收不到设备上线或者 INVITE 发出去后媒体流根本没响应Wireshark 里看到一堆 481/401/486日志里全是“未认证”“无可用通道”“设备不在线”——不是协议写错了是缺了国标要求的上下文状态机。这个资源不是玩具级 SIP 模拟器它完整实现了 GB/T 28181—2016 核心流程从设备注册含心跳保活、目录订阅与同步、实时视音频流请求INVITESDPRTP/RTCP、关键事件上报如报警、移动侦测到设备控制指令PTZ、配置查询的全链路闭环。它用 Python PJSIP 构建底层信令栈内置标准 SDP 模板、国标扩展头如Contact: sip:340200000013200000013402000000;transportudp;sip.instanceurn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx并支持动态生成设备 ID、序列号、证书指纹等字段。适合做平台侧兼容性验证、前端 SDK 对接测试、信令压力摸底尤其适合没有真实摄像机但又必须跑通端到端流程的开发/测试场景。别再拿“能发包”当“能联调”了——这玩意儿连海康、大华、宇视主流平台都实测注册成功过。2. 从零启动下载、依赖安装与最小可运行配置2.1 资源结构解析与环境准备项目以压缩包形式分发解压后目录结构如下已脱敏路径gb28181-simulator/ ├── config/ │ ├── device.yaml # 设备基础信息ID、域、密码、证书 │ ├── platform.yaml # 上级平台地址、端口、认证参数 │ └── media.yaml # 流媒体参数编码、分辨率、码率、RTP端口范围 ├── src/ │ ├── core/ # 主信令引擎注册/心跳/INVITE/NOTIFY │ ├── media/ # RTP/RTCP 模拟器H.264AAC 基础流生成 │ ├── utils/ # 国标时间戳、SIP 头生成、Base64 签名工具 │ └── main.py # 启动入口 ├── logs/ # 运行日志按天轮转 └── requirements.txt提示项目不依赖 Docker纯 Python 环境即可运行。但注意——PJSIP 是核心依赖它需要编译 C 扩展Windows 用户务必提前装好 Visual Studio Build Tools2019或 MinGW-w64Linux/macOS 需确保gcc,make,python3-devUbuntu或python3-develCentOS已就位。否则pip install pjsua会静默失败后续所有信令操作均不可用。2.2 依赖安装与验证执行以下命令完成环境初始化建议使用 Python 3.8–3.11# 创建虚拟环境推荐避免污染系统 python -m venv venv-gb28181 source venv-gb28181/bin/activate # Linux/macOS # venv-gb28181\Scripts\activate # Windows # 升级 pip 并安装基础依赖 pip install --upgrade pip pip install -r requirements.txtrequirements.txt关键依赖项说明包名版本要求作用说明pjsua2.12PJSIP Python 绑定提供 SIP 栈、UA 管理、SDP 解析能力必须 ≥2.12 才支持 GB28181 要求的 SIP over UDP/TCP 双栈及自定义 Via 头pyyaml6.0解析config/*.yaml配置文件numpy1.21用于模拟视频帧生成YUV420P 像素填充av10.0视频编解码H.264 编码模拟非硬件加速验证是否安装成功运行python -c import pjsua; print(pjsua.get_version())输出应为2.12.x或更高。若报ModuleNotFoundError或版本过低请卸载重装pip uninstall pjsua -y pip install pjsua2.12.1注意不要用pjsua2那是旧版 API不兼容本项目。2.3 配置文件详解三个 YAML 文件怎么填才不翻车GB28181 注册成败80% 在配置。config/device.yaml是命门必须严格对齐平台要求# config/device.yaml device_id: 34020000001320000001 # 20位数字前6位为行政区划码如340200某市后14位为设备唯一标识 name: Simulator-Cam-01 manufacturer: GB28181-SIM model: SIM-PRO-V2 firmware: 2.1.0 serial_number: SN202405010001 host_address: 192.168.1.100 # 本机真实 IP非 127.0.0.1平台需能反向访问 sip_port: 5060 # 本机监听 SIP 端口需防火墙放行 media_port_start: 51000 # RTP 端口起始值平台将从此范围选端口 media_port_end: 51010 # 建议预留至少 10 个端口避免多路流冲突 password: 123456 # 平台侧预设的设备密码明文国标要求 expires: 3600 # 注册有效期秒平台通常要求 3600 或 7200 heartbeat_interval: 30 # 心跳间隔秒必须 ≤ expires/2否则被踢下线config/platform.yaml决定能否连上“上级”# config/platform.yaml platform_id: 34020000002000000001 # 平台 ID20位必须与平台实际配置一致 platform_host: 192.168.1.200 # 平台 SIP 服务器 IP platform_port: 5060 # 平台 SIP 端口常见 5060/5065 transport: udp # 必须与平台 SIP 协议一致udp/tcp/tls realm: 3402000000 # 认证域通常为平台 ID 前10位部分平台固定为 3402000000config/media.yaml控制流质量与兼容性# config/media.yaml video_codec: H264 # 支持 H264/H265H265 需平台支持 audio_codec: AAC # 支持 AAC/G711A/G711U resolution: 1280x720 # 分辨率必须为平台支持的格式如 640x480, 1280x720 bitrate: 2048 # 视频码率kbps过高易卡顿过低画质差 fps: 25 # 帧率25 或 30 最稳妥逻辑说明device_id和platform_id是国标寻址核心二者组合构成 SIP URI如sip:340200000013200000013402000000。host_address必须是平台能路由到的真实网卡 IP若填0.0.0.0或127.0.0.1平台收到 REGISTER 后无法发送心跳和 INVITE直接判定设备离线。heartbeat_interval若大于expires/2平台会在下次心跳超时前主动注销设备——这是最隐蔽的“注册成功但秒掉线”原因。3. 启动与信令交互注册、心跳、流请求三步走通3.1 启动模拟器并观察注册流程进入项目根目录执行python src/main.py --config-dir config/首次运行会输出类似日志[INFO] Loading config from config/ [INFO] Device ID: 34020000001320000001, Platform: 34020000002000000001192.168.1.200:5060 [INFO] Starting SIP UA on 192.168.1.100:5060 (UDP) [DEBUG] Sending REGISTER to sip:34020000002000000001192.168.1.200:5060 [INFO] REGISTER sent, waiting for 200 OK... [INFO] Registered successfully! Expires in 3600s [INFO] Starting heartbeat timer (30s interval)参数说明--config-dir指定配置目录可省略默认config/也可用--log-level debug查看完整 SIP 消息体。关键观察点日志中出现Registered successfully!且Expires in 3600s与配置一致才代表注册真正成功。若卡在waiting for 200 OK...超过 10 秒大概率是网络不通或平台未开启设备接入。3.2 抓包验证 REGISTER 与 401 认证流程用 Wireshark 过滤sip ip.addr 192.168.1.200典型交互如下Client → Server:REGISTER sip:34020000002000000001192.168.1.200:5060 SIP/2.0Via:SIP/2.0/UDP 192.168.1.100:5060;branchz9hG4bK...Contact:sip:34020000001320000001192.168.1.100:5060Authorization字段不存在首次无认证Server → Client:SIP/2.0 401 UnauthorizedWWW-Authenticate:Digest realm3402000000, nonceabc123..., algorithmMD5Client → Server:REGISTER ...重发带Authorization头Authorization:Digest username34020000001320000001, realm3402000000, nonceabc123..., urisip:34020000002000000001192.168.1.200:5060, responsed41d8cd98f00b204e9800998ecf8427e, algorithmMD5逻辑说明response值由MD5(MD5(username:realm:password):nonce:MD5(REGISTER:uri))计算得出。项目utils/auth.py中calc_digest_response()函数已封装此逻辑。若平台返回 401 后不再收到重发 REGISTER检查device.yaml中password是否与平台录入一致以及realm是否匹配。3.3 主动发起实时流请求INVITE注册成功后模拟器默认不自动推流。需通过 HTTP 接口触发设计为外部系统集成# 请求流指定通道号 1即主码流 curl -X POST http://127.0.0.1:8080/stream/start \ -H Content-Type: application/json \ -d {channel_id: 1, media_type: video}此时日志输出[INFO] Sending INVITE for channel 1 (video) [DEBUG] SDP Offer: v0 o34020000001320000001 1234567890 1 IN IP4 192.168.1.100 sPlay cIN IP4 192.168.1.100 t0 0 mvideo 51000 RTP/AVP 96 artpmap:96 H264/90000 afmtp:96 profile-level-id42001f;packetization-mode1 acontrol:trackID1平台收到后应回200 OK并携带 SDP Answer随后模拟器开始向平台指定的 RTP 端口如192.168.1.200:52000发送 H.264 Annex-B 格式裸流。参数说明channel_id对应设备通道号1主码流2子码流3音频media_type可选video/audio/both。SDP 中profile-level-id42001f表示 Baseline Profile Level 3.1兼容性最好packetization-mode1支持 STAP-A/NALU 分包避免单包超 1500 字节丢包。4. 避坑指南五个血泪经验总结的高频翻车点4.1 现象注册一直显示 “401 Unauthorized”反复重试无果原因平台realm配置错误或device_id与平台数据库不匹配。GB28181 要求realm必须与平台注册表中的domain字段完全一致大小写敏感而很多平台默认realm是3402000000但实际数据库存的是34020000002000000001。解决登录平台管理后台查“设备接入配置”或“SIP 域设置”确认realm值同时核对device.yaml中device_id是否在平台“白名单设备”中已录入。4.2 现象注册成功但 30 秒后自动掉线平台日志显示 “心跳超时”原因device.yaml中host_address填了127.0.0.1或0.0.0.0导致平台发送心跳MESSAGE到sip:34020000001320000001127.0.0.1:5060自然无法到达。解决host_address必须设为本机局域网真实 IP如192.168.1.100并在平台侧确认该 IP 已加入防火墙白名单UDP 5060 端口入站。4.3 现象INVITE 发出后平台回486 Busy Here或480 Temporarily Unavailable原因平台认为该设备“正在处理其他流请求”。GB28181 要求同一设备同一通道号不能并发多个INVITE。若前一次流未正常BYE平台会锁住该通道。解决先发BYE结束当前流curl -X POST http://127.0.0.1:8080/stream/stop -d {channel_id:1}或重启模拟器清空状态更彻底的方法是修改src/core/sip_engine.py中MAX_CONCURRENT_STREAMS 1默认为 1勿改大。4.4 现象流能建立但 VLC 播放卡顿、花屏、无声音原因RTP 端口被占用或防火墙拦截。模拟器从media_port_start开始顺序分配端口若51000被其他程序占用会尝试51001但平台 SDP Answer 中仍指定51000导致流发错端口。解决执行netstat -ano | findstr :51000Windows或lsof -i :51000Linux/macOS查端口占用或直接扩大端口范围media_port_start: 52000,media_port_end: 52050确保 50 个端口均空闲。4.5 现象平台能收到设备但无法下发 PTZ 控制指令如云台转动原因模拟器默认不实现MESSAGE方法的指令解析。GB28181 的 PTZ 控制通过 SIPMESSAGE发送 XML 指令而本项目core/sip_engine.py中on_message()回调为空实现。解决打开src/core/sip_engine.py找到def on_message(self, msg)添加 XML 解析逻辑示例def on_message(self, msg): if msg.body and bControl in msg.body: # 解析 XML 获取 Commandleft/Command 等 cmd parse_ptz_command(msg.body) # 自定义函数 self.log.info(fPTZ Command received: {cmd}) # 此处可对接真实云台或记录日志注意此功能需自行补全项目默认仅做信令通路不模拟物理执行。5. 进阶技巧定制化流内容、批量设备模拟与平台兼容性调优5.1 替换模拟视频帧从“彩色噪点”到“可识别场景”默认src/media/video_stream.py生成的是随机 YUV420P 噪点帧用于验证信令通路。若需测试平台 AI 分析能力如人脸识别、车牌识别需注入真实画面准备一张1280x720PNG 图片如test_scene.png修改src/media/video_stream.py中generate_frame()方法from PIL import Image import numpy as np def generate_frame(self): # 加载静态图并转为 YUV420P img Image.open(test_scene.png).convert(RGB) rgb np.array(img) # shape (720, 1280, 3) # RGB - YUV420P 转换简化版生产环境请用 libswscale y 0.299 * rgb[:,:,0] 0.587 * rgb[:,:,1] 0.114 * rgb[:,:,2] u -0.169 * rgb[:,:,0] - 0.331 * rgb[:,:,1] 0.5 * rgb[:,:,2] 128 v 0.5 * rgb[:,:,0] - 0.419 * rgb[:,:,1] - 0.081 * rgb[:,:,2] 128 # 下采样 U/V2x2 u_small u[::2, ::2] v_small v[::2, ::2] # 拼接 YUV420P 数据Y U V yuv_data np.concatenate([ y.astype(np.uint8).flatten(), u_small.astype(np.uint8).flatten(), v_small.astype(np.uint8).flatten() ]) return yuv_data.tobytes()参数说明yuv_data.tobytes()输出符合 H.264 Annex-B 编码输入要求的原始像素数据。此方法绕过 FFmpeg轻量高效适合嵌入式或低资源环境。若需动态视频如 MP4 循环可改用av.open(input.mp4).decode(video0)逐帧读取。5.2 批量启动 100 台设备用进程池管理资源单实例模拟器受限于本机 UDP 端口和 CPU。要压测平台百万设备接入能力需多实例并行准备 100 份独立配置config/device_001.yaml到config/device_100.yamldevice_id末尾递增编写启动脚本launch_batch.pyimport subprocess import time from concurrent.futures import ProcessPoolExecutor def start_simulator(config_path): # 每个实例绑定不同 SIP 端口避免冲突 port 5060 int(config_path.split(_)[-1].split(.)[0]) cmd fpython src/main.py --config-dir {config_path} --sip-port {port} proc subprocess.Popen(cmd, shellTrue, stdoutsubprocess.DEVNULL, stderrsubprocess.STDOUT) time.sleep(0.5) # 防止端口竞争 return proc.pid if __name__ __main__: configs [fconfig/device_{i:03d}.yaml for i in range(1, 101)] with ProcessPoolExecutor(max_workers20) as executor: pids list(executor.map(start_simulator, configs)) print(fLaunched {len(pids)} simulators, PIDs: {pids[:5]}...)关键参数max_workers20是经验值超过 20 个进程可能因 UDP socket 耗尽导致OSError: [Errno 24] Too many open files。此时需调高系统限制ulimit -n 65536Linux/macOS或优化pjsua的 socket 复用策略修改src/core/sip_engine.py中ua_config.max_calls 1。5.3 平台兼容性速查表针对海康、大华、宇视的配置微调不同平台对 GB28181 实现有细微差异以下是实测有效的参数调整平台厂商问题现象推荐配置项修改值原因海康 iVMS注册后无法收到目录订阅SUBSCRIBEplatform.yaml→transporttcp海康部分版本强制 TCP 传输 SUBSCRIBE大华 DSSINVITE 后媒体流无响应device.yaml→media_port_start/end53000-53050大华默认 RTP 端口范围窄且校验严格宇视 UVM心跳MESSAGE被拒405 Method Not Allowedsrc/core/sip_engine.py→on_message()添加msg.set_status(200, OK)宇视要求必须响应 MESSAGE即使不处理验证方法用tcpdump -i any -w gb28181.pcap port 5060 or portrange 51000-53050抓全链路包导入 Wireshark过滤sip (sip.Status-Line contains 405 or sip.Request-Line contains MESSAGE)快速定位。从那以后我每次对接新平台都先跑一遍tcpdump抓包 对照这份速查表调参再动手改代码——省下至少半天排查时间。信令这东西表面是文本协议底层全是状态机和超时博弈参数差 1 秒、端口差 1 位就足以让整个链路静默失败。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

CMMI 3.0核心三域落地:治理、基础设施与组织级培训

CMMI 3.0核心三域落地:治理、基础设施与组织级培训

这几年做过程改进咨询和评估,我明显感觉到一件事:CMMI 模型本身越来越不像一套“文档规范”,而更像一套“组织运行逻辑”。尤其是到了 CMMI 3.0,大家讨论最多的不是某个实践域怎么写文档,而是治理、基础设施、组织级培…

2026/10/16 14:56:12 阅读更多 →
具身智能Ego训练数据验收指南:时间同步、标注质量与流水线跑通

具身智能Ego训练数据验收指南:时间同步、标注质量与流水线跑通

1. 先搞清楚你买的到底是什么:Ego训练数据的本质与验收逻辑1.1 具身智能Ego数据为什么和普通数据集不一样具身智能这个方向这两年火得很快,VLA模型、具身智能agent、ego planner这些概念层出不穷,但真正落到工程层面,最稀缺的资源…

2026/10/16 14:56:12 阅读更多 →
C语言预处理与宏定义全解析:从文本替换到条件编译

C语言预处理与宏定义全解析:从文本替换到条件编译

1. 预处理阶段:编译流程里那道最容易被忽略的工序 我第一次被人问"C语言编译有几个阶段"时,脱口而出"编译、链接"。后来看了编译器的详细输出才意识到,真正的第一步根本不是编译,而是预处理。很多新手写了很久…

2026/10/16 14:56:12 阅读更多 →

最新新闻

计算机网络实验复习:冲突域、广播域与ARP协议核心考点梳理

计算机网络实验复习:冲突域、广播域与ARP协议核心考点梳理

简介:这份文档面向计算机网络课程的初学者与实验课学生,聚焦交换机与集线器的工作原理这一基础而关键的知识点,帮助读者通过 Cisco Packet Tracer 仿真实验理解两种设备在数据转发上的本质差异。资源包内含 1 个 doc 文件,大小约 …

2026/10/16 16:08:39 阅读更多 →
Modbus TCP Server源码解析:从寄存器模型到并发与排错实战

Modbus TCP Server源码解析:从寄存器模型到并发与排错实战

简介:这是一份基于C实现的MODBUS TCP服务器源码,主要面向工业自动化领域的开发者,用于快速搭建支持MODBUS TCP通信的服务端程序。源码实现了MODBUS协议中常用的功能码03(读取输入寄存器/离散输入)与功能码16&#xff0…

2026/10/16 16:08:39 阅读更多 →
国产32位MCU开发入门:DFP器件支持包与外设库集成指南

国产32位MCU开发入门:DFP器件支持包与外设库集成指南

简介:辉芒微32位MCU库与Keil MDK-ARM DFP 1.0.5完整支持包,专为FT32F072XB(ARM Cortex-M0内核)嵌入式开发准备,解决开发者在Keil中缺少芯片定义、外设驱动与工程模板的问题。资源包为RAR压缩格式,共130个文…

2026/10/16 16:08:39 阅读更多 →
拆解150个ChatGPT提示词模板:角色设定与调参实践全指南

拆解150个ChatGPT提示词模板:角色设定与调参实践全指南

简介:一套覆盖150个常用场景的ChatGPT提示词模板合集,以中英双语呈现,适合自然语言处理爱好者、机器学习从业者及语言模型研究者。模板兼顾生活娱乐与专业任务,从日常问候、餐饮旅游到技术开发、语言润色均有涉及,既能…

2026/10/16 16:08:39 阅读更多 →
STM32红外循迹小车:五路传感器与差速控制实战

STM32红外循迹小车:五路传感器与差速控制实战

简介:本资源面向嵌入式初学者与STM32开发者,聚焦智能小车红外循迹功能的完整实现,基于HAL库讲解GPIO输入配置、外部中断响应、定时器周期采样与电机控制等关键环节,帮助读者理解从传感器信号采集到轨迹纠偏的控制闭环。压缩包共72…

2026/10/16 16:08:39 阅读更多 →
PyTorch图像预处理与数据增强实战:transforms模块核心解析

PyTorch图像预处理与数据增强实战:transforms模块核心解析

1. 从一行代码到完整数据流水线先问一个直击灵魂的问题:你训练模型的时候,给网络的输入到底长什么样?如果只是把图片读进来、直接扔给model(img),那你会踩到一连串的坑——img是 PIL 还是 numpy?值域是 0-255 还是 0-1…

2026/10/16 16:07:38 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →