如何在wx.media.MediaCtrl中调整视频大小
我需要把不同大小的视频都显示成相同的尺寸,比如600*400像素。我在网上找到了一段代码,但问题是,当我打开720p的视频文件时,视频会以它原本的大小显示。
那么,有没有办法用mediactrl来调整视频大小呢?
如果不行,那在wxpython中嵌入视频播放并且可以调整大小的最有效方法是什么呢?
我是在OSX Lion系统上运行,使用的是MacPython 2.7.2和32位的wxpython 2.8。
import wx
import wx.media
import os
class Panel1(wx.Panel):
def __init__(self, parent, id):
#self.log = log
wx.Panel.__init__(self, parent, -1, style=wx.TAB_TRAVERSAL|wx.CLIP_CHILDREN)
# Create some controls
try:
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
except NotImplementedError:
self.Destroy()
raise
loadButton = wx.Button(self, -1, "Load File")
self.Bind(wx.EVT_BUTTON, self.onLoadFile, loadButton)
playButton = wx.Button(self, -1, "Play")
self.Bind(wx.EVT_BUTTON, self.onPlay, playButton)
pauseButton = wx.Button(self, -1, "Pause")
self.Bind(wx.EVT_BUTTON, self.onPause, pauseButton)
stopButton = wx.Button(self, -1, "Stop")
self.Bind(wx.EVT_BUTTON, self.onStop, stopButton)
slider = wx.Slider(self, -1, 0, 0, 0, size=wx.Size(300, -1))
self.slider = slider
self.Bind(wx.EVT_SLIDER, self.onSeek, slider)
self.st_file = wx.StaticText(self, -1, "Open video file", size=(200,-1))
self.st_size = wx.StaticText(self, -1, size=(100,-1))
self.st_len = wx.StaticText(self, -1, size=(100,-1))
self.st_pos = wx.StaticText(self, -1, size=(100,-1))
# setup the button/label layout using a sizer
sizer = wx.GridBagSizer(5,5)
sizer.Add(loadButton, (1,1))
sizer.Add(playButton, (2,1))
sizer.Add(pauseButton, (3,1))
sizer.Add(stopButton, (4,1))
sizer.Add(self.st_file, (1, 2))
sizer.Add(self.st_size, (2, 2))
sizer.Add(self.st_len, (3, 2))
sizer.Add(self.st_pos, (4, 2))
sizer.Add(self.mc, (5,1), span=(5,1)) # for .avi .mpg video files
self.SetSizer(sizer)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.onTimer)
self.timer.Start(100)
def onLoadFile(self, evt):
dlg = wx.FileDialog(self, message="Choose a media file",
defaultDir=os.getcwd(), defaultFile="",
style=wx.OPEN | wx.CHANGE_DIR )
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.doLoadFile(path)
dlg.Destroy()
def doLoadFile(self, path):
if not self.mc.Load(path):
wx.MessageBox("Unable to load %s: Unsupported format?" % path, "ERROR", wx.ICON_ERROR | wx.OK)
else:
folder, filename = os.path.split(path)
self.st_file.SetLabel('%s' % filename)
self.mc.SetBestFittingSize()
self.GetSizer().Layout()
self.slider.SetRange(0, self.mc.Length())
self.mc.Play()#ITS TO PROBLEM, WHY IT DOESNT PLAY HERE?#
def onPlay(self, evt):
self.mc.Play()
def onPause(self, evt):
self.mc.Pause()
def onStop(self, evt):
self.mc.Stop()
def onSeek(self, evt):
offset = self.slider.GetValue()
self.mc.Seek(offset)
def onTimer(self, evt):
offset = self.mc.Tell()
self.slider.SetValue(offset)
self.st_size.SetLabel('size: %s ms' % self.mc.Length())
self.st_len.SetLabel('( %d seconds )' % (self.mc.Length()/1000))
self.st_pos.SetLabel('position: %d ms' % offset)
app = wx.PySimpleApp()
# create a window/frame, no parent, -1 is default ID
frame = wx.Frame(None, -1, "play audio and video files", size = (600, 350))
# call the derived class
Panel1(frame, -1)
frame.Show(1)
app.MainLoop()
3 个回答
0
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把书从一个书架搬到另一个书架一样。
有些时候,我们会遇到一些问题,比如数据格式不对,或者数据缺失。这就像是你在搬书的时候发现有些书被借走了,或者书的封面破了。
为了避免这些问题,我们可以使用一些工具和方法来检查和处理数据。就像在搬书之前,先把书的清单列出来,确保每一本书都在。
总之,处理数据就像搬书一样,需要仔细检查,确保一切都在正确的位置,这样才能顺利完成任务。
import wx
import wx.xrc
import wx.media
import os
class StaticText(wx.StaticText):
def SetLabel(self, label):
if label != self.GetLabel():
wx.StaticText.SetLabel(self, label)
class Fr_AnaSayfa ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Fapigo Biometrik Sistemi", pos = wx.DefaultPosition, size = wx.Size( 1024,700 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
Bs_AnaSayfa = wx.BoxSizer( wx.VERTICAL )
self.Pn_Video = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.Pn_Video.SetMinSize( wx.Size( -1,200 ) )
Vs_Video = wx.BoxSizer( wx.VERTICAL )
self.Pn_Video.SetSizer( Vs_Video )
self.Pn_Video.Layout()
Vs_Video.Fit( self.Pn_Video )
Bs_AnaSayfa.Add( self.Pn_Video, 1, wx.EXPAND |wx.ALL, 5 )
try:
backend = ""
self.mc = wx.media.MediaCtrl()
self.mc.ShowPlayerControls(flags=wx.media.MEDIACTRLPLAYERCONTROLS_DEFAULT)
ok = self.mc.Create(self.Pn_Video, style=wx.SIMPLE_BORDER,szBackend=backend)
if not ok:
raise NotImplementedError
except NotImplementedError:
self.Destroy()
raise
self.Pn_Button = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( -1,40 ), wx.TAB_TRAVERSAL )
self.Pn_Button.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INFOBK ) )
Bs_Button = wx.BoxSizer( wx.HORIZONTAL )
Bs_Button.SetMinSize( wx.Size( -1,40 ) )
self.Bt_Load = wx.Button( self.Pn_Button, wx.ID_ANY, u"Load", wx.DefaultPosition, wx.DefaultSize, 0 )
Bs_Button.Add( self.Bt_Load, 0, wx.ALL, 5 )
self.Bt_Play = wx.Button( self.Pn_Button, wx.ID_ANY, u"Play", wx.DefaultPosition, wx.DefaultSize, 0 )
Bs_Button.Add( self.Bt_Play, 0, wx.ALL, 5 )
self.Bt_Pause = wx.Button( self.Pn_Button, wx.ID_ANY, u"Pause", wx.DefaultPosition, wx.DefaultSize, 0 )
Bs_Button.Add( self.Bt_Pause, 0, wx.ALL, 5 )
self.Bt_Stop = wx.Button( self.Pn_Button, wx.ID_ANY, u"Stop", wx.DefaultPosition, wx.DefaultSize, 0 )
Bs_Button.Add( self.Bt_Stop, 0, wx.ALL, 5 )
self.slider = wx.Slider(self.Pn_Button, -1, 0, 0, 10)
self.slider.SetMinSize((150, -1))
self.Bind(wx.EVT_SLIDER, self.OnSeek, self.slider)
Bs_Button.Add( self.slider, 0, wx.ALL, 5 )
self.Bind(wx.media.EVT_MEDIA_LOADED, self.OnMediaLoaded)
self.Bind(wx.EVT_BUTTON, self.OnLoadFile, self.Bt_Load)
self.Bind(wx.EVT_BUTTON, self.OnPlay, self.Bt_Play)
self.Bind(wx.EVT_BUTTON, self.OnPause, self.Bt_Pause)
self.Bind(wx.EVT_BUTTON, self.OnStop, self.Bt_Stop)
self.Bind(wx.EVT_SLIDER, self.OnSeek, self.slider)
self.st_size = StaticText(self.Pn_Button, -1, size=(100,-1))
self.st_len = StaticText(self.Pn_Button, -1, size=(100,-1))
self.st_pos = StaticText(self.Pn_Button, -1, size=(100,-1))
Bs_Button.Add( self.st_size, 0, wx.ALL, 5 )
Bs_Button.Add( self.st_len, 0, wx.ALL, 5 )
Bs_Button.Add( self.st_pos, 0, wx.ALL, 5 )
self.Pn_Button.SetSizer( Bs_Button )
self.Pn_Button.Layout()
Bs_AnaSayfa.Add( self.Pn_Button, 0, wx.EXPAND |wx.ALL, 5 )
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer)
self.timer.Start(100)
self.Bind(wx.EVT_SIZE, self.ReSize)
self.SetSizer( Bs_AnaSayfa )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass
def OnLoadFile(self, evt):
dlg = wx.FileDialog(self, message="Choose a media file",
defaultDir=os.getcwd(), defaultFile="",
style=wx.FD_OPEN | wx.FD_CHANGE_DIR )
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.DoLoadFile(path)
dlg.Destroy()
def ReSize(self, evt):
self.mc.Pause()
self.Layout()
self.mc.SetSize(self.Pn_Video.GetSize())
self.mc.Play()
def DoLoadFile(self, path):
if not self.mc.Load(path):
wx.MessageBox("Unable to load %s: Unsupported format?" % path,
"ERROR",
wx.ICON_ERROR | wx.OK)
self.Bt_Play.Disable()
else:
self.mc.SetInitialSize()
self.slider.SetRange(0, self.mc.Length())
self.Bt_Play.Enable()
self.GetSizer().Layout()
def OnMediaLoaded(self, evt):
self.Bt_Play.Enable()
def OnPlay(self, evt):
if not self.mc.Play():
wx.MessageBox("Unable to Play media : Unsupported format?",
"ERROR",
wx.ICON_ERROR | wx.OK)
else:
self.mc.SetInitialSize()
self.GetSizer().Layout()
self.slider.SetRange(0, self.mc.Length())
self.mc.SetSize(self.Pn_Video.GetSize())
def OnPause(self, evt):
self.mc.Pause()
def OnStop(self, evt):
self.mc.Stop()
def OnSeek(self, evt):
offset = self.slider.GetValue()
self.mc.Seek(offset)
def OnTimer(self, evt):
offset = self.mc.Tell()
self.slider.SetValue(offset)
self.st_size.SetLabel('size: %s' % self.mc.GetBestSize())
self.st_len.SetLabel('length: %d seconds' % (self.mc.Length()/1000))
self.st_pos.SetLabel('position: %d' % offset)
def ShutdownDemo(self):
self.timer.Stop()
del self.timer
if __name__ == '__main__':
Fapigo = wx.App()
Fr_AnaSayfa = Fr_AnaSayfa(None)
Fapigo.SetTopWindow(Fr_AnaSayfa)
Fr_AnaSayfa.Show()
Fapigo.MainLoop()
0
我觉得MediaCtrl只是把它们调整到它们原本的大小。你可以试着用一些编辑软件把它们裁剪一下。
1
MediaCtrl在初始化的时候有一个大小的参数,你可以试着传递这个参数。你也可以试试mplayer的封装。这里有一个关于后者的教程:http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/