
SMTC背后的技术BetterLyrics如何监听Windows任意播放器正在播放的音乐【免费下载链接】BetterLyrics一款优雅且高度自定义的歌词可视化与全能音乐播放应用基于 WinUI3/Win2D 构建 | An elegant and deeply customizable lyrics visualizer versatile music player, built with WinUI3/Win2D项目地址: https://gitcode.com/jayfunc/BetterLyricsBetterLyrics是一款基于 WinUI3 构建的歌词可视化与音乐播放应用它能监听 Windows 上任意播放器正在播放的音乐——网易云、QQ音乐、Apple Music、LX Music甚至你没听过的播放器——并自动匹配歌词、专辑封面与翻译。这背后的秘密是 Windows 系统级的SMTCSystem Media Transport Controls系统媒体传输控件机制。今天我们把这套监听架构拆解给你看。一、什么是 SMTC为什么它是监听任意播放器的万能钥匙 ️Windows 10/11 自带一个全局机制任何音乐播放器调用系统 API 后都会向操作系统注册一个媒体会话Media Session也就是任务栏右下角正在播放小图标的来源。这个机制叫 SMTC它原本是为了系统统一的播放控制而设计。但开发者很快发现它的另一面只要是合规注册的播放器它的歌名、歌手、专辑、封面、播放进度、播放状态全都对系统敞开。BetterLyrics 借助开源库 WindowsMediaController 中的MediaManager来对接这一机制平台相关代码都封装在 MediaManagerProvider.cs。核心动作只需一行_mediaManager.Start()随后订阅六个系统事件系统事件触发时机BetterLyrics 的用途OnAnySessionOpened播放器启动并注册会话自动登记新播放源OnAnySessionClosed播放器退出清理会话、切换目标OnFocusedSessionChanged你点击了某个播放器窗口感知当前关注的播放器OnAnyMediaPropertyChanged歌曲信息变化切歌刷新歌曲信息、重新搜歌词OnAnyPlaybackStateChanged播放/暂停切换驱动歌词动画、任务栏进度OnAnyTimelinePropertyChanged播放时间轴变化逐秒同步歌词位置这些订阅就发生在 GsmtcService.cs 的 InitMediaManager 方法 中——Gsmtc即Global SMTC它是整个外部播放器监听的心脏一个平台无关的跨层服务。二、多播放器同时播放时如何锁定当前这首歌你完全可能一边开着网易云、一边开着 Apple Music。BetterLyrics 不会傻乎乎地抓第一个会话而是用一套清晰的优先级算法选出当前歌曲逻辑集中在 GetCurrentDesiredSession 方法内置播放器正在播放→ 绝对优先自己播的歌最该显示被聚焦的外部播放器正在播放→ 优先你在哪个窗口前就显示谁其他正在播放的外部播放器→ 兜底有系统焦点但已暂停的会话→ 显示暂停状态以上都不满足 → 依次降级直到放弃监听每当新会话出现RecordMediaSession 会把它自动登记进设置列表你在界面里就能对每个播放源单独配置是否监听、时间轴同步阈值、位置偏移、歌词/封面搜索源等对应模型是 MediaSourceProviderInfo.cs。三、从会话到歌曲三步刷新 智能防抖 选中会话只是第一步。MediaSessionProvider.cs 实现了统一的 IMediaSessionProvider 接口对外提供三种能力刷新媒体属性取回歌名、歌手、专辑、流派、封面缩略图刷新播放状态Playing / Paused / Stopped刷新时间轴当前播放位置、总时长值得注意的工程细节有两个防抖切歌瞬间系统可能连发多次属性变化OnAnyMediaPropertyChanged 用 1 秒防抖器合并处理避免重复搜索歌词秒级计时器ScrobbleTimerCallback 每秒检查播放进度播过一半才把这首歌记入本地播放历史也是 Last.fm Scrobble 的判定依据——这样切歌试听不会被误统计。四、识别具体播放器SessionId 上的正则小魔法 SMTC 会话自带一个 SessionId形如进程名或包名BetterLyrics 用一组正则来识别这是谁见 PlayerIdHelper.cs播放器识别特征网易云 / LyricEase 等cloudmusic.exe等QQ 音乐QQMusic.exeApple MusicAppleMusic.exe/AppleInc.AppleMusicWin_LX Musiclx-music-desktop.exe等BetterLyrics 自身37412.BetterLyrics_识别结果会触发定制化处理都在 OnAnyMediaPropertyChangedCoreAsync 中完成Apple Music把歌手 — 专辑打包塞在 Artist 字段里需要按—拆开还原网易云 / QQ 音乐会把歌曲 ID 藏在 Genres 字段中取出来后可以走更精确的歌词匹配识别后还会按播放源配置位置偏移PositionOffset与同步阈值补偿各家播放器上报时间的微小偏差保证歌词与声音严丝合缝。五、兜底方案当播放器不听话时 有些播放器不注册 SMTC或者进度上报不准。BetterLyrics 准备了两张备胎SSE 通道LX Music 专属检测到 LX Music 时启动 StartLXMusicSSE通过本地服务器的 Server-Sent Events 流拿到精确的播放进度和封面 URL断线还会自动重连内存读取器对于完全无法对接的播放器UniversalMemoryReaderProvider.cs 每秒打开目标进程按 MemoryReaderConfig 中用户提供的内存地址定义模块基址 指针链直接读出当前播放时间/总时长。这是高级玩家的核武器也是最后的防线。六、身份的双向性BetterLyrics 自己也是一个 SMTC 会话监听是双向的。当使用内置播放器播放本地音乐库时SmtcService.cs 通过 WinRT 的MediaPlayer注册属于自己的 SMTC 会话并开启停止按钮、响应全局快捷键。于是形成了优雅闭环BetterLyrics 既是监听者也是被监听者——当你切回内置播放优先级算法第 1 条立刻生效无缝接管。写在最后回看这套架构MediaManager 订阅系统事件 → 优先级算法锁定会话 → 三步刷新拿到歌曲数据 → 正则识别播放器做定制处理 → SSE/内存读取兜底。五步走完任意 Windows 播放器就都成了 BetterLyrics 的数据源。这也是开源社区的乐趣所在如果你想为自己的播放器适配更精准的歌词匹配PlayerIdHelper.cs 和 GsmtcService 目录 就是最好的起点。【免费下载链接】BetterLyrics一款优雅且高度自定义的歌词可视化与全能音乐播放应用基于 WinUI3/Win2D 构建 | An elegant and deeply customizable lyrics visualizer versatile music player, built with WinUI3/Win2D项目地址: https://gitcode.com/jayfunc/BetterLyrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考