Почему MplayerCtrl не может загрузить mplayer в wx.Frame, если он не создан дважды? - PullRequest
0 голосов
/ 02 июля 2019

Я изучал базовое использование API MplayerCtrl, чтобы определить его пригодность для видеоплеера, который я собираюсь собрать. Я не обязательно связан с подходом Python, но эта технология казалась мощным выбором для изучения.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь запустить шаблонный код для инициализации кадра и воспроизведения видеофайла, я получаю пустое окно.

Однако, что интересно, я случайно наткнулся на способ, который заставляет это работать, и это то, что я пытаюсь понять. Когда я создаю два отдельных кадра, видео может воспроизводиться, но, естественно, это означает, что у меня воспроизводятся два одинаковых видео.

Обратите внимание на следующее:

import wx
import MplayerCtrl as mpc

class Frame( wx.Frame ):
    def __init__( self, parent, id ):
        wx.Frame.__init__( self, parent, id )

        self.mpc = mpc.MplayerCtrl( self, wx.ID_ANY, u'/usr/bin/mplayer', media_file=u'SampleVideo_1280x720_5mb.mp4' )
        self.Bind(mpc.EVT_PROCESS_STARTED, self.on_process_started)
        self.Bind(mpc.EVT_MEDIA_STARTED, self.on_media_started)
        self.Bind(mpc.EVT_MEDIA_FINISHED, self.on_media_finished)
        self.Bind(mpc.EVT_PROCESS_STOPPED, self.on_process_stopped)

        self.Show()

    def on_process_started(self, evt):
        print('Process started')

    def on_media_started(self, evt):
        print('Media started')

    def on_media_finished(self, evt):
        print('Media finished')
        self.mpc.Quit()

    def on_process_stopped(self, evt):
        print('Process stopped')

if __name__ == '__main__':
    app  = wx.App( False )
    f1   = Frame( None, wx.ID_ANY )
    f2   = Frame( None, wx.ID_ANY )
    app.MainLoop()

Если я запускаю приведенный выше код без изменений, я получаю следующий вывод:

Process started
Process started
Media started
Media started

Однако, если я закомментирую

f2   = Frame( None, wx.ID_ANY )

Я просто получаю:

Process started
Process stopped

Я не уверен, но мое единственное предположение состоит в том, что первый вызов конструктора запускает MPC-проигрыватель, но по какой-либо причине не может привязать вывод видео к кадру. Затем при втором вызове это становится доступным, и, следовательно, при запуске MainLoop () мы получаем успешный вывод в оба кадра.

Edit: Нашел что-то интересное, когда я добавил задержку к загрузке видео с помощью этой строки:

wx.FutureCall(5000, self.mpc.Loadfile, u'SampleVideo_1280x720_5mb.mp4')

Это вернуло эту ошибку:

    raise NoMplayerRunning('You have first to start the mplayer,' 
MplayerCtrl.NoMplayerRunning: You have first to start the mplayer,use Start()

Кто-нибудь может поделиться какой-нибудь информацией здесь?

Спасибо

...