diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py index aab68f017..021c444cf 100644 --- a/openlp/core/ui/media/mediacontroller.py +++ b/openlp/core/ui/media/mediacontroller.py @@ -143,11 +143,6 @@ class MediaController(object): AppLocation.get_directory(AppLocation.AppDir), u'core', u'ui', u'media') for filename in os.listdir(controller_dir): - # TODO vlc backend is not yet working on Mac OS X. - # For now just ignore vlc backend on Mac OS X. - if sys.platform == 'darwin' and filename == 'vlcplayer.py': - log.warn(u'Disabling vlc media player') - continue if filename.endswith(u'player.py') and \ not filename == 'mediaplayer.py': path = os.path.join(controller_dir, filename) @@ -188,12 +183,16 @@ class MediaController(object): if not self.currentMediaPlayer.keys(): self.timer.stop() else: + any_active = False for display in self.currentMediaPlayer.keys(): self.currentMediaPlayer[display].resize(display) self.currentMediaPlayer[display].update_ui(display) if self.currentMediaPlayer[display].state == \ MediaState.Playing: - return + any_active = True + # There are still any active players - no need to stop timer. + if any_active: + return # no players are active anymore for display in self.currentMediaPlayer.keys(): if self.currentMediaPlayer[display].state != MediaState.Paused: diff --git a/openlp/core/ui/media/phononplayer.py b/openlp/core/ui/media/phononplayer.py index 05b3a22b3..5b91fea98 100644 --- a/openlp/core/ui/media/phononplayer.py +++ b/openlp/core/ui/media/phononplayer.py @@ -57,7 +57,7 @@ ADDITIONAL_EXT = { u'video/x-matroska': [u'.mpv', u'.mkv'], u'video/x-wmv': [u'.wmv'], u'video/x-mpg': [u'.mpg'], - u'video/mpeg' : [u'.mp4', u'.mts'], + u'video/mpeg' : [u'.mp4', u'.mts', u'.mov'], u'video/x-ms-wmv': [u'.wmv']} VIDEO_CSS = u""" diff --git a/openlp/core/ui/media/vlcplayer.py b/openlp/core/ui/media/vlcplayer.py index ebe3d31bb..658070154 100644 --- a/openlp/core/ui/media/vlcplayer.py +++ b/openlp/core/ui/media/vlcplayer.py @@ -125,18 +125,21 @@ class VlcPlayer(MediaPlayer): display.vlcWidget.resize(display.size()) display.vlcWidget.raise_() display.vlcWidget.hide() - # the media player has to be 'connected' to the QFrame + # The media player has to be 'connected' to the QFrame. # (otherwise a video would be displayed in it's own window) - # this is platform specific! - # you have to give the id of the QFrame (or similar object) to - # vlc, different platforms have different functions for this + # This is platform specific! + # You have to give the id of the QFrame (or similar object) + # to vlc, different platforms have different functions for this. + win_id = int(display.vlcWidget.winId()) if sys.platform == "win32": - display.vlcMediaPlayer.set_hwnd(int(display.vlcWidget.winId())) + display.vlcMediaPlayer.set_hwnd(win_id) elif sys.platform == "darwin": - display.vlcMediaPlayer.set_agl(int(display.vlcWidget.winId())) + # We have to use 'set_nsobject' since Qt4 on OSX uses Cocoa + # framework and not the old Carbon. + display.vlcMediaPlayer.set_nsobject(win_id) else: # for Linux using the X Server - display.vlcMediaPlayer.set_xwindow(int(display.vlcWidget.winId())) + display.vlcMediaPlayer.set_xwindow(win_id) self.hasOwnWidget = True def check_available(self): @@ -156,6 +159,13 @@ class VlcPlayer(MediaPlayer): # parse the metadata of the file display.vlcMedia.parse() self.volume(display, volume) + # We need to set media_info.length during load because we want + # to avoid start and stop the video twice. Once for real playback + # and once to just get media length. + # + # Media plugin depends on knowing media length before playback. + controller.media_info.length = \ + int(display.vlcMediaPlayer.get_media().get_duration() / 1000) return True def media_state_wait(self, display, mediaState): @@ -222,6 +232,7 @@ class VlcPlayer(MediaPlayer): display.vlcWidget.setVisible(status) def update_ui(self, display): + # Stop video if playback is finished. if display.vlcMedia.get_state() == vlc.State.Ended: self.stop(display) controller = display.controller