简体中文 | English
SMTC2MediaSession 是一个跨平台的局域网媒体播放状态同步与双向控制系统。
它能够捕获 Windows 系统的 SMTC (System Media Transport Controls) 媒体状态,并通过局域网低延迟地同步给 Android 客户端,在 Android 系统中生成一个虚拟的 MediaSession(媒体会话)。这不仅能让安卓端实时查看 Windows 上的播放进度、歌词或歌曲元数据,还支持通过安卓端(或连接到安卓端的智能手表、车载中控、锁屏及第三方歌词软件等)反向控制 Windows 上的多媒体播放(播放、暂停、上一首、下一首、进度条拖拽等)。
- 📡 局域网自动发现 (LAN Auto-Discovery):Windows 服务端通过 UDP 广播自身 IP 及端口,Android 客户端一键扫描并自动连接,无需手动输入 IP。
- 🎵 SMTC 媒体源过滤:支持刷新并选择需要监听的 Windows 媒体播放器(例如网易云音乐、QQ音乐、浏览器等),过滤掉不需要的背景音源。
- 📊 双向高精度同步:
- 状态同步:Windows 音频的播放/暂停状态、歌曲标题、歌手、专辑封面、播放总时长实时呈现。
- 进度同步:采用高精度推算算法,Android 客户端时间轴与 Windows 毫秒级同步。
- 🕹️ 反向媒体控制:
- 支持在 Android 客户端界面直接控制 Windows 播放器。
- 支持通过 Android 系统底层的 MediaSession 映射,用系统锁屏控件、下拉通知栏、蓝牙设备(如车载蓝牙按键)或智能手表等控制电脑端播放。
- 🔋 后台持续运行:Android 端采用带有系统常驻通知栏的 Foreground Service (前台服务),即使手机处于休眠锁屏状态,仍能保持后台稳定同步与连接。
- 打开终端,进入
desktop-client目录:cd desktop-client - 安装前端依赖:
pnpm install
- 启动开发调试模式:
pnpm run dev
- 编译打包生成 Windows 安装包 (
.exe/.msi):pnpm tauri build
- 可以直接在 GitHub Actions 编译产物中下载已打包好的
app-debug.apk。 - 或者使用 Android Studio 打开
android-client项目目录,连接真机或模拟器后,点击 Run 即可运行。
- 通知权限 (
android.permission.POST_NOTIFICATIONS):Android 13+ 系统中,为了使前台常驻同步服务正常运行,必须授予通知权限。
smtc2mediasession/
├── .github/workflows/ # GitHub Actions 自动化编译工作流
│ ├── build-android.yml # Android 客户端 APK 自动编译配置
│ └── build-desktop.yml # Windows 桌面端安装包自动编译配置
├── android-client/ # Android 客户端 (Kotlin)
│ ├── app/src/main/java/ # 源代码目录
│ │ └── com/example/smtcsync/
│ │ ├── MainActivity.kt # 主界面展示、连接管理与权限处理
│ │ ├── SyncService.kt # 后台前台同步服务,维护 WS 通信
│ │ ├── SyncClient.kt # WebSocket 客户端与局域网 UDP 自动发现
│ │ └── VirtualPlayer.kt# 虚拟播放器,实现 Android MediaSession 状态映射与控制注入
│ └── app/src/main/res/layout/# XML 布局目录
│ └── activity_main.xml # 主界面布局(支持屏幕超出时滚动)
└── desktop-client/ # Windows 服务端 (Tauri + Rust + HTML/JS/CSS)
├── src/ # 桌面端控制面板 UI (前端)
│ ├── index.html # 控制面板结构 (调整为左栏 42% 操控/右栏 58% 状态监视)
│ ├── main.ts # 界面逻辑交互及 Tauri IPC 绑定
│ └── styles.css # 全局样式系统
└── src-tauri/ # Rust 后端核心逻辑
├── src/
│ ├── main.rs # 应用启动入口
│ ├── lib.rs # 路由配置、Tauri Commands 挂载
│ ├── media_listener.rs# 调用 Windows API 捕获 SMTC 状态
│ ├── server.rs # Axum WebSocket 服务端,负责消息收发
│ ├── discovery.rs # 异步 UDP 服务端,广播当前主机 IP 端口
│ └── protocol.rs # 双端 WebSocket 传输消息协议定义
└── Cargo.toml # Rust 依赖声明
本系统由 Rust / Tauri 桌面端服务 与 Kotlin Android 客户端 组成,通过局域网(WebSocket + UDP 广播)实现无缝连接。
graph TD
subgraph "Windows PC (服务端)"
A[音乐播放器] -->|SMTC| B[Tauri 桌面端应用]
B -->|media_listener.rs| C[系统媒体监听器]
C -->|server.rs| D[WebSocket 服务端]
E[discovery.rs] -->|UDP 服务广播| F((局域网 LAN))
D -->|WS 协议数据流| F
end
subgraph "Android Device (客户端)"
F -->|UDP 监听自动发现| G[SyncClient]
F -->|WebSocket 连接| G
G -->|SyncService| H[后台前台服务]
H -->|VirtualPlayer| I[安卓系统 MediaSession]
I -->|连接与反控制| J[系统锁屏 / 智能手表 / 蓝牙车载]
I -->|数据接口| K[第三方应用]
end
J -.->|反向媒体控制指令| I
I -.->|SKIP_PREVIOUS / SKIP_NEXT / PLAY / PAUSE / SEEK| H
H -.->|WS 发送控制指令| G
G -.->|WebSocket| D
D -.->|Windows Windows.Media.Control| B
Copyright (c) 2026 ITManCHINA
本项目基于 GPL-3.0-only 许可证开源。