自动化Windows Media Player

-1 投票
3 回答
8592 浏览
提问于 2025-04-18 06:39

有没有人知道怎么用Python控制Windows Media Player?我在网上找到了一段代码,运行起来没问题,但就是没有声音。我用的是64位的Windows 7电脑。

# this program will play MP3, WMA, MID, WAV files via the WindowsMediaPlayer
from win32com.client import Dispatch
mp = Dispatch("WMPlayer.OCX")
#tune = mp.newMedia("./SleepAway.mp3")
tune = mp.newMedia("./plays.wav")
mp.currentPlaylist.appendItem(tune)
mp.controls.play()
raw_input("Press Enter to stop playing")
mp.controls.stop()

3 个回答

0

我在使用Windows Media COM的时候发现了一些小技巧。当我尝试的时候,需要做两个小改动才能在Python Flask中正常工作。

  1. 首先要调用CoInitialize,这样可以让它在单线程中运行,也就是要加上 pythoncom.CoInitialize()pythoncom.CoUninitialize() 这两行代码。
  2. 然后要用PumpWaitMessage来保持MediaPlayer的运行,也就是要加上 while mp.PlayState != 1: pythoncom.PumpWaitingMessages() 这段代码。
1

我想这可能对那些仍然遇到这个问题的人有帮助。你只需要在调用 Play() 之后,再调用 PlayItem() 这个接口就可以了。

from win32com.client import Dispatch
from time import sleep

mp = Dispatch("WMPlayer.OCX")
tune = mp.newMedia("./plays.wav")
mp.currentPlaylist.appendItem(tune)
mp.controls.play()
sleep(1)
mp.controls.playItem(tune)
raw_input("Press Enter to stop playing")
mp.controls.stop()
1

正如我在评论中提到的,我也遇到了同样的问题。我尝试了很多不同的方法,但都没有成功,所以我只能用os.startfile来打开Windows媒体播放器播放我的音频文件。不过,就在今天,我突然想到一个主意,找到了一个替代方案。这个方法有点“黑科技”,但确实有效。技术上来说,我还是在用这个方法打开Windows媒体播放器,但我通过subprocess来实现,这样我就可以更好地控制这个过程,并且可以隐藏窗口。这样看起来就像是没有其他应用程序在播放音频。为什么我为了得到这么简单的结果要做这么奇怪的事情,我也不知道,但这是唯一有效的方法。如果你需要的话,我可以分享我的代码。

import subprocess
import threading

def windowsmedia(filename):
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    a = subprocess.call('C:\\Program Files (x86)\\Windows Media Player\\wmplayer.exe /play /close "C:/Users/Student/Documents/notes/file.mp3"',startupinfo=startupinfo)

def startmp3(filename):
    mythread = threading.Thread(target=windowsmedia,args=[filename])
    mythread.start()
    time.sleep(15) #You might want to extend this... I just give it 15 seconds to complete before killing the process. It shouldn't be too hard to read the exact length from the file and wait that, or add an interrupt, but that was somewhat unnecessary for my purposes.
    pkill("wmplayer") #This is a function of my own but it basically just kills the process. It shouldn't be too hard to reproduce.

再次说一遍,真的很遗憾我为了播放一个声音要做这么奇怪的事情,但根据你描述的情况,这也是同样的问题,希望这能对你有所帮助。

撰写回答