2013-05-05 268 views
2

我使用的是Windows 64位。我試過了幾個庫。無法'pygame工作,couldnt'python安裝在Python 2.7。使用python播放.mp4並檢查它是否仍在播放

最終得到了蟒蛇的mplayer。

安裝了https://pypi.python.org/pypi/mplayer.py/

,我可以得到一個聲音文件播放

import mplayer 
p = = mplayer.Player(args=(), stdout=mplayer.PIPE, stderr=None, autospawn=True) 
p.loadfile('C:\mymusic.mp4') 
p.pause() 

出於某種原因,你必須調用暫停命令來獲得的音頻播放。

當我想要開始另一個聲音播放時出現主要問題。如果我只是在另一個文件上調用loadfile,它將已經在播放,所以調用暫停方法將會暫停而不是播放它。如果第一個文件已完成播放,則必須調用暫停以播放它。

此外,mplayer似乎添加在音頻文件末尾的有線跳躍......但我想我可以忍受這一點,如果我必須。

所以我需要一些方法來檢查當前文件是否仍在播放。

該庫似乎沒有這方面的方法。

有沒有更好的方法來做到這一點?

回答

1

由於此實現的流式性質以及缺少文檔,這樣做有點尷尬。

不過,你這是怎麼做到這一點:

p = 'C:\\mymusic.mp4' 
    v = VideoPlayback_MPlayer.FromPath(p) 
    v.playAsync() 
    while v.isPlaying: 
     time.sleep(0.1) 

如果你有一個視頻播放器類是這樣的:

class VideoPlayback_MPlayer: 
    def __init__(self, path): 
     self.path = path 

    def playAsync(self): 
     import mplayer #pip install mplayer.py and also setup choco install mplayer myself via http://downloads.sourceforge.net/project/mplayer-win32/MPlayer%20and%20MEncoder/r37451%2Bg531b0a3/MPlayer-x86_64-r37451%2Bg531b0a3.7z?r=http%3A%2F%2Foss.netfarm.it%2Fmplayer%2F&ts=1442363467&use_mirror=tcpdiag 
     self.isPlaying = True 

     EOFDetectionArgs = "-msglevel global=6" 
     self.player = mplayer.Player(args=EOFDetectionArgs.split(), stderr=None, autospawn=True) 
     self.player.stdout.connect(self._EOFDetector) 
     self.player.loadfile(self.path) 
     self.player.pause() # someone says online this kicks in the audio http://stackoverflow.com/questions/16385225/play-mp4-using-python-and-check-if-while-it-is-still-playing  

    def _EOFDetector(self, stream): 
     if stream.startswith('EOF code:'): 
      self.isPlaying = False 

    @property 
    def done(self): 
     return not self.isPlaying 


    def play(self): 
     self.playAsync() 
     while self.isPlaying: 
      time.sleep(0.00001)   

    @staticmethod 
    def FromPath(path): 
     return VideoPlayback_MPlayer(path)