当前位置: 移动技术网 > IT编程>脚本编程>Python > python实现媒体播放器功能

python实现媒体播放器功能

2018年04月23日  | 移动技术网IT编程  | 我要评论

青果校园主题曲,柳树的作用,高品质音乐论坛

本文实例为大家分享了python实现媒体播放器功能的具体代码,供大家参考,具体内容如下

playMP3.py

# -*- coding: utf-8 -*- 
import wx; 
import wx.media; 
import os; 
import SPrint; 
import mediaStateBar; 
import mediaList; 
import SaveLog; 
import MediaItem; 
woldcart = "media files|*.*|avi|*.avi|rmvb|*.rmvb|rm|*.rm|wma|*.wma|mp3|*.mp3"; 
class MediaFrame(wx.Frame): 
  def __init__(self): 
    wx.Frame.__init__(self,None,wx.NewId(),u"媒体播放器",pos=wx.DefaultPosition,size=(500,500)); 
    self.media = ''; 
    try: 
      self.media = wx.media.MediaCtrl(self,style=wx.SIMPLE_BORDER, 
                       #szBackend=wx.media.MEDIABACKEND_DIRECTSHOW 
                       #szBackend=wx.media.MEDIABACKEND_QUICKTIME 
                       #szBackend=wx.media.MEDIABACKEND_WMP10 
                       ); 
      self.media.Bind(wx.media.EVT_MEDIA_LOADED,self.mediaLoaded); 
      self.media.Bind(wx.media.EVT_MEDIA_STATECHANGED,self.mediaStateChange) 
    except NotImplementedError: 
      self.Destroy() 
      raise; 
    self.listView = ''; 
    self.item = MediaItem.MediaItem(); 
    self.sb = mediaStateBar.MediaStateBar(self); 
    self.SetStatusBar(self.sb); 
    self.log = SaveLog.SaveLog(); 
    #self.log.test(); 
    self.menu = wx.Menu() 
    self.openMenu = self.menu.Append(wx.NewId(),u"打开文件"); 
    self.Bind(wx.EVT_MENU,self._openFile,self.openMenu); 
    self.quitMenu = self.menu.Append(wx.NewId(),u"退出"); 
    self.Bind(wx.EVT_MENU,self.quit,self.quitMenu); 
    self.viewMenu = wx.Menu(); 
    self.listMenu = self.viewMenu.Append(wx.NewId(),u"打开播放列表"); 
    self.Bind(wx.EVT_MENU,self.openList,self.listMenu); 
    self.loadListMenu = self.viewMenu.Append(wx.NewId(),u"加载播放列表"); 
    self.Bind(wx.EVT_MENU,self.loadMediaList,self.loadListMenu); 
    self.saveListMenu = self.viewMenu.Append(wx.NewId(),u"保存播放列表") 
    self.Bind(wx.EVT_MENU,self.saveMediaList,self.saveListMenu); 
    menuBar = wx.MenuBar(); 
    menuBar.Append(self.menu,u"文件") 
    menuBar.Append(self.viewMenu,u"播放列表") 
    self.SetMenuBar(menuBar); 
    self.slider = wx.Slider(self,wx.NewId(), 0,0,100); 
    self.Bind(wx.EVT_SLIDER,self.onSeek,self.slider); 
    self.btnGroupSizer = wx.BoxSizer(wx.HORIZONTAL); 
    self.btnGroupSizer.Add((5,5),0) 
    self.playBtn = self.createButton("./pic/play.png",self.playMp3,u"播放"); 
    self.playBtn.Disable() 
    self.btnGroupSizer.Add(self.playBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.pauseBtn = self.createButton("./pic/pause.png",self.pauseMp3,u"暂停"); 
    self.pauseBtn.Disable() 
    self.btnGroupSizer.Add(self.pauseBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.stopBtn = self.createButton("./pic/stop.png",self.stopMp3,u"停止"); 
    self.stopBtn.Disable() 
    self.btnGroupSizer.Add(self.stopBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.preBtn = self.createButton("./pic/pre.png",self.preMp3,u"前一个"); 
    self.preBtn.Disable() 
    self.btnGroupSizer.Add(self.preBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.nextBtn = self.createButton("./pic/next.png",self.nextMp3,u"下一个"); 
    self.nextBtn.Disable() 
    self.btnGroupSizer.Add(self.nextBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.openBtn = self.createButton("./pic/media.png",self._openFile,u"打开文件"); 
    #self.openBtn.Disable() 
    self.btnGroupSizer.Add(self.openBtn); 
    self.btnGroupSizer.Add((5,5),0) 
    self.listBtn = self.createButton("./pic/list.png",self.openList,u"打开列表"); 
    #self.listBtn.Disable() 
    self.btnGroupSizer.Add(self.listBtn) 
    self.btnGroupSizer.Add((5,5),0) 
    self.volSlider = wx.Slider(self,wx.NewId(), 0,0,100); 
    self.Bind(wx.EVT_SLIDER,self.volumeSeek,self.volSlider); 
    self.btnGroupSizer.Add(self.volSlider) 
    self.btnGroupSizer.Add((5,5),0) 
    self.volTxt = wx.StaticText(self,wx.NewId(),"") 
    self.btnGroupSizer.Add(self.volTxt) 
    self.btnGroupSizer.Add((5,5),0) 
    mainSizer = wx.BoxSizer(wx.VERTICAL); 
    mainSizer.Add(self.media,1,wx.EXPAND|wx.ALL,5); 
    #mainSizer.Add((5,5),0) 
    mainSizer.Add(self.slider,0,wx.EXPAND|wx.ALL,5); 
    #mainSizer.Add((2,2),0) 
    mainSizer.Add(self.btnGroupSizer,0,wx.EXPAND|wx.ALL,5); 
    #mainSizer.Add((2,2),0) 
    self.SetSizer(mainSizer); 
    self.Layout(); 
    self.timer = wx.Timer(self) 
    self.Bind(wx.EVT_TIMER,self.onTimer); 
    self.timer.Start(200); 
  def createButton(self,img,clickFun,tip=""): 
    bmp = wx.Bitmap(img, wx.BITMAP_TYPE_PNG); 
    btn = wx.BitmapButton(self,wx.NewId(),bmp); 
    if tip != '' : btn.SetToolTipString(tip); 
    btn.Bind(wx.EVT_BUTTON,clickFun); 
    return btn; 
  def quit(self,event): 
    self.Destroy(); 
  def playMp3(self,e): 
    if self.item != '': 
      self.media.Play() 
    # self.media.SetInitialSize() 
  def pauseMp3(self,e=''): 
    self.media.Pause() 
  def stopMp3(self,e=''): 
    self.media.Stop() 
  def preMp3(self,e): 
    if self.item!='': 
      self.item = self.log.getPreItem(self.item.index) 
      if self.item != '': 
        self.playMedia(self.item.url,self.item.fileName); 
  def nextMp3(self,e): 
    if self.item!='': 
      self.item = self.log.getNextItem(self.item.index) 
      if self.item != '': 
        self.playMedia(self.item.url,self.item.fileName); 
  def onSeek(self,event): 
    self.media.Seek(self.slider.GetValue()) 
  def callAfterPlayMedia(self,url): 
    #self.media.SetInitialSize(); 
    self.media.Play(); 
  def playMedia(self,url,filename): 
    #print SPrint.encodeFromSystem( u"播放文件: " ) , SPrint.encodeFromSystem(url) ; 
    if self.media.Load(url) != True: 
      return ; 
    self.item = MediaItem.MediaItem(); 
    self.item.fileName = filename; 
    self.item.url = url; 
    self.SetTitle(filename) 
    self.SetStatusText(filename,1) 
    #wx.FutureCall(2000,self.callAfterPlayMedia,url); 
  def _openFile(self,event): 
    dialog = wx.FileDialog(self,u"打开文件",'F://movie//',"",woldcart,style=wx.OPEN|wx.CHANGE_DIR) 
    if dialog.ShowModal() == wx.ID_OK: 
      self.playMedia(dialog.GetPath(),dialog.GetFilename()) 
    dialog.Destroy(); 
  def cellRemove(self,url,all=False): 
    if all == True: 
      self.stopMp3() 
      self.item = ''; 
      return ; 
    if self.item.url == url: 
      self.stopMp3(); 
      self.item = ''; 
  def volumeSeek(self,evt): 
    #print float(self.volSlider.GetValue()/100); 
    self.media.SetVolume(self.volSlider.GetValue()/100.0) 
    self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%') 
  def mediaLoaded(self,e): 
    print "media loaded!" 
    self.media.Play(); 
    self.slider.SetRange(0,self.media.Length()); 
    self.item.length = self.getAccurateTime(self.media.Length()/1000); 
    if self.log.addItem(self.item): 
      if self.listView != '': 
        self.listView.reflash(self.log); 
    if self.log.haveNextItem(self.item.index): 
      self.nextBtn.Enable(); 
    else: 
      self.nextBtn.Disable() 
    if self.log.havePreItem(self.item.index): 
      self.preBtn.Enable() 
    else: 
      self.preBtn.Disable(); 
    self.volSlider.SetValue(self.media.GetVolume()*100); 
    self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%') 
  def mediaStateChange(self,evt): 
    if self.media.GetState() == wx.media.MEDIASTATE_PAUSED: 
      self.playBtn.Enable() 
      self.pauseBtn.Disable() 
      self.stopBtn.Enable(); 
      self.SetStatusText(u"暂停") 
    elif self.media.GetState() == wx.media.MEDIASTATE_PLAYING: 
      self.playBtn.Disable() 
      self.pauseBtn.Enable() 
      self.stopBtn.Enable(); 
      self.SetStatusText(u"播放") 
    elif self.media.GetState() == wx.media.MEDIASTATE_STOPPED: 
      self.playBtn.Enable() 
      self.pauseBtn.Enable() 
      self.stopBtn.Disable(); 
      self.SetStatusText(u"停止") 
  def onTimer(self,evt): 
    self.slider.SetValue(self.media.Tell()); 
    self.SetStatusText(self.creatTimeStatusTEXT(),1) 
  def creatTimeStatusTEXT(self): 
    current = self.getAccurateTime(self.media.Tell()/1000); 
    total = self.getAccurateTime(self.media.Length()/1000); 
    return ' ' + current + '/' + total; 
  def openList(self,evt): 
    if self.listView == '': 
      self.listView = mediaList.MediaListView(self,self.log); 
      self.listView.CenterOnParent(wx.BOTH); 
      self.listView.Show(); 
      self.listView.Bind(wx.EVT_CLOSE,self.closeOpenList); 
    else: 
      self.closeOpenList(evt); 
  def closeOpenList(self,evt): 
    self.listView.Destroy(); 
    self.listView = ''; 
  def loadMediaList(self,evt): 
    woldcart1 = "txt|*.txt"; 
    dialog = wx.FileDialog(self,u"加载播放列表",'C:',"",woldcart1,style=wx.OPEN|wx.CHANGE_DIR) 
    if dialog.ShowModal() == wx.ID_OK: 
      self._loadMediaList(dialog.GetPath()) 
    dialog.Destroy(); 
  def _loadMediaList(self,url): 
    f = file(url) 
    lines = f.readlines() 
    for line in lines: 
      if line: 
        self.log.loadLog(line); 
  def saveMediaList(self,evt): 
    woldcart1 = "txt|*.txt"; 
    dialog = wx.FileDialog(self,u"保存播放列表",'C:',"",woldcart1,style=wx.SAVE|wx.CHANGE_DIR) 
    if dialog.ShowModal() == wx.ID_OK: 
      self._saveMediaList(dialog.GetPath()) 
    dialog.Destroy(); 
  def _saveMediaList(self,url): 
    f = file(url,"w+") 
    f.writelines(self.log.createLog()); 
    f.close(); 
    self.showMessage(u"保存成功!"); 
  def showMessage(self,str): 
    dlg = wx.MessageDialog(self, str,u"消息", wx.OK | wx.ICON_INFORMATION) 
    dlg.ShowModal() 
    dlg.Destroy() 
  def getAccurateTime(self,s): 
   h = 0 
   m = 0 
   if s/60 !=0: 
     m = s/60 
     s = s%60 
   if m/60 !=0: 
     h = m/60 
     m = m%60 
   return str(h)+':'+str(m)+':'+str(s) 
 
if __name__ == "__main__": 
  app = wx.PySimpleApp() 
  frame = MediaFrame(); 
  bmp = wx.Icon("./pic/media.png",wx.BITMAP_TYPE_PNG) 
  frame.SetIcon(bmp) 
  frame.Show(); 
  app.MainLoop();  

mediaList.py

# -*- coding: utf-8 -*- 
import wx; 
import sys; 
import os; 
import SaveLog; 
import subprocess; 
class MediaListView(wx.MiniFrame): 
  def __init__(self,parent,log): 
    wx.MiniFrame.__init__(self,parent,wx.NewId(),u"文件列表",style=wx.DEFAULT_FRAME_STYLE); 
    self.SetAutoLayout(True) 
    self.mediaMain = parent; 
    self.menu = ''; 
    self.selectIndex = -1 
    self.listDataLog = SaveLog.SaveLog(); 
    self.listDataLog = log; 
    self.listct = wx.ListCtrl(self,wx.NewId(),style=wx.LC_REPORT| 
                             wx.LC_VRULES| 
                             wx.LC_SORT_ASCENDING); 
    self.listct.InsertColumn(0,u"编号") 
    self.listct.SetColumnWidth(0,38) 
    self.listct.InsertColumn(1,u"名字") 
    self.listct.SetColumnWidth(1,235) 
    self.listct.InsertColumn(2,u"时间"); 
    self.listct.SetColumnWidth(2,105) 
    frSizer = wx.BoxSizer(wx.VERTICAL) 
    frSizer.Add(self.listct,1,wx.EXPAND|wx.ALL,5) 
    self.listct.Bind(wx.EVT_CONTEXT_MENU,self.onRightClick) 
    self.listct.Bind(wx.EVT_LEFT_DCLICK,self.doubleClick) 
    self.listct.Bind(wx.EVT_LIST_ITEM_SELECTED,self.itemSelected) 
    self.SetSizer(frSizer) 
    self.Layout(); 
    wx.CallAfter(self.reflash,self.listDataLog) 
  def reflash(self,log=''): 
    self.listct.DeleteAllItems(); 
    if log != '': 
      self.listDataLog = log; 
    i = 0; 
    ls = log.getList(); 
    for it in ls: 
      if it: 
        index = self.listct.InsertStringItem(i,str(it.index)); 
        self.listct.SetStringItem(index,0,str(it.index)) 
        self.listct.SetStringItem(index,1,it.fileName) 
        self.listct.SetStringItem(index,2,it.length) 
        i = i+1; 
  def onRightClick(self,evt): 
    self.menu = wx.Menu(); 
    self.playMenu = self.menu.Append(wx.NewId(),u"播放") 
    self.Bind(wx.EVT_MENU,self.cellPlay,self.playMenu) 
    self.delMenu = self.menu.Append(wx.NewId(),u"删除") 
    self.Bind(wx.EVT_MENU,self.cellRomve,self.delMenu); 
    self.dirMenu = self.menu.Append(wx.NewId(),u"打开文件目录") 
    self.Bind(wx.EVT_MENU,self.openDir,self.dirMenu); 
    self.delAllMenu = self.menu.Append(wx.NewId(),u"清除播放列表") 
    self.Bind(wx.EVT_MENU,self.clearAll,self.delAllMenu); 
    self.PopupMenu(self.menu); 
    self.menu.Destroy(); 
  def cellPlay(self,evt): 
    self.selectIndex = self.listct.GetFirstSelected(); 
    item = self.listDataLog.getItemByIndex(self.selectIndex); 
    self.mediaMain.playMedia(item.url,item.fileName); 
  def cellRomve(self,evt): 
    #self.selectIndex = self.listct.GetFirstSelected(); 
    url = self.listDataLog.delItemByIndex(self.listct.GetFirstSelected()); 
    self.listDataLog.reflashDataByIndex(); 
    self.reflash(self.listDataLog); 
    self.mediaMain.cellRemove(url) 
  def doubleClick(self,evt): 
    item = self.listDataLog.getItemByIndex(self.selectIndex); 
    self.mediaMain.playMedia(item.url,item.fileName); 
    evt.Skip(); 
  def itemSelected(self,evt): 
    self.selectIndex = evt.GetIndex(); 
    evt.Skip(); 
  def openDir(self,evt): 
    self.selectIndex = self.listct.GetFirstSelected(); 
    item = self.listDataLog.getItemByIndex(self.selectIndex); 
    subprocess.Popen("explorer " + os.path.split(item.url)[0]); 
  def clearAll(self,evt): 
    self.listDataLog.clearAll(); 
    self.reflash(self.listDataLog); 
    self.mediaMain.cellRemove('',True) 

SaveLog.py

import MediaItem; 
class SaveLog(): 
  list = []; 
  def addItem(self,it=MediaItem.MediaItem): 
    if self.getItemByURL(it.url) == '' : 
      it.index = len(self.list) + 1; 
      self.list.append(it); 
      return True; 
    return False; 
  def clearAll(self): 
    self.list = []; 
  def getItemByURL(self,url): 
    for it in self.list: 
      if it and it.url == url: 
        return it; 
    return ''; 
  def getItemByIndex(self,ind): 
    return self.list[ind]; 
  def delItemByIndex(self,ind): 
    it = self.getItemByIndex(ind); 
    if it : 
      url = it.url; 
      self.list.remove(it); 
      return url; 
    return ''; 
  def reflashDataByIndex(self): 
    i = 1; 
    for it in self.list: 
      if it: 
        it.index = i; 
        i = i+ 1; 
  def havePreItem(self,ind): 
    if ind-1>0: 
      return True; 
    return False; 
  def haveNextItem(self,ind): 
    if ind < len(self.list)-1: 
      return True; 
    return False; 
  def getPreItem(self,ind): 
    if ind>0: 
      ind = ind -1; 
      return self.list[ind]; 
    return ''; 
  def getNextItem(self,ind): 
    if ind < len(self.list)-1: 
      ind = ind + 1; 
      return self.list[ind]; 
    return ''; 
  def getList(self): 
    return self.list; 
  def createLog(self): 
    out = []; 
    for it in self.list: 
      if it: 
        out.append(it.createLog()) 
    return out; 
  def loadLog(self,s=''): 
    ls = s.split("|"); 
    item = MediaItem.MediaItem(); 
    item.index = ls[0] 
    item.fileName = ls[1] 
    item.url = ls[2] 
    item.length = ls[3]; 
    self.addItem(item); 
 
 
 
  def test(self): 
    item = MediaItem.MediaItem(); 
    item.index = 0; 
    item.fileName = '123' 
    item.length = '123' 
    item.url = '123' 
    self.list.append(item) 
    item2 = MediaItem.MediaItem(); 
    item2.index = 1; 
    item2.fileName = '1234' 
    item2.length = '1234' 
    item2.url = '1234' 
    self.list.append(item2) 
    item3 = MediaItem.MediaItem(); 
    item3.index = 2; 
    item3.fileName = '12345' 
    item3.length = '12345' 
    item3.url = '12345' 
    self.list.append(item3) 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网