From ff818836dd2221c544afe1fcc17369b17f90b0db Mon Sep 17 00:00:00 2001 From: tassaron Date: Thu, 18 May 2017 19:14:27 -0400 Subject: added ability to use an mp4 as the background might not be the best way to do this (dumping all the video frames to a temp location), but it works for clips of a few minutes or less --- core.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 10 deletions(-) (limited to 'core.py') diff --git a/core.py b/core.py index b362087..ea17edf 100644 --- a/core.py +++ b/core.py @@ -6,6 +6,9 @@ import subprocess as sp import numpy from PIL import Image, ImageDraw, ImageFont from PIL.ImageQt import ImageQt +import tempfile +from shutil import rmtree +import atexit class Core(): @@ -14,6 +17,8 @@ class Core(): self._image = None self.FFMPEG_BIN = self.findFfmpeg() + self.tempDir = None + atexit.register(self.deleteTempDir) def findFfmpeg(self): if sys.platform == "win32": @@ -26,23 +31,34 @@ class Core(): except: return "avconv" - def drawBaseImage(self, backgroundImage, titleText, titleFont, fontSize, alignment, xOffset, yOffset): - - if self._image == None or not self.lastBackgroundImage == backgroundImage: - self.lastBackgroundImage = backgroundImage - + def parseBaseImage(self, backgroundImage, preview=False): + ''' determines if the base image is a single frame or list of frames ''' if backgroundImage == "": - im = Image.new("RGB", (1280, 720), "black") + return [] else: - im = Image.open(backgroundImage) + _, bgExt = os.path.splitext(backgroundImage) + if not bgExt == '.mp4': + return [backgroundImage] + else: + return self.getVideoFrames(backgroundImage, preview) + + def drawBaseImage(self, backgroundFile, titleText, titleFont, fontSize, alignment, xOffset, yOffset): + if backgroundFile == '': + im = Image.new("RGB", (1280, 720), "black") + else: + im = Image.open(backgroundFile) + + if self._image == None or not self.lastBackgroundImage == backgroundFile: + self.lastBackgroundImage = backgroundFile # resize if necessary if not im.size == (1280, 720): im = im.resize((1280, 720), Image.ANTIALIAS) self._image = ImageQt(im) - + self._image1 = QtGui.QImage(self._image) + painter = QPainter(self._image1) font = titleFont font.setPointSizeF(fontSize) @@ -83,7 +99,6 @@ class Core(): imBottom = imTop.transpose(Image.FLIP_TOP_BOTTOM) im = Image.new("RGB", (1280, 720), "black") - im.paste(image, (0, 0)) im.paste(imTop, (0, 0), mask=imTop) im.paste(imBottom, (0, 360), mask=imBottom) @@ -99,7 +114,7 @@ class Core(): '-ac', '1', # mono (set to '2' for stereo) '-'] in_pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.DEVNULL, bufsize=10**8) - + completeAudioArray = numpy.empty(0, dtype="int16") while True: @@ -150,3 +165,30 @@ class Core(): x = frequencies[0:int(paddedSampleSize/2) - 1] return lastSpectrum + + def deleteTempDir(self): + if self.tempDir and os.path.exists(self.tempDir): + rmtree(self.tempDir) + + + def getVideoFrames(self, videoPath, firstOnly=False): + self.tempDir = os.path.join(tempfile.gettempdir(), 'audio-visualizer-python-data') + # recreate the temporary directory so it is empty + self.deleteTempDir() + os.mkdir(self.tempDir) + if firstOnly: + filename = 'preview.jpg' + options = '-ss 10 -vframes 1' + else: + filename = '$frame%05d.jpg' + options = '' + sp.call( \ + '%s -i "%s" -y %s "%s"' % ( \ + self.FFMPEG_BIN, + videoPath, + options, + os.path.join(self.tempDir, filename) + ), + shell=True + ) + return sorted([os.path.join(self.tempDir, f) for f in os.listdir(self.tempDir)]) -- cgit v1.2.3 From cb04c950d48ac7c7fa9b95b3c39d9a8fb6c5bae0 Mon Sep 17 00:00:00 2001 From: tassaron Date: Thu, 18 May 2017 19:54:48 -0400 Subject: added back in spaces deleted by my editor --- core.py | 7 +++---- video_thread.py | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) (limited to 'core.py') diff --git a/core.py b/core.py index ea17edf..8fd95f9 100644 --- a/core.py +++ b/core.py @@ -56,9 +56,8 @@ class Core(): im = im.resize((1280, 720), Image.ANTIALIAS) self._image = ImageQt(im) - + self._image1 = QtGui.QImage(self._image) - painter = QPainter(self._image1) font = titleFont font.setPointSizeF(fontSize) @@ -97,7 +96,7 @@ class Core(): imBottom = imTop.transpose(Image.FLIP_TOP_BOTTOM) - + im = Image.new("RGB", (1280, 720), "black") im.paste(image, (0, 0)) im.paste(imTop, (0, 0), mask=imTop) @@ -114,7 +113,7 @@ class Core(): '-ac', '1', # mono (set to '2' for stereo) '-'] in_pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.DEVNULL, bufsize=10**8) - + completeAudioArray = numpy.empty(0, dtype="int16") while True: diff --git a/video_thread.py b/video_thread.py index 6bad504..1c466fc 100644 --- a/video_thread.py +++ b/video_thread.py @@ -40,7 +40,7 @@ class Worker(QtCore.QObject): imBackground = None self.progressBarUpdate.emit(0) - + completeAudioArray = self.core.readAudioFile(inputFile) # test if user has libfdk_aac @@ -72,7 +72,7 @@ class Worker(QtCore.QObject): ffmpegCommand.append('-2') ffmpegCommand.append(outputFile) - + out_pipe = sp.Popen(ffmpegCommand, stdin=sp.PIPE,stdout=sys.stdout, stderr=sys.stdout) -- cgit v1.2.3 From fb5115f0b205adbcd8f5a2d4d29a98fbc79cec60 Mon Sep 17 00:00:00 2001 From: tassaron Date: Sun, 21 May 2017 20:07:07 -0400 Subject: fixed preview not updating when changing between two videos making the filename of preview.jpg different each time seems to work --- core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core.py') diff --git a/core.py b/core.py index 8fd95f9..92b0d0e 100644 --- a/core.py +++ b/core.py @@ -176,7 +176,7 @@ class Core(): self.deleteTempDir() os.mkdir(self.tempDir) if firstOnly: - filename = 'preview.jpg' + filename = 'preview%s.jpg' % os.path.basename(videoPath).split('.', 1)[0] options = '-ss 10 -vframes 1' else: filename = '$frame%05d.jpg' -- cgit v1.2.3