我尝试使用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
消息。