Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SMTC to Android MediaSession (SMTC2MediaSession)

简体中文 | 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 (前台服务),即使手机处于休眠锁屏状态,仍能保持后台稳定同步与连接。

快速上手

1. 运行 Windows 服务端 (Desktop)

环境准备

运行与构建

  1. 打开终端,进入 desktop-client 目录:
    cd desktop-client
  2. 安装前端依赖:
    pnpm install
  3. 启动开发调试模式:
    pnpm run dev
  4. 编译打包生成 Windows 安装包 (.exe / .msi):
    pnpm tauri build

2. 运行 Android 客户端

编译与安装

  • 可以直接在 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
Loading

许可证

Copyright (c) 2026 ITManCHINA

本项目基于 GPL-3.0-only 许可证开源。

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages