支持两部分:
axum服务端:接收弹幕并通过 WebSocket 广播- 桌面悬浮弹幕层(原生窗口):置顶、透明、点击穿透,支持按显示器覆盖,也支持自动追踪前台窗口(macOS)
先确保当前终端可用 cargo。如果刚安装 Rust,请重开一个终端。
支持 Windows / macOS / Linux。
- 默认同时启动服务端 + 悬浮层:
cargo run- macOS 默认会自动追踪当前前台窗口,适合 Keynote / 会议窗口 / 演示窗口。
- Windows / Linux 默认按显示器显示弹幕。
- 只启动服务端:
cargo run -- --server- 只启动悬浮层(要求服务端已运行在本机
3000端口):
cargo run -- --overlay- 如果你想强制切回“按显示器覆盖”的模式,可以使用:
cargo run -- --follow-monitor- 如果你想显式开启“有全屏窗口就切到对应屏幕,否则按显示器显示”的混合模式,可以使用:
cargo run -- --follow-fullscreen- 如果你想显式开启“自动追踪前台窗口”的模式,可以使用:
cargo run -- --follow-window- 启动包含悬浮层的模式时,在“按显示器覆盖”或“全屏优先”模式下会自动打印显示器列表并等待你输入编号。
例如:
[0] Color LCD (primary)
[1] EPSON Projector
请选择弹幕显示器编号(回车默认 0,输入 -1 为不显示悬浮层):如果只运行服务端(--server),不会进入显示器选择交互。
- macOS 默认启用“全屏优先”模式:当前台窗口基本占满某个屏幕时,弹幕层会切到对应屏幕;否则回到你选择的显示器覆盖模式。
- macOS 的
--follow-window现在默认优先走原生 helper window 路线:独立NSWindow + WKWebView承载透明弹幕层,目的是更接近腾讯会议这类会议软件在原生全屏上的 overlay 形态。 - macOS 的窗口跟随优先基于 Quartz / Window Server 的具体窗口实体(
CGWindowID)同步 bounds,而不是只按前台应用做模糊匹配。 --follow-fullscreen只会在检测到前台窗口基本占满某块屏幕时才切过去;普通窗口状态下会保持显示器覆盖,不会一直追着窗口跑。多显示器下如果你已经选定了弹幕显示器,其它显示器上的全屏窗口不会再把弹幕层抢走。- helper window 会跟随活动 Space 变化,并尽量以全屏辅助窗口的方式参与显示;同时会尽量加入其他应用的 Space / 全屏集合。如果你想切回相对保守的 helper panel 路线,可以执行:
DANMAKU_MACOS_HELPER_WINDOW_KIND=panel cargo run -- --follow-window - macOS 悬浮层默认会尝试使用更高的 assistive-tech 级别窗口层级;如果想临时回退做对比,可以用
DANMAKU_MACOS_WINDOW_LEVEL=1000 cargo run -- --follow-window或DANMAKU_MACOS_WINDOW_LEVEL=26 cargo run -- --follow-window - 如果你想临时回退到旧的
eframe路线,可以执行:DANMAKU_MACOS_OVERLAY_BACKEND=eframe cargo run -- --follow-window - 首次使用
--follow-window时,macOS 可能会弹出“辅助功能(Accessibility)”授权提示。请允许当前终端或该应用,否则系统不会把全屏窗口的焦点与位置提供给程序。 - 为了让 Quartz 的窗口列表在原生全屏场景下更稳定,macOS 也建议授予“屏幕录制(Screen Recording)”权限;未授权时,
CGWindowListCopyWindowInfo返回的窗口元数据可能被系统过滤。 - 已补充 Keynote 支持:Keynote / 腾讯会议 / 演示类全屏窗口会优先通过辅助功能接口跟踪;未授权时会退回普通窗口枚举,因此全屏 Space 场景可能不稳定。
- 如果当前前台窗口不可用,会暂时保留最近一次的窗口位置;也可以改用
--follow-monitor回到传统的整屏覆盖模式。
推荐使用 Cloudflare Tunnel,把本机 3000 端口映射成公网 HTTPS 地址。
- Windows:
winget install --id Cloudflare.cloudflared -e - macOS:
brew install cloudflared
默认启动时会询问是否开启 Tunnel。
可通过参数控制:
--tunnel:强制开启,不询问--no-tunnel:强制关闭,不询问--edge-ip-version 4|6|auto:指定 tunnel 使用 IPv4/IPv6(默认auto自动判定)
示例:
cargo run -- --server --tunnel
cargo run -- --all --no-tunnel
cargo run -- --server --tunnel --edge-ip-version 4脚本启动后,终端会打印一个类似:
https://xxxx.trycloudflare.com
在任意设备浏览器打开:
https://xxxx.trycloudflare.com/client
即可发送弹幕到你本地服务端。
- 发送端网页:
http://127.0.0.1:3000/client - (可选)浏览器屏幕页:
http://127.0.0.1:3000/screen - 弹幕投递接口:
POST /api/danmaku
示例请求体:
{
"text": "你好,世界",
"color": "#ffffff",
"speed": 90
}字段说明:
text:必填,最多 120 字符color:可选,#RRGGBBspeed:可选,40-240(像素/秒)
- 感谢 Qiuly 进行 macOS 系统环境测试。
- 感谢 Cloudflare 提供 Tunnel 服务支持。