python开发网页视频播放器_python实现媒体播放器功能

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值