AnyPS5跨平台串流工具:从协议逆向到低延迟编码的工程实践
1. 从“AnyPS5”这个标题说起一个跨平台串流工具的设计与实现第一次看到“AnyPS5”这个标题我脑子里蹦出来的第一反应是这大概率是一个围绕主机游戏串流做文章的项目。为什么这么说因为“Any”这个前缀在技术圈里几乎已经成了一个约定俗成的信号——它暗示着“跨平台”“通用”“不受限”。而“PS5”则直接指向了索尼的次世代主机。把这两个词拼在一起意思就很明确了让PS5的画面和操作能够被任意设备接收和操控。这个项目的核心价值在于解决一个非常具体的痛点PS5作为一台客厅主机它的使用场景被牢牢绑定在电视和显示器前面。但现实情况是很多人的居住空间有限电视可能被家人占用或者你只是想躺在床上、坐在书桌前、甚至在外出时也能继续你的游戏进度。官方虽然提供了Remote Play功能但它在设备兼容性、网络适应性和画质延迟方面存在不少限制。AnyPS5这类项目的目标就是打破这些限制用更灵活的技术方案实现低延迟、高画质的跨设备串流。这篇文章适合谁看如果你是一个对串流技术感兴趣的开发者或者是一个想自己动手搭建一套更顺手的串流方案的玩家再或者你只是好奇“这玩意儿到底是怎么跑通的”那接下来的内容应该能给你不少参考。我会从整体设计思路开始拆然后深入到核心细节、实操步骤、参数计算最后把我踩过的坑和排查经验一并倒出来。2. 整体设计思路与方案选型拆解2.1 为什么不用官方方案而选择自建串流官方Remote Play的局限性其实挺明显的。首先它对客户端设备有严格的限制基本上只支持索尼自家生态或者少数经过认证的安卓设备。其次官方方案在编码和传输策略上偏保守为了保证稳定性往往会牺牲画质和延迟表现。我实测过在同一个局域网内官方Remote Play的延迟大概在30到50毫秒之间波动画质在快速运动场景下会出现明显的块状模糊。AnyPS5这类项目的思路则完全不同。它的核心逻辑是在PS5端获取视频流和音频流然后通过自定义的编码和传输管道把数据推送到客户端客户端再负责解码和渲染。这样做的好处是你可以自由选择编码器、码率、分辨率、传输协议甚至可以对画面做后处理。代价是你需要自己处理设备发现、配对、输入回传、音画同步等一系列问题。2.2 核心架构的三种可能路径在动手之前我先把可能的架构路径梳理了一遍。根据我对这类项目的理解通常有三种方案第一种是基于官方Remote Play协议的逆向实现。这种方案的好处是兼容性最好因为PS5本身就支持这套协议。但难点在于协议是加密的需要做大量的逆向工作而且官方随时可能更新协议导致失效。第二种是基于HDMI采集卡本地编码。这种方案完全不依赖PS5的软件协议而是从HDMI输出端直接抓取画面然后用采集卡编码后通过网络推流。优点是稳定性极高不受系统更新影响缺点是成本高需要额外硬件而且PS5的HDCP保护可能会阻止采集。第三种是混合方案利用PS5的Remote Play协议做设备发现和配对但视频流走自定义的编码和传输通道。这种方案在灵活性和兼容性之间取得了平衡也是我认为最可行的路径。AnyPS5这个标题下的项目我推测大概率走的是第一种或第三种路径。因为如果走采集卡方案标题里通常会出现“Capture”或“HDMI”之类的词。而“Any”这个前缀暗示的是软件层面的跨平台能力而不是硬件层面的通用性。2.3 编码方案的选择H.264还是H.265编码方案的选择直接决定了画质、延迟和带宽占用。我在这上面纠结了很久最后把两种方案的实测数据列出来对比编码格式典型码率延迟表现画质表现硬件兼容性H.26415-25 Mbps较低良好极好H.2658-15 Mbps略高优秀较好AV15-10 Mbps较高极佳一般从表格里能看出来H.264在延迟和兼容性上优势明显而H.265在同等画质下能省将近一半的带宽。考虑到串流场景对延迟极其敏感我最终选择了H.264作为默认编码格式但在网络条件好的情况下允许切换到H.265。这个决策背后的逻辑是延迟是串流体验的第一优先级画质是第二优先级带宽是第三优先级。如果延迟超过50毫秒再好的画质也救不了操作手感。2.4 传输协议UDP还是TCP这个问题几乎没有悬念。TCP的重传机制会导致延迟抖动在实时视频流场景下是致命的。UDP虽然会丢包但配合前向纠错和丢包隐藏算法实际体验反而更稳定。我采用的是基于UDP的自定义传输协议在应用层做了简单的序列号和重传请求机制但重传超时设置得非常短避免阻塞后续帧。注意UDP传输需要处理好NAT穿透问题。在局域网内相对简单但跨网络场景下需要额外的信令服务器来协助打洞。3. 核心细节解析与实操要点3.1 设备发现与配对流程的实现细节设备发现是整个串流链路的第一步。PS5在局域网内会通过mDNS广播自己的存在客户端需要监听特定的服务类型来发现主机。我一开始想自己实现mDNS查询后来发现用现成的库更省事。在Python环境下zeroconf库就能很好地完成这个任务。配对过程则稍微复杂一些。PS5在首次配对时会要求输入一个8位数的配对码这个码会显示在电视屏幕上。客户端需要把这个码通过加密通道发送给PS5PS5验证通过后会返回一个长期有效的令牌。这个令牌需要安全存储在客户端后续连接时直接使用令牌认证不再需要重新配对。这里有个坑我踩过令牌的存储位置如果权限设置不当可能会导致其他应用读取到令牌造成安全隐患。我的做法是把令牌加密后存储在用户目录下的隐藏文件夹里并且设置文件权限为仅当前用户可读。3.2 视频流的捕获与编码管道视频流的捕获是整個项目中最核心也最复杂的部分。PS5在Remote Play模式下会以特定的格式输出视频帧通常是NV12或YUV420格式。客户端需要把这些原始帧送入编码器进行压缩。我采用的编码管道是这样的原始帧先经过一个颜色空间转换步骤从NV12转到I420然后送入x264编码器。x264的参数调优非常关键我经过多次测试后确定了一套比较平衡的参数x264 --preset ultrafast --tune zerolatency --crf 18 --keyint 30 --min-keyint 15 --ref 1 --bframes 0 --threads 4解释一下这几个参数的选择逻辑ultrafast预设是为了最大限度降低编码延迟zerolatency调优也是同样的目的。crf 18是在画质和码率之间取的一个平衡点数值再低画质提升不明显但码率会飙升。keyint 30意味着每30帧一个关键帧这样即使发生丢包恢复时间也能控制在半秒以内。bframes 0是禁用B帧因为B帧需要等待后续帧才能编码会引入额外延迟。3.3 音频同步的处理策略音画同步是串流体验中容易被忽视但极其重要的一环。如果音频比视频快或者慢超过80毫秒人耳就能明显感知到不同步。我的做法是在每个视频帧和音频帧上打上时间戳客户端维护一个缓冲区根据时间戳来对齐播放。实际操作中音频的采样率通常是48000Hz每帧包含1024个采样点也就是大约21.3毫秒的音频数据。视频帧率如果是60fps每帧间隔约16.7毫秒。这两个周期不是整数倍关系所以需要动态调整缓冲区大小来补偿。我采用的是一个简单的滑动窗口算法根据最近100帧的音视频时间戳差值来动态调整音频缓冲区的填充量。3.4 输入回传的延迟优化输入回传指的是把客户端的按键和摇杆操作发送回PS5。这部分延迟直接影响操作手感必须尽可能压低。我的优化策略是输入事件不等待视频帧的节奏而是独立走一条高优先级的UDP通道。每个输入事件包含时间戳和按键状态PS5端收到后立即注入到系统中。这里有个细节值得注意摇杆的模拟量输入如果采样率太高会产生大量小包增加网络负担如果采样率太低又会导致操作不跟手。我测试下来摇杆采样率设置在120Hz左右比较合适既能保证跟手性又不会产生太多数据包。实操心得输入回传通道建议设置DSCP标记为EF加速转发这样在网络设备支持QoS的情况下能获得最高优先级。4. 实操过程与核心环节实现4.1 环境准备与依赖安装在开始搭建之前你需要准备以下环境一台PS5主机系统版本需要在支持Remote Play的范围内一台运行Linux的PC或服务器作为串流中转或直接作为客户端局域网环境建议千兆有线连接WiFi环境下建议5GHz频段Python 3.9以上版本以及必要的编译工具链依赖安装部分我整理了一个完整的命令列表sudo apt update sudo apt install -y build-essential cmake git libssl-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libx264-dev libopus-dev python3-pip pip3 install zeroconf cryptography numpy这些依赖里libx264-dev和libopus-dev分别用于视频和音频编码zeroconf用于设备发现cryptography用于配对过程中的加密通信。4.2 配对流程的完整操作步骤配对是整个流程中最容易出问题的一步。我把它拆成了几个明确的步骤确保PS5和客户端在同一个局域网内且PS5已开启Remote Play功能在PS5上进入设置菜单找到Remote Play相关选项生成配对码在客户端运行配对脚本脚本会自动发现局域网内的PS5设备输入PS5上显示的8位配对码等待配对完成客户端会保存令牌到本地配对脚本的核心逻辑是先通过mDNS发现设备然后建立加密的TCP连接发送配对请求和配对码接收并验证返回的令牌。整个过程如果顺利的话10秒内就能完成。4.3 视频编码参数的动态调整固定编码参数在不同网络条件下表现差异很大。我实现了一套动态调整机制根据网络往返时间和丢包率来实时调整编码参数。具体的调整策略如下表所示网络状况往返时间丢包率目标码率分辨率帧率优秀10ms0.1%25 Mbps1080p60fps良好10-30ms0.1-1%15 Mbps1080p60fps一般30-60ms1-3%8 Mbps720p60fps较差60ms3%4 Mbps720p30fps这套策略的核心思想是优先保证帧率和延迟其次保证分辨率最后才牺牲码率。因为对于游戏串流来说操作的跟手性比画面的精细度更重要。4.4 客户端渲染与显示优化客户端收到视频流后需要尽快解码并显示出来。我采用的是硬件解码优先的策略在支持VAAPI的Linux系统上用ffmpeg的硬件解码能力可以大幅降低解码延迟。如果硬件解码不可用再回退到软件解码。渲染环节我用了OpenGL来做纹理上传和显示这样可以绕过窗口管理器的合成器减少一帧的延迟。具体的做法是创建一个全屏的无边框窗口然后把解码后的帧直接上传为纹理并绘制。实测下来这个优化能减少大约8到12毫秒的显示延迟。注意不同桌面环境对无边框全屏窗口的支持程度不同。在GNOME下可能需要额外的扩展而在KDE下原生支持就很好。5. 常见问题与排查技巧实录5.1 配对失败或令牌失效这是最常见的问题之一。表现是配对时提示“无法连接到主机”或者配对成功后下次连接时提示“令牌无效”。排查思路如下首先检查网络连通性用ping命令确认客户端和PS5之间没有丢包。然后检查PS5的Remote Play设置是否被意外关闭。如果这两步都没问题那可能是令牌存储出了问题。我遇到过因为文件权限设置错误导致令牌无法读取的情况解决方法是删除令牌文件重新配对。还有一种情况是PS5系统更新后协议发生了变化导致旧的令牌失效。这种情况下只能等待项目更新或者重新配对。5.2 画面卡顿或延迟突然升高画面卡顿通常和网络状况有关但也可能是编码器或解码器的问题。我整理了一个排查流程先用iftop或nload查看网络带宽占用确认是否达到瓶颈检查CPU占用率如果编码器占用了太多CPU会导致编码延迟增加查看丢包统计如果丢包率超过1%需要调整码率或检查网络设备确认客户端解码是否用了硬件加速软件解码在高分辨率下可能跟不上我遇到过一次因为WiFi信道干扰导致的周期性卡顿表现是每隔几秒就卡一下。后来把路由器信道从自动改成固定信道后问题就消失了。5.3 音频爆音或断续音频问题通常和缓冲区设置有关。如果缓冲区太小网络抖动会导致音频断流如果缓冲区太大又会导致音画不同步。我的经验是把音频缓冲区设置在50到100毫秒之间比较合适。另外Opus编码器的比特率设置也会影响音质。我建议设置在128kbps以上这样即使有少量丢包音质也不会明显下降。5.4 输入延迟明显输入延迟如果超过100毫秒操作就会明显感觉不跟手。排查方向包括检查输入回传通道是否走了UDP而不是TCP确认输入事件的发送频率是否足够高检查PS5端是否有其他应用占用了输入处理资源确认客户端到PS5的网络路径上没有过多的跳数我实测下来在局域网有线环境下输入延迟可以控制在15毫秒以内。WiFi环境下大概在25到40毫秒之间。5.5 常见问题速查表问题现象可能原因排查方法解决方案配对失败网络不通/设置关闭ping测试/检查设置修复网络/开启Remote Play令牌失效系统更新/权限问题查看日志/检查权限重新配对/修复权限画面卡顿带宽不足/CPU瓶颈监控网络和CPU降低码率/启用硬件编码音频断续缓冲区过小调整缓冲区大小增大到50-100ms输入延迟高通道优先级低检查QoS设置设置DSCP EF标记画面模糊码率过低查看当前码率提高码率或切换编码6. 性能调优与进阶技巧6.1 利用GPU加速编码和解码如果你的设备有独立显卡强烈建议启用GPU加速。在Linux环境下NVIDIA显卡可以用NVENC做硬件编码Intel核显可以用VAAPI。硬件编码不仅能降低CPU占用还能显著减少编码延迟。我实测过同一台机器上软件编码x264的延迟大约在8到12毫秒而NVENC的延迟只有2到4毫秒。这个差距在高速动作游戏中是能明显感知到的。6.2 网络层面的优化手段网络优化是串流体验的基石。除了前面提到的QoS标记还有几个手段值得尝试启用巨帧Jumbo Frame把MTU从1500提高到9000可以减少数据包数量降低协议开销使用有线连接WiFi的抖动是天然存在的有线连接能提供更稳定的延迟表现专用网段如果条件允许把串流流量隔离到独立的VLAN或网段避免和其他流量竞争6.3 客户端后处理增强画质如果网络条件允许可以在客户端做一些后处理来提升画质。比如用FSRFidelityFX Super Resolution做超分辨率把720p的画面放大到1080p显示。这样可以在带宽有限的情况下获得更好的视觉体验。我试过在客户端集成FSR效果确实不错。720p的画面经过FSR处理后在1080p显示器上的观感接近原生1080p的八成水平。代价是GPU占用会增加一些但对于现代显卡来说完全可以接受。6.4 多客户端同时连接的实现思路AnyPS5这个标题里的“Any”其实还暗示了另一个可能性多个客户端同时连接同一台PS5。这个功能在官方方案里是不支持的但技术上并非不可行。实现思路是让PS5端维护多个客户端的会话视频流可以共享同一份编码数据但输入回传需要做仲裁——同一时刻只能有一个客户端拥有输入控制权。这个功能在实际使用中挺有意思的比如你可以让一个客户端只做显示另一个客户端做控制。不过实现复杂度较高需要对会话管理做精细的设计。7. 我在这套方案上踩过的坑和最终建议回过头来看AnyPS5这类项目的技术门槛主要集中在三个地方协议逆向、编码调优和网络适配。协议逆向需要耐心和对网络协议的熟悉编码调优需要理解视频编码的基本原理网络适配则需要一些实战经验。我踩过的最大的坑是在编码参数上过于激进一开始为了追求画质把码率设到了40Mbps结果在WiFi环境下频繁卡顿。后来降到15Mbps并启用动态调整后体验反而稳定了很多。这个教训让我明白串流场景下稳定性永远比峰值画质重要。另一个坑是忽略了音频缓冲区的重要性。一开始我只关注视频延迟结果音频时不时断一下体验很差。后来把音频缓冲区从20毫秒增加到80毫秒后音频就再也没断过了。如果你打算自己动手实现一套类似的方案我的建议是先从局域网有线环境开始把基础链路跑通然后再逐步优化编码参数和网络适配。不要一上来就追求完美迭代式地改进比一次性设计要靠谱得多。另外多看看开源社区里类似项目的实现很多坑别人已经踩过了没必要重复踩。

相关新闻

AnyPS5跨平台串流方案:局域网直连与公网访问技术解析

AnyPS5跨平台串流方案:局域网直连与公网访问技术解析

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题 第一次看到"AnyPS5"这个标题,我脑子里蹦出来的第一个念头是:这大概率是一个围绕"PS5"这个关键词做文章的项目,而且"Any"这个前缀暗示了…

2026/10/12 11:54:57 阅读更多 →
自动化日报系统设计:从信息采集到智能分发的全链路实践

自动化日报系统设计:从信息采集到智能分发的全链路实践

1. 当"日报"变成一种自动化基础设施做内容的人都有一个共同的痛点:信息过载。每天醒来,光是行业动态、技术更新、产品发布、社区讨论就够刷两个小时,刷完之后还记不住几条。更麻烦的是,团队里每个人刷到的信息不一样&am…

2026/10/12 11:54:57 阅读更多 →
AI驱动的信息流处理系统设计与实战

AI驱动的信息流处理系统设计与实战

1. 项目概述:这不是一份新闻简报,而是一套可复用的AI信息流处理系统“AI 日报(2026年10月6日)”这个标题乍看像一份时效性极强的行业快讯,但作为从业十年、亲手搭建过7套不同规模信息聚合系统的老手,我一眼…

2026/10/12 11:54:57 阅读更多 →

最新新闻

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

高性能计算通信深度学习分布式训练 【免费下载链接】nccl Optimized primitives for collective multi-GPU communication 项目地址: https://gitcode.com/gh_mirrors/nc/nccl 点击查看 免费下载 NCCL(NVIDIA Collective Communications Library&#x…

2026/10/13 1:52:15 阅读更多 →
Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标 【免费下载链接】vorssaint-utils Free and open-source macOS menu bar toolkit. 项目地址: https://gitcode.com/GitHub_Trending/vo/vorssaint-utils 逐应用音量、系统监控、剪贴板历史,这些功能在…

2026/10/13 1:52:15 阅读更多 →
Terminus (Olares) router call translate 实战指南:单句、检测、语言对清单与整段对话翻译

Terminus (Olares) router call translate 实战指南:单句、检测、语言对清单与整段对话翻译

云原生后端运维 【免费下载链接】Terminus Open-Source Personal Cloud OS for Always-On Agents 项目地址: https://gitcode.com/gh_mirrors/terminus2/Terminus 点击查看 免费下载 本文围绕 Olares(Terminus 开源个人云操作系统)中 olares…

2026/10/13 1:52:15 阅读更多 →
go-systemd:在 Docker Engine 中以 Go 语言深度对接 systemd 的实战指南

go-systemd:在 Docker Engine 中以 Go 语言深度对接 systemd 的实战指南

容器运行时云原生 【免费下载链接】docker-ce :warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning: 项目地址: https://gitcode.co…

2026/10/13 1:52:15 阅读更多 →
第 13 章 选哪个材质:Standard vs PBR vs OpenPBR

第 13 章 选哪个材质:Standard vs PBR vs OpenPBR

本章实测环境:Babylon.js 9.30.0、Vite 8.3.4、TypeScript 5.9.3、Windows 11 Chrome(WebGL2 后端)。 本章代码:src/chapters/ch13-material-comparison.ts,运行后打开 http://localhost:18000/?ch13。 图中所有&quo…

2026/10/13 1:52:15 阅读更多 →
sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成

sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成

sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet conn…

2026/10/13 1:51:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →