需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3852字,纯文字阅读大概需要6分钟。
内容图文
我的应用程序从众多音乐播放器中检索当前播放的歌曲.但是,我在实现Zune和Windows Media Player方面遇到了很大麻烦.
我已经做了很多关于这个主题的谷歌搜索,不幸的是它只是让我越来越困惑.
我通常会为其他应用程序做些什么:
>每4秒对所有打开的窗口进行迭代
>获取所有窗口的标题
>检查模式的标题(即“ – Spotify”)
>如果有,请调整输出标题.
WMP标题中没有当前播放的歌曲.
Zune确实如此,但它在标题,专辑和艺术家之间每隔几秒钟就会旋转一次.尽管可能,但使用我当前的方法跟踪这是非常不可靠的.
Windows媒体播放器
我也试过在Windows媒体播放器上使用COM组件.
import win32com.client
wmp = win32com.client.gencache.EnsureDispatch('WMPlayer.OCX')
# some function I don't have here, it retrieves the current playing song
# and other data
这个问题需要你以编程方式启动WMP,这对用户来说非常不友好
那么,我发现了什么? This SO post重定向到WMP.dll.但据我所知,它与COM有同样的问题,你必须以编程方式启动它.如果没有,我真的想要如何在python中使用该DLL的一些方向.
还有另外一个不那么hacky的解决方案,即为WMP编写插件,让我的用户下载该插件并从该插件中检索数据.我宁愿不去那里,因为我没有任何C语言的经验,也不想深入研究插件文档.
Zune播放器
一种方法是循环通过三个标题状态,确定它当前处于哪个状态并找到另外两个的位置.
IE:
前5秒标题是:Super_song
接下来的5秒标题是:By Power_artist
接下来的5秒标题是:Good_album(日期)
所以我可以通过制作日期的正则表达式(总是在那里)确定专辑标题的时间,然后等待几秒钟找到标题和艺术家.
这显然不是一个很好的解决方案,因为它需要一段时间而且它也不是非常可靠,(如果歌曲名称包含日期,那该怎么办)
接下来的问题是它也不一致,有时候标题只会持续几分钟.不知道为什么.
所以,继续下一个方法.
有一个名为ZuneNowPlaying的应用程序.这个“不知何故”从Zune获取当前播放的歌曲并将其放入注册表中,这个东西不能用我的草率标题方法,因为它在歌曲改变的瞬间改变了注册表.立即.
这是我在我的程序的工作版本中使用的解决方案,但许多用户报告说它根本不起作用,没有任何反应.我检查了程序,它不能一直可靠地更改注册表.我不知道为什么,我不知道如何解决它.因此,这个解决方案也被包括在内.
Is the fact that it is using the name “MsnMsgrUIManager”#000000”>
causing the zune software to send it information about which song is
playing? Is there a way to get this information without this kind of
hack?
这可以在Zune Now Playing应用程序的讨论中找到.遗憾的是,源代码不可用,至少我找不到它.有人对此有更多了解吗?
我听说过的第三种方法是dll.它被称为ZuneShell.dll.我不记得我在哪里读到它,也不能通过谷歌找到它,因为所有结果都是“ZuneShell.dll是病毒吗?”.
再一次,我遇到了一个问题,我不知道如何使用它,即使我有文档,哎呀,如果它甚至是我一直在寻找的.
可能会考虑的替代方向
在浏览这个主题时,我看到人们谈论直接从GUI中检索数据.我不确定我的记忆是多么合法,可能甚至是多么正确,但是如果有可能有人可以将我重新引导到更多这方面呢?
还有别的,真的.
解决方法:
我在C中使用代码来打印当前在WMP中播放的媒体的名称.这是一个简单的控制台应用程序(78行代码).
脚步:
1)实现了一个实现IUnknown,IOleClientSite,IServiceProvider和IWMPRemoteMediaServices的基本COM对象.使用ATL模板CComObjectRootEx,这很简单(有点,您的里程可能会有所不同).需要(简单)代码的唯一方法是IServiceProvider :: QueryService和IWMPRemoteMediaServices :: GetServiceType.所有其他方法可能返回E_NOTIMPL
2)实例化“WMPlayer.OCX”COM对象(在我的例子中,通过CoCreateInstance)
3)通过QueryInterface从对象中检索IOleObject接口指针
4)从1)中看到的类中实现一个对象(我使用CComObject<> :: CreateInstance模板)
5)使用从3)获得的接口的SetClientSite方法,将指针传递给OleClientSite实现.
6)在SetClientSite调用期间,WMP将回调您:fisrt请求IServiceProvider接口指针,第二次调用QueryService方法,请求IWMPRemoteMediaServices接口指针.返回IWMPRemoteMediaServices的实现,第三,将通过GetServiceType再次调用.然后,您必须返回“远程”.您现在已连接到WMP运行实例
7)查询COM对象以获取IWMPMedia接口指针
8)如果7)没有给出NULL,请阅读IWMPMedia :: name属性.
9)完成
所有上述内容均使用VS2010 / Windows Seven进行测试,并且运行WMP(如果没有运行Media Player进程,则不执行任何操作).
我不知道yoy是否可以/想要在Python中实现COM接口和对象.如果您对我的C代码感兴趣,请告诉我.您可以在C DLL中使用该代码,然后从python中调用它.
内容总结
以上是互联网集市为您收集整理的需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲全部内容,希望文章能够帮你解决需要一种方法从Zune和Windows Media Player使用Python检索当前播放的歌曲所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。