python实现媒体播放器功能
本文实例为大家分享了python实现媒体播放器功能的具体代码,供大家参考,具体内容如下
playMP3.py
#-*-coding:utf-8-*-
importwx;
importwx.media;
importos;
importSPrint;
importmediaStateBar;
importmediaList;
importSaveLog;
importMediaItem;
woldcart="mediafiles|*.*|avi|*.avi|rmvb|*.rmvb|rm|*.rm|wma|*.wma|mp3|*.mp3";
classMediaFrame(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)
exceptNotImplementedError:
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);
defcreateButton(self,img,clickFun,tip=""):
bmp=wx.Bitmap(img,wx.BITMAP_TYPE_PNG);
btn=wx.BitmapButton(self,wx.NewId(),bmp);
iftip!='':btn.SetToolTipString(tip);
btn.Bind(wx.EVT_BUTTON,clickFun);
returnbtn;
defquit(self,event):
self.Destroy();
defplayMp3(self,e):
ifself.item!='':
self.media.Play()
#self.media.SetInitialSize()
defpauseMp3(self,e=''):
self.media.Pause()
defstopMp3(self,e=''):
self.media.Stop()
defpreMp3(self,e):
ifself.item!='':
self.item=self.log.getPreItem(self.item.index)
ifself.item!='':
self.playMedia(self.item.url,self.item.fileName);
defnextMp3(self,e):
ifself.item!='':
self.item=self.log.getNextItem(self.item.index)
ifself.item!='':
self.playMedia(self.item.url,self.item.fileName);
defonSeek(self,event):
self.media.Seek(self.slider.GetValue())
defcallAfterPlayMedia(self,url):
#self.media.SetInitialSize();
self.media.Play();
defplayMedia(self,url,filename):
#printSPrint.encodeFromSystem(u"播放文件:"),SPrint.encodeFromSystem(url);
ifself.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)
ifdialog.ShowModal()==wx.ID_OK:
self.playMedia(dialog.GetPath(),dialog.GetFilename())
dialog.Destroy();
defcellRemove(self,url,all=False):
ifall==True:
self.stopMp3()
self.item='';
return;
ifself.item.url==url:
self.stopMp3();
self.item='';
defvolumeSeek(self,evt):
#printfloat(self.volSlider.GetValue()/100);
self.media.SetVolume(self.volSlider.GetValue()/100.0)
self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%')
defmediaLoaded(self,e):
print"medialoaded!"
self.media.Play();
self.slider.SetRange(0,self.media.Length());
self.item.length=self.getAccurateTime(self.media.Length()/1000);
ifself.log.addItem(self.item):
ifself.listView!='':
self.listView.reflash(self.log);
ifself.log.haveNextItem(self.item.index):
self.nextBtn.Enable();
else:
self.nextBtn.Disable()
ifself.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())+'%')
defmediaStateChange(self,evt):
ifself.media.GetState()==wx.media.MEDIASTATE_PAUSED:
self.playBtn.Enable()
self.pauseBtn.Disable()
self.stopBtn.Enable();
self.SetStatusText(u"暂停")
elifself.media.GetState()==wx.media.MEDIASTATE_PLAYING:
self.playBtn.Disable()
self.pauseBtn.Enable()
self.stopBtn.Enable();
self.SetStatusText(u"播放")
elifself.media.GetState()==wx.media.MEDIASTATE_STOPPED:
self.playBtn.Enable()
self.pauseBtn.Enable()
self.stopBtn.Disable();
self.SetStatusText(u"停止")
defonTimer(self,evt):
self.slider.SetValue(self.media.Tell());
self.SetStatusText(self.creatTimeStatusTEXT(),1)
defcreatTimeStatusTEXT(self):
current=self.getAccurateTime(self.media.Tell()/1000);
total=self.getAccurateTime(self.media.Length()/1000);
return''+current+'/'+total;
defopenList(self,evt):
ifself.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);
defcloseOpenList(self,evt):
self.listView.Destroy();
self.listView='';
defloadMediaList(self,evt):
woldcart1="txt|*.txt";
dialog=wx.FileDialog(self,u"加载播放列表",'C:',"",woldcart1,style=wx.OPEN|wx.CHANGE_DIR)
ifdialog.ShowModal()==wx.ID_OK:
self._loadMediaList(dialog.GetPath())
dialog.Destroy();
def_loadMediaList(self,url):
f=file(url)
lines=f.readlines()
forlineinlines:
ifline:
self.log.loadLog(line);
defsaveMediaList(self,evt):
woldcart1="txt|*.txt";
dialog=wx.FileDialog(self,u"保存播放列表",'C:',"",woldcart1,style=wx.SAVE|wx.CHANGE_DIR)
ifdialog.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"保存成功!");
defshowMessage(self,str):
dlg=wx.MessageDialog(self,str,u"消息",wx.OK|wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
defgetAccurateTime(self,s):
h=0
m=0
ifs/60!=0:
m=s/60
s=s%60
ifm/60!=0:
h=m/60
m=m%60
returnstr(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-*-
importwx;
importsys;
importos;
importSaveLog;
importsubprocess;
classMediaListView(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)
defreflash(self,log=''):
self.listct.DeleteAllItems();
iflog!='':
self.listDataLog=log;
i=0;
ls=log.getList();
foritinls:
ifit:
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;
defonRightClick(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();
defcellPlay(self,evt):
self.selectIndex=self.listct.GetFirstSelected();
item=self.listDataLog.getItemByIndex(self.selectIndex);
self.mediaMain.playMedia(item.url,item.fileName);
defcellRomve(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)
defdoubleClick(self,evt):
item=self.listDataLog.getItemByIndex(self.selectIndex);
self.mediaMain.playMedia(item.url,item.fileName);
evt.Skip();
defitemSelected(self,evt):
self.selectIndex=evt.GetIndex();
evt.Skip();
defopenDir(self,evt):
self.selectIndex=self.listct.GetFirstSelected();
item=self.listDataLog.getItemByIndex(self.selectIndex);
subprocess.Popen("explorer"+os.path.split(item.url)[0]);
defclearAll(self,evt):
self.listDataLog.clearAll();
self.reflash(self.listDataLog);
self.mediaMain.cellRemove('',True)
SaveLog.py
importMediaItem; classSaveLog(): list=[]; defaddItem(self,it=MediaItem.MediaItem): ifself.getItemByURL(it.url)=='': it.index=len(self.list)+1; self.list.append(it); returnTrue; returnFalse; defclearAll(self): self.list=[]; defgetItemByURL(self,url): foritinself.list: ifitandit.url==url: returnit; return''; defgetItemByIndex(self,ind): returnself.list[ind]; defdelItemByIndex(self,ind): it=self.getItemByIndex(ind); ifit: url=it.url; self.list.remove(it); returnurl; return''; defreflashDataByIndex(self): i=1; foritinself.list: ifit: it.index=i; i=i+1; defhavePreItem(self,ind): ifind-1>0: returnTrue; returnFalse; defhaveNextItem(self,ind): ifind0: ind=ind-1; returnself.list[ind]; return''; defgetNextItem(self,ind): ifind 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。