# sysdvr_websocket_webusb **Repository Path**: sunshinewithmoonlight/sysdvr_websocket_webusb ## Basic Information - **Project Name**: sysdvr_websocket_webusb - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-30 - **Last Updated**: 2025-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SysDVR WebSocket & WebUSB 客户端 这是 SysDVR 的现代化网页客户端实现,支持 WebSocket 和 WebUSB 两种连接方式,提供低延迟、高流畅度的 Switch 视频音频串流体验。 ## 📋 项目概述 ### 核心特性 - **🌐 WebSocket 连接** - 远程网络连接,支持跨网络访问 - **🔌 WebUSB 连接** - 本地 USB 连接,超低延迟(< 50ms) - **🎬 H.264 视频解码** - 硬件加速,支持 30-60 FPS - **🔊 AAC 音频播放** - 高保真音频,支持多采样率 - **📊 智能缓冲机制** - 自适应缓冲,吸收网络波动 - **🎚️ 音视频同步** - 基于时间戳的精确同步 - **📈 实时监控面板** - 显示缓冲帧数和视频帧率 ### 架构设计 ``` ┌─────────────────────────────────────────────────────┐ │ Vue3 Web Application │ │ ┌─────────────────────────────────────────────┐ │ │ │ UI Components │ │ │ │ - ConnectionPanel (连接控制) │ │ │ │ - StreamSettings (串流设置) │ │ │ │ - LatencyMonitor (延迟监控) │ │ │ └─────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ Service Layer (核心服务) │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ WebSocket │ │ WebUSB │ │ │ │ Connection │ │ Connection │ │ │ └──────────────┘ └──────────────┘ │ │ ↓ ↓ │ │ ┌──────────────────────────────────┐ │ │ │ ConnectionManager (单例) │ │ │ │ - 连接管理 │ │ │ │ - 统计信息 │ │ │ │ - 音视频同步 │ │ │ └──────────────────────────────────┘ │ │ ↓ ↓ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ VideoDecoder │ │ AudioPlayer │ │ │ │ - H.264 解码 │ │ - AAC 播放 │ │ │ │ - 缓冲管理 │ │ - 缓冲管理 │ │ │ │ - 帧同步 │ │ - 音频同步 │ │ │ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ Browser APIs │ │ - WebCodecs (视频解码) │ │ - Web Audio API (音频播放) │ │ - WebSocket (网络连接) │ │ - WebUSB (USB 连接) │ └─────────────────────────────────────────────────────┘ ``` ## 🚀 快速开始 ### 前置要求 - Node.js 16+ 和 npm - 现代浏览器(Chrome/Edge/Safari) - SysDVR 服务端(Switch 上运行) ### 安装与运行 ```bash # 1. 安装依赖 npm install # 2. 启动开发服务器 npm run dev # 3. 打开浏览器访问 # http://localhost:5175 # 4. 输入 Switch IP 地址并连接 ``` ### 生产构建 ```bash # 构建生产版本 npm run build # 预览生产构建 npm run preview ``` ## 📁 项目结构 ``` . ├── src/ │ ├── services/ # 核心服务模块 │ │ ├── websocket.js # WebSocket 连接管理 │ │ ├── webusb.js # WebUSB 连接管理 │ │ ├── connectionManager.js # 连接管理器(单例) │ │ ├── videoDecoder.js # H.264 视频解码 │ │ └── audioPlayer.js # AAC 音频播放 │ ├── components/ # Vue 组件 │ │ ├── ConnectionPanel.vue # 连接控制面板 │ │ ├── StreamSettings.vue # 串流设置 │ │ └── LatencyMonitor.vue # 延迟监控 │ ├── App.vue # 主应用组件 │ └── main.js # 应用入口 ├── SysDVR/ # 服务端代码 │ ├── sysmodule/ # Switch 模块 │ │ └── source/modes/ │ │ ├── WebSocketmode.c # WebSocket 模式实现 │ │ └── WebUSBmode.c # WebUSB 模式实现 │ └── SysDVRConfig/ # 配置工具 (NRO) ├── package.json # 项目配置 ├── vite.config.js # Vite 配置 └── README.md # 本文件 ``` ## 🔧 核心功能说明 ### WebSocket 连接 **特点**: - 远程网络连接,支持跨网络访问 - 自动心跳检测(Ping-Pong) - 双通道设计(视频 + 音频) **使用场景**: - 远程串流 - 不同网络环境 - 公网访问 **连接流程**: ``` 1. 输入 Switch IP 地址 2. 创建视频 WebSocket 连接 3. 创建音频 WebSocket 连接 4. 服务端验证并返回数据 5. 客户端接收并处理数据 ``` ### WebUSB 连接 **特点**: - 本地 USB 连接,超低延迟 - 直接 USB 通信,无网络开销 - 仅支持本地连接 **使用场景**: - 本地直连 - 极低延迟需求 - 游戏操作 **连接流程**: ``` 1. 点击"选择 USB 设备" 2. 浏览器显示 USB 设备列表 3. 选择 Switch 设备 4. 建立 USB 连接 5. 开始数据传输 ``` ### 视频解码 **支持格式**: - H.264 (AVC) - 分辨率:1280×720 (720p) - 帧率:30-60 FPS - 比特率:自适应 **解码流程**: ``` 1. 接收视频数据包 2. 提取 NAL 单元 3. 识别 SPS/PPS(参数集) 4. 等待 IDR 帧(关键帧) 5. 初始化解码器(AVCC 格式) 6. 解码视频帧 7. 缓冲管理(10 帧缓冲) 8. 基于时间戳渲染 ``` **缓冲策略**: - 最小缓冲:2 帧 - 最大缓冲:10 帧 - 渲染延迟:66-330ms(取决于缓冲) ### 音频播放 **支持格式**: - AAC (Advanced Audio Coding) - 采样率:48kHz - 声道:立体声 - 比特率:128-256 kbps **播放流程**: ``` 1. 接收音频数据包 2. 验证包头(Magic: 0xCCCCCCCC) 3. 提取音频数据 4. 缓冲管理(10 块缓冲) 5. 调度播放时间 6. Web Audio API 播放 ``` **缓冲策略**: - 最小缓冲:1 块 - 最大缓冲:10 块 - 自动同步:延迟 > 100ms 时触发 - 积压清理:缓冲 > 5 块时清理 ### 音视频同步 **同步机制**: 1. **时间戳同步** - 基于视频帧时间戳 2. **缓冲同步** - 根据视频缓冲帧数调整音频延迟 3. **自动同步** - 延迟过大时自动调整 4. **用户调节** - 通过滑杆手动调整缓冲帧数 **同步参数**: - 最小缓冲帧数:1-10 帧(用户可配置) - 每帧延迟:33ms(30 FPS) - 同步延迟:66-330ms ## 📊 性能指标 ### 延迟分析 | 场景 | 延迟 | 说明 | |------|------|------| | 本地 USB | < 50ms | WebUSB 直连 | | 局域网 | 100-200ms | WebSocket + 缓冲 | | 互联网 | 200-500ms | WebSocket + 缓冲 | ### 缓冲配置 | 配置 | 缓冲帧数 | 延迟 | 流畅度 | 网络抗性 | |------|---------|------|--------|---------| | 激进 | 3 帧 | 100ms | ★★★☆☆ | ★★☆☆☆ | | 平衡 | 5 帧 | 165ms | ★★★★☆ | ★★★☆☆ | | 保守 | 10 帧 | 330ms | ★★★★★ | ★★★★★ | **当前配置**:10 帧(保守,优先流畅度) ### 系统要求 | 指标 | 要求 | |------|------| | CPU | 双核 2GHz+ | | 内存 | 2GB+ | | 网络 | 5Mbps+ | | 浏览器 | Chrome 94+, Safari 15+, Edge 94+ | ## 🎮 使用指南 ### 连接到 Switch 1. **启动 SysDVR 服务端** - 在 Switch 上运行 SysDVR 应用 - 选择 WebSocket 或 WebUSB 模式 - 记下 Switch 的 IP 地址 2. **打开网页客户端** - 访问 http://localhost:5175 - 或部署到服务器后访问 3. **连接设备** - **WebSocket**:输入 Switch IP 地址,点击"连接" - **WebUSB**:点击"选择 USB 设备",选择 Switch 4. **调整设置** - 使用"串流设置"卡片调整缓冲帧数 - 观察"延迟监控"面板的实时数据 ### 故障排查 **问题**:无法连接到 Switch - 检查 Switch IP 地址是否正确 - 确保 Switch 和电脑在同一网络 - 检查防火墙设置 **问题**:视频卡顿或延迟高 - 增加缓冲帧数(通过滑杆) - 检查网络连接质量 - 关闭其他占用带宽的应用 **问题**:音频不同步 - 调整缓冲帧数 - 等待 0.5 秒让缓冲稳定 - 重新连接 **问题**:WebUSB 不可用 - 确保浏览器支持 WebUSB(Chrome/Edge) - 检查 USB 连接是否正常 - 尝试重新插拔 USB 线 ## 🔌 服务端编译 ### 编译 WebSocket 和 WebUSB 模块 ```bash cd /Users/shine/t29/SysDVR bash ReleaseSysmodule.sh ``` **输出文件**: - `SysmoduleRelease/SysDVR.zip` - 完整版(包含所有模式) - `SysmoduleRelease/USB.zip` - USB 专用版 ### 编译配置工具 ```bash cd /Users/shine/t29/SysDVR/SysDVRConfig cargo build --release ``` **输出文件**: - `target/release/SysDVRConfig.nro` - 配置工具 ## 📝 开发指南 ### 添加新功能 1. **创建新的服务模块** ```javascript // src/services/myService.js class MyService extends EventEmitter { constructor() { super(); // 初始化 } myMethod() { // 实现功能 this.emit("event-name", data); } } export default new MyService(); ``` 2. **在 ConnectionManager 中集成** ```javascript import myService from './myService.js'; class ConnectionManager { constructor() { myService.on("event-name", (data) => { // 处理事件 }); } } ``` 3. **创建 UI 组件** ```vue ``` ### 调试技巧 1. **打开浏览器开发者工具** - F12 打开控制台 - 查看日志输出 - 使用 Network 标签页检查连接 2. **启用详细日志** - 所有服务都有详细的日志输出 - 日志格式:`[服务名] 事件描述` - 使用 emoji 快速识别日志类型 3. **性能分析** - 使用浏览器的 Performance 标签页 - 监控 CPU 和内存使用 - 检查帧率(FPS) ## 🐛 已知问题和限制 ### 浏览器兼容性 | 浏览器 | WebSocket | WebUSB | 状态 | |--------|-----------|--------|------| | Chrome | ✅ | ✅ | 完全支持 | | Safari | ✅ | ❌ | 不支持 WebUSB | | Firefox | ✅ | ❌ | 不支持 WebUSB | | Edge | ✅ | ✅ | 完全支持 | ### 已知限制 - WebUSB 仅支持 Chrome 和 Edge - 单个浏览器标签页只能连接一个设备 - 后台标签页可能被限流 - 某些防火墙可能阻止 WebSocket 连接 ## 📚 相关文档 ### 客户端文档 - `AUDIO_BUFFER_IMPLEMENTATION_GUIDE.md` - 音频缓冲实现 - `VIDEO_BUFFER_TIMESTAMP_SYNC_IMPLEMENTATION.md` - 视频缓冲实现 - `WEBSOCKET_PING_PONG_REMOVAL_GUIDE.md` - WebSocket 心跳机制 ### 服务端文档 - `SysDVR/Readme/` - 服务端完整文档 - `SysDVR/SysDVRConfig/` - 配置工具文档 ## 🤝 贡献指南 欢迎提交 Issue 和 Pull Request! ### 提交 Issue 请包含以下信息: - 问题描述 - 复现步骤 - 浏览器和操作系统版本 - 控制台日志输出 ### 提交 PR 1. Fork 本仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ## 📄 许可证 本项目采用 MIT 许可证。详见 LICENSE 文件。 ## 🔗 相关链接 - [SysDVR 原始项目](https://github.com/exelix11/SysDVR) - [WebCodecs API 文档](https://www.w3.org/TR/webcodecs/) - [Web Audio API 文档](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) - [WebUSB 文档](https://wicg.github.io/webusb/) ## 📞 支持 如有问题,请: 1. 查看本 README 的故障排查部分 2. 查看相关文档 3. 提交 Issue 4. 联系开发者 --- **最后更新**:2025 年 11 月 30 日 **版本**:1.0.0