Video items have a preview shown

This commit is contained in:
Martin Thompson 2009-06-30 21:35:53 +01:00
parent 45d9f436ab
commit 5e8ff0214e
5 changed files with 64 additions and 81 deletions

View File

@ -35,14 +35,18 @@ class ListWithPreviews(QtCore.QAbstractListModel):
self.items = []
self.rowheight = 50
self.maximagewidth = self.rowheight * 16 / 9.0;
if new_preview_function is not None:
self.make_preview=new_preview_function
else:
self.make_preview=self.preview_function
self.preview_function = new_preview_function
def preview_function(self, filename):
def make_preview(self, filename):
if os.path.exists(filename):
preview = QtGui.QImage(filename)
if self.preview_function is not None:
preview=self.preview_function(filename)
else:
preview = QtGui.QImage(filename)
else:
preview = None
if preview is not None:
w = self.maximagewidth;
h = self.rowheight
preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)

View File

@ -18,7 +18,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
import types
import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib.toolbar import *
from openlp.core.lib import translate
@ -123,6 +123,8 @@ class MediaManagerItem(QtGui.QWidget):
# each plugin needs to inherit a class from this and pass that *class* (not an instance) to here
# via the ListViewWithDnD_class member
# self.ServiceItemIconName - string referring to an icon file or a resource icon
# self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) - no scaling required - that's done later
# If this fn is not defined, a default will be used (treat the filename as an image)
# The assumption is that given that at least two plugins are of the form
# "text with an icon" then all this will help
@ -168,7 +170,10 @@ class MediaManagerItem(QtGui.QWidget):
#Add the List widget
self.ListView = self.ListViewWithDnD_class()
self.ListView.uniformItemSizes = True
self.ListData = ListWithPreviews()
try:
self.ListData = ListWithPreviews(self.PreviewFunction)
except AttributeError:
self.ListData = ListWithPreviews(None)
self.ListView.setModel(self.ListData)
self.ListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
self.ListView.setSpacing(1)

View File

@ -19,7 +19,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA
"""
import logging
import os
import tempfile
try:
import gst
except:
log = logging.getLogger(u'MediaMediaItemSetup')
log.warning(u'Can\'t generate Vidoe previews - import gst failed');
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, translate
@ -51,8 +57,45 @@ class MediaMediaItem(MediaManagerItem):
# be instanced by the base MediaManagerItem
self.ListViewWithDnD_class = MediaListView
self.ServiceItemIconName = u':/media/media_image.png'
self.PreviewFunction = self.video_get_preview
MediaManagerItem.__init__(self, parent, icon, title)
def video_get_preview(self, filename):
"""Gets a preview of the first frame of a video file using
GSTREAMER (non-portable??? - Can't figure out how to do with
Phonon - returns a QImage"""
try:
# Define your pipeline, just as you would at the command prompt.
# This is much easier than trying to create and link each gstreamer element in Python.
# This is great for pipelines that end with a filesink (i.e. there is no audible or visual output)
log.info ("Video preview %s"%( filename))
outfile=tempfile.NamedTemporaryFile(suffix='.png')
cmd=u'filesrc location="%s" ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"'% (filename, outfile.name)
pipe = gst.parse_launch(cmd)
# Get a reference to the pipeline's bus
bus = pipe.get_bus()
# Set the pipeline's state to PLAYING
pipe.set_state(gst.STATE_PLAYING)
# Listen to the pipeline's bus indefinitely until we receive a EOS (end of stream) message.
# This is a super important step, or the pipeline might not work as expected. For example,
# in my example pipeline above, the pngenc will not export an actual image unless you have
# this line of code. It just exports a 0 byte png file. So... don't forget this step.
bus.poll(gst.MESSAGE_EOS, -1)
img=QtGui.QImage(outfile.name)
outfile.close()
# os.unlink(outfile.name)
pipe.set_state(gst.STATE_NULL)
return img
except:
log.info("Can't generate video preview for some reason");
import sys
print sys.exc_info()
return QtGui.QImage()
def generateSlideData(self, service_item):
indexes = self.ListView.selectedIndexes()
@ -66,9 +109,9 @@ class MediaMediaItem(MediaManagerItem):
def onPreviewClick(self):
log.debug(u'Media Preview Button pressed')
items = self.MediaListView.selectedIndexes()
items = self.ListView.selectedIndexes()
for item in items:
text = self.MediaListData.getValue(item)
text = self.ListData.getValue(item)
print text
def onMediaLiveClick(self):

View File

@ -22,7 +22,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab
from openlp.plugins.media.lib import MediaTab,MediaMediaItem
from video_preview import video_get_preview
class MediaPlugin(Plugin):
def __init__(self, plugin_helpers):

View File

@ -1,69 +0,0 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
"""
OpenLP - Open Source Lyrics Projection
Copyright (c) 2008 Raoul Snyman
Portions copyright (c) 2008 Martin Thompson, Tim Bentley,
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
import os
from PyQt4 import QtCore, QtGui
# xxx this needs a try, except once we've decided what to do if it fails
from PyQt4.phonon import Phonon
# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab
# from openlp.plugins.media.lib import MediaTab,MediaMediaItem
"""Renders a video to some surface or other """
class w(QtGui.QMainWindow):
def __init__(self, parent=None):
super(QtGui.QMainWindow, self).__init__(parent)
self.resize(640,480)
self.setWindowTitle(u'simple media player')
self.show()
if __name__==u'__main__':
app = QtGui.QApplication([])
# widget = QtGui.QWidget()
# widget.resize(320, 240)
# widget.setWindowTitle(u'simple')
# widget.show()
# QCore.QCoreApplication.setApplicationName(u'OpenLP')
mainwindow=w()
widget=QtGui.QWidget(mainwindow)
mainwindow.setCentralWidget(widget)
widget.setLayout(QtGui.QVBoxLayout(widget))
# videofile=u'r-128.rm'
videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg'
source=Phonon.MediaSource(videofile)
media=Phonon.MediaObject(widget)
media.setCurrentSource(source)
video=Phonon.VideoWidget(widget)
audio=Phonon.AudioOutput(Phonon.MusicCategory)
# controller=Phonon.MediaController(media)
Phonon.createPath(media, video);
Phonon.createPath(media, audio);
# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget)
slider=Phonon.SeekSlider(media, mainwindow)
widget.layout().addWidget(slider)
widget.layout().addWidget(video)
slider.show()
video.show()
media.play()
app.exec_()