Как воспроизвести файл сразу после загрузки в wx.media.MediaCtrl python?

#python #wxpython #media-player

#python #wxpython #медиаплеер

Вопрос:

Я хочу написать код, который может сразу начать воспроизведение видео после загрузки файла. Но wx.media вообще не воспроизводит видеофайл. Я могу загрузить файл, но не воспроизвести его.

 import wx
import wx.media

class Panel1(wx.Panel):
    def __init__(self, parent, id):
        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
        self.mc.Load('output2.avi')#video file path
        self.mc.Play()


app = wx.App()
# create a window/frame, no parent, -1 is default ID
frame = wx.Frame(None, -1, "play audio and video files", size=(600, 600))
# call the derived class
Panel1(frame, -1)
frame.Show(1)
app.MainLoop()
 

Я был бы очень благодарен всем вам, если бы вы могли помочь мне в этом. Как воспроизвести файл сразу после загрузки в media.

Ответ №1:

Вы можете сделать это:

 self.Bind(wx.media.EVT_MEDIA_LOADED, self.OnMediaLoaded)
def OnMediaLoaded(self, event):
    self.mc.Play()
self.mc.Load('output2.avi')
 
 

Ответ №2:

Я не могу найти, в чем проблема в вашем коде. Возможно, avi-ролик короткий и сразу останавливается. Или, может быть, проблема с настройкой wxphyton.

Итак, я создал небольшое приложение с помощью wxFormBuilder. Он имеет правильную настройку wxpython и после воспроизведения фильма продолжает перезапускать фильм.

Я использую этот avi-фильм для тестирования. Это 2 файла python, которые показывают фильм сразу после запуска.

Сгенерированный wxFormBuilder код:

 # -*- coding: utf-8 -*-

###########################################################################
## Python code generated with wxFormBuilder (version 3.9.0 Nov 17 2019)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

###########################################################################
## Class wxfbFrameMain
###########################################################################

class wxfbFrameMain ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        bSizer5 = wx.BoxSizer( wx.VERTICAL )

        self.statictext_player = wx.StaticText( self, wx.ID_ANY, u"Player", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.statictext_player.Wrap( -1 )

        bSizer5.Add( self.statictext_player, 0, wx.ALL, 5 )


        self.SetSizer( bSizer5 )
        self.Layout()

        self.Centre( wx.BOTH )

    def __del__( self ):
        pass
 

Приложение на Python:

 import os
import wx
import wx.media
from wxfbTest import wxfbFrameMain


class FrameMain(wxfbFrameMain):

    def __init__(self):
        super(FrameMain, self).__init__(None)

        avi_file = r'file_example_AVI_480_750kB.avi'

        sizer = self.statictext_player.GetContainingSizer()

        self.media_ctrl = self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
        sizer.Add( self.media_ctrl, 50, wx.ALL | wx.EXPAND, 5 )
        if os.path.exists(avi_file):
            self.media_ctrl.Load(avi_file)

        self.Bind(wx.media.EVT_MEDIA_STOP, self._on_media_stop)

        self.Show()
        self.media_ctrl.Play()

    def _on_media_stop(self, event):
        self.media_ctrl.Play()


if __name__=='__main__':
    app = wx.App()
    frame_main = FrameMain()
    app.MainLoop()