diff options
Diffstat (limited to 'components')
| -rw-r--r-- | components/video.py | 67 |
1 files changed, 49 insertions, 18 deletions
diff --git a/components/video.py b/components/video.py index 561e40b..3d6ba7a 100644 --- a/components/video.py +++ b/components/video.py @@ -1,6 +1,6 @@ from PIL import Image, ImageDraw from PyQt4 import uic, QtGui, QtCore -import os +import os, subprocess from . import __base__ class Component(__base__.Component): @@ -24,25 +24,27 @@ class Component(__base__.Component): self.parent.drawPreview() def previewRender(self, previewWorker): - width = int(previewWorker.core.settings.value('outputWidth')) - height = int(previewWorker.core.settings.value('outputHeight')) - return self.drawFrame(width, height) + self.width = int(previewWorker.core.settings.value('outputWidth')) + self.height = int(previewWorker.core.settings.value('outputHeight')) + frames = self.getVideoFrames(True) + if frames: + im = Image.open(frames[0]) + im = self.resize(im) + return im + else: + return Image.new("RGBA", (self.width, self.height), (0, 0, 0, 0)) + + def preFrameRender(self, **kwargs): + super().__init__(**kwargs) + self.width = int(self.worker.core.settings.value('outputWidth')) + self.height = int(self.worker.core.settings.value('outputHeight')) + self.frames = self.getVideoFrames() def frameRender(self, moduleNo, frameNo): - width = int(self.worker.core.settings.value('outputWidth')) - height = int(self.worker.core.settings.value('outputHeight')) - return self.drawFrame(width, height) - - def drawFrame(self, width, height): - frame = Image.new("RGBA", (width, height), (0,0,0,0)) - ''' - if self.imagePath and os.path.exists(self.imagePath): - image = Image.open(self.imagePath) - if image.size != (width, height): - image = image.resize((width, height), Image.ANTIALIAS) - frame.paste(image) - ''' - return frame + i = frameNo if frameNo < len(self.frames)-1 else len(self.frames)-1 + im = Image.open(self.frames[i]) + im = self.resize(im) + return im def loadPreset(self, pr): self.page.lineEdit_video.setText(pr['video']) @@ -66,3 +68,32 @@ class Component(__base__.Component): self.settings.setValue("backgroundDir", os.path.dirname(filename)) self.page.lineEdit_video.setText(filename) self.update() + + def getVideoFrames(self, firstOnly=False): + # recreate the temporary directory so it is empty + # FIXME: don't dump too many frames at once + if not self.videoPath: + return + self.parent.core.deleteTempDir() + os.mkdir(self.parent.core.tempDir) + if firstOnly: + filename = 'preview%s.jpg' % os.path.basename(self.videoPath).split('.', 1)[0] + options = '-ss 10 -vframes 1' + else: + filename = '$frame%05d.jpg' + options = '' + subprocess.call( \ + '%s -i "%s" -y %s "%s"' % ( \ + self.parent.core.FFMPEG_BIN, + self.videoPath, + options, + os.path.join(self.parent.core.tempDir, filename) + ), + shell=True + ) + return sorted([os.path.join(self.parent.core.tempDir, f) for f in os.listdir(self.parent.core.tempDir)]) + + def resize(self, im): + if im.size != (self.width, self.height): + im = im.resize((self.width, self.height), Image.ANTIALIAS) + return im |
