You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动