我尝试使用Windows Media Player通过COM播放音频文件。 以下代码在VBS中正常工作:
Set wmp = CreateObject("WMPlayer.OCX")
wmp.settings.autoStart = True
wmp.settings.volume = 50
wmp.URL = "C:\Windows\Media\tada.wav"
while wmp.Playstate <> 1
WSH.Sleep 100
wend
不幸的是,相同的代码在Python中没有播放任何声音:
import win32com.client
import time
wmp = win32com.client.dynamic.Dispatch("WMPlayer.OCX")
wmp.settings.autoStart = True
wmp.settings.volume = 50
wmp.URL = r"C:\Windows\Media\tada.wav"
while wmp.Playstate != 1:
time.sleep(0.1)
COM交互似乎很难,因为我可以创建新的媒体对象并查询有关它们的信息。只是没有声音可以听到。
>>> media = wmp.newMedia(r"C:\Windows\Media\tada.wav")
>>> media.durationString
'00:01'
>>> wmp.currentMedia = media
>>> wmp.play() # No sound audible.
>>> wmp.PlayState
9 # wmppsTransitioning
PlayState
始终报告为wmppsTransitioning
,无论我做什么。
问题出现在Python2.7,3.2和3.3以及最后两个PyWin32版本(218和219)上。操作系统是Windows 7 x64,Python解释器都是32位编译的。 WMPlayer.OCX
可以成功加载,COM可以正常运行,所以我不认为这是一个32位/ 64位的DLL问题。
知道为什么它适用于VBS而不适用于Python?我怎么能进一步调试呢?
答案 0 :(得分:4)
问题似乎是time.sleep
没有抽取窗口消息。使用其他一些泵窗口消息的超时功能。
原因是Windows Media Player是STA组件,很可能是因为它最常用作图形组件。它的一些内部依赖于常规消息泵送,很可能是高精度多媒体定时器线程,它发送窗口消息以进行通信,或者它可能取决于实际的WM_TIMER
消息。