aboutsummaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/video.py67
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