Я изучал базовое использование 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()
Кто-нибудь может поделиться какой-нибудь информацией здесь?
Спасибо