我尝试使用 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 吗?我该如何进一步调试它?
最佳答案
看来问题是 time.sleep 不发送窗口消息。使用其他一些超时函数来发送窗口消息。
原因是 Windows Media Player 是一个 STA 组件,很可能是因为它最常用作图形组件。它的一些内部结构依赖于常规的消息泵送,很可能是一个高精度的多媒体计时器线程,它发送窗口消息进行通信,或者它可能依赖于实际的 WM_TIMER 消息。
关于python - Windows Media Player COM Automation 从 VBS 运行,但不能从 Python 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157138/