Windows Media Player COM 自动化可以在 VBS 中运行,但不能在 Python 中运行

2024-01-02

我尝试使用 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 http://msdn.microsoft.com/en-us/library/windows/desktop/dd564881%28v=vs.85%29.aspx, 不管我做什么。

该问题出现在 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消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows Media Player COM 自动化可以在 VBS 中运行,但不能在 Python 中运行 的相关文章

随机推荐