自动化Windows媒体播放器

时间:2014-05-15 12:59:06

标签: python python-2.7

有关在Python中控制Windows Media Player的任何想法?我在网上找到了以下代码,运行正常,但没有播放音频。我正在使用win 7 64位机器

# 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 :(得分:1)

正如我在评论中提到的,我遇到了同样的问题。我试过了a ridiculous number of different approaches。它们都没有真正起作用,所以我不得不使用os.startfile来打开Windows媒体播放器播放我的声音文件。然而,就在今天,我有一个想法,这导致了另一种解决方案。这有点黑客,但它确实有效。从技术上讲,我仍然使用这种方法打开Windows媒体播放器,但我这样做是使用子进程,因此我可以使用更大的控制来允许该进程来抑制窗口。这使得它似乎没有辅助应用程序。为什么我不得不做一些如此奇怪的事情来获得一个我不知道的简单结果,但它是唯一有用的东西。如果你愿意,这是我的代码。

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.

再次确实令人遗憾的是,我只是为了播放声音而做了一些奇怪的事情,但就你所描述的而言,这是同样的问题,我希望这会有所帮助。

答案 1 :(得分:0)

想一想,它可能会帮助那些仍然面临这个问题的人。 您所要做的就是在Play()之后调用PlayItem()API。

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()

答案 2 :(得分:0)

它可以帮助我使用Windows Media COM。当我尝试它时,我需要做两个小修改以使其在Python Flask中起作用。

  1. 通过CoInitialize使其成为单线程,即pythoncom.CoInitialize()pythoncom.CoUninitialize()
  2. PumpWaitMessage,以保持MediaPlayer即while mp.PlayState != 1: pythoncom.PumpWaitingMessages()
  3. 正常工作