如何用Python获取Windows系统中正在播放歌曲的当前已播放时长?
如何用Python获取Windows系统中正在播放歌曲的当前已播放时长?
嘿,我刚好碰到过类似的需求,给你几个实用的思路来解决这个问题:
1. 深挖WinRT API的隐藏属性,解决暂停判断问题
你之前用winrt.windows.media.control只拿到了歌曲名和作者,但其实这个API里藏着能帮你解决问题的关键信息:
- 首先,通过
GlobalSystemMediaTransportControlsSession对象调用get_playback_info()方法,能拿到GlobalSystemMediaTransportControlsSessionPlaybackInfo实例,里面的playback_status属性可以直接判断当前媒体是播放中还是暂停状态——这样你之前自己模拟计时的方案就能修复了:检测到暂停时就停止计时,播放时再继续走时间。 - 另外,这个
PlaybackInfo实例里还有个position属性,像Spotify、Apple Music这类正规流媒体桌面端都会主动上报当前的已播放时长,你可以直接读取这个值,完全不需要自己手动计时!
给你一段简单的示例代码参考:
import winrt.windows.media.control as wmc # 获取当前活跃的媒体会话 session_manager = wmc.GlobalSystemMediaTransportControlsSessionManager.request_async().get() current_session = session_manager.get_current_session() if current_session: # 获取播放信息 playback_info = current_session.get_playback_info() # 读取播放状态(可选值:Playing/Paused/Stopped等) playback_status = playback_info.playback_status # 读取已播放时长(单位是100纳秒,转换为秒) elapsed_ticks = playback_info.position.duration elapsed_seconds = elapsed_ticks / 10_000_000 # 10^7纳秒=1秒 print(f"当前播放状态:{playback_status}") print(f"已播放时长:{elapsed_seconds:.2f}秒")
不过要注意,有些小众流媒体应用可能没实现这个属性的上报,这时候再 fallback 到“播放状态检测+自计时”的组合方案就靠谱多了。
2. Shazam方案的优化思路
如果你还是想用Shazam的识别思路,可以把它和WinRT API结合起来:用Shazam识别歌曲拿到总时长,然后用WinRT的播放状态+自计时来计算已播放时长,这样精度会比单纯依赖Shazam返回的时长高很多,也能解决暂停计时的问题。
总结下来,优先用WinRT原生的position属性,兼容性不好的应用再用组合方案,基本能满足你同步动画的精度需求。
备注:内容来源于stack exchange,提问作者Enderek




