一个基于 Tauri + React + TypeScript 构建的桌面视频播放器,支持通过自定义协议 graph-video:// 从外部应用唤起并播放指定视频。
- 支持拖拽或选择本地视频文件播放
- 支持自定义协议
graph-video://远程唤起(冷启动 & 热启动均支持) - 支持 URL 参数控制播放行为(起始时间、速率、音量等)
- 支持视频 seek(Range 请求,自定义
video-src://协议提供)
URL 结构为 scheme://authority/path。本协议 authority 为空,因此固定是三个斜杠:
| 平台 | 绝对路径示例 | 完整 URL |
|---|---|---|
| macOS / Linux | /Users/foo/video.mp4 |
graph-video:///Users/foo/video.mp4 |
| Windows | C:\Users\foo\video.mp4 |
graph-video:///C:/Users/foo/video.mp4 |
Windows 路径需将反斜杠
\改为正斜杠/。Windows 平台的协议注册和路径兼容性尚未完整测试,欢迎反馈。
macOS / Linux:
graph-video:///Users/username/Videos/video.mp4
Windows:
graph-video:///C:/Users/username/Videos/video.mp4
graph-video:///绝对路径/视频文件.mp4?参数1=值1&参数2=值2
| 参数 | 类型 | 示例 | 缺省行为 | 说明 |
|---|---|---|---|---|
t |
时间 | t=90 |
从头播放(0 秒) | 起始播放时间 |
end |
时间 | end=120 |
播放到视频结尾 | 到达该时间点后自动暂停 |
speed |
浮点数 | speed=1.5 |
正常速率(1.0) | 播放速率,支持 0.25 ~ 4.0 |
loop |
0/1 |
loop=1 |
不循环(0) | 视频结束后是否重头循环 |
muted |
0/1 |
muted=1 |
不静音(0) | 是否静音启动 |
volume |
0~1 |
volume=0.8 |
使用上次音量(浏览器默认) | 初始音量,0 为静音,1 为最大 |
title |
字符串 | title=第三章 |
显示视频文件名 | 界面底部显示的标题文字 |
支持以下四种格式,均表示同一时间点:
| 格式 | 示例 | 含义 |
|---|---|---|
| 纯秒数 | t=90 |
90 秒 |
MM:SS |
t=1:30 |
1 分 30 秒 |
HH:MM:SS |
t=1:30:00 |
1 小时 30 分 |
XhYmZs |
t=1m30s |
1 分 30 秒 |
graph-video:///Users/username/Videos/demo.mp4?t=30
graph-video:///Users/username/Videos/demo.mp4?t=30&end=90
graph-video:///Users/username/Videos/demo.mp4?t=1m30s&speed=1.5&title=第三章
graph-video:///Users/username/Videos/demo.mp4?loop=1&muted=1
graph-video:///Users/username/Videos/demo.mp4?t=60&end=180&speed=1.25&volume=0.6&title=课时3
路径中的中文和特殊字符无需手动编码,直接写即可:
graph-video:///Users/username/Desktop/OBS录制/a.mp4?t=30
pnpm install
pnpm tauri devpnpm tauri build --debug
open src-tauri/target/debug/bundle/macos/graph-video-player.app打开 .app 一次后,macOS 会注册 graph-video:// 协议。之后可在浏览器地址栏或终端触发:
open "graph-video:///Users/username/Videos/demo.mp4?t=30&title=测试"