侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现媒体播放器功能

Python  /  管理员 发布于 7年前   177

本文实例为大家分享了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) 

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


  • 上一条:
    python jieba分词并统计词频后输出结果到Excel和txt文档方法
    下一条:
    python使用pycharm环境调用opencv库
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客