Windows媒体播放器COM自动工作从VBS,但不是从Python

我尝试使用Windows Media Player通过COM播放audio文件。 以下代码在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交互似乎工作艰难,因为我可以创build新的媒体对象和查询有关它们的信息。 只是没有声音可以听到。

 >>> 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)都出现这个问题。 OS是Windows 7 x64,Python解释器都是为32位编译的。 WMPlayer.OCX可以成功加载和COM的作品,所以我不认为这是一个32位/ 64位的DLL问题。

任何想法,为什么它适用于VBS而不是Python? 我怎么能进一步debugging呢?

看来问题是time.sleep不会泵送窗口消息。 使用一些其他的超时函数泵窗口消息。

原因是Windows Media Player是一个STA组件,很可能是因为它最常用作图形组件。 它的一些内部依赖于常规的消息抽取,很可能是一个高精度的多媒体计时器线程,它发送窗口消息进行通信,或者可能取决于实际的WM_TIMER消息。