diff options
| -rw-r--r-- | components/original.py | 9 | ||||
| -rw-r--r-- | components/text.py | 6 | ||||
| -rw-r--r-- | core.py | 9 | ||||
| -rw-r--r-- | main.py | 31 | ||||
| -rw-r--r-- | mainwindow.ui | 3 | ||||
| -rw-r--r-- | video_thread.py | 82 |
6 files changed, 103 insertions, 37 deletions
diff --git a/components/original.py b/components/original.py index 382c3ab..e1240e9 100644 --- a/components/original.py +++ b/components/original.py @@ -27,6 +27,7 @@ class Component(__base__.Component): page.pushButton_visColor.setStyleSheet(btnStyle) page.lineEdit_visColor.textChanged.connect(self.update) self.page = page + self.canceled = False return page def update(self): @@ -59,6 +60,8 @@ class Component(__base__.Component): self.spectrumArray = {} for i in range(0, len(self.completeAudioArray), self.sampleSize): + if self.canceled: + break self.lastSpectrum = self.transformData(i, self.completeAudioArray, self.sampleSize, self.smoothConstantDown, self.smoothConstantUp, self.lastSpectrum) self.spectrumArray[i] = copy(self.lastSpectrum) @@ -142,3 +145,9 @@ class Component(__base__.Component): im.paste(imTop, (0, y), mask=imTop) return im + + def cancel(self): + self.canceled = True + + def reset(self): + self.canceled = False diff --git a/components/text.py b/components/text.py index 9237167..da2706b 100644 --- a/components/text.py +++ b/components/text.py @@ -141,3 +141,9 @@ class Component(__base__.Component): return self.page.lineEdit_textColor.setText(RGBstring) self.page.pushButton_textColor.setStyleSheet(btnStyle) + + def cancel(self): + self.canceled = True + + def reset(self): + self.canceled = False
\ No newline at end of file @@ -7,6 +7,7 @@ from PIL import Image import tempfile from shutil import rmtree import atexit +import time class Core(): @@ -67,6 +68,8 @@ class Core(): completeAudioArray = numpy.empty(0, dtype="int16") while True: + if self.canceled: + break # read 2 seconds of audio raw_audio = in_pipe.stdout.read(88200*4) if len(raw_audio) == 0: @@ -110,3 +113,9 @@ class Core(): shell=True ) return sorted([os.path.join(self.tempDir, f) for f in os.listdir(self.tempDir)]) + + def cancel(self): + self.canceled = True + + def reset(self): + self.canceled = False @@ -253,14 +253,15 @@ class Main(QtCore.QObject): def stopVideo(self): print('stop') - try: - self.videoWorker.stopVideo() - except: - pass + self.videoWorker.cancel() + self.canceled = True def createAudioVisualisation(self): # create output video if mandatory settings are filled in if self.window.lineEdit_audioFile.text() and self.window.lineEdit_outputFile.text(): + self.canceled = False + self.startExport = True + self.progressBarUpdated(-1) ffmpeg_cmd = self.settings.value("ffmpeg_cmd", expanduser("~")) self.videoThread = QtCore.QThread(self) @@ -281,7 +282,27 @@ class Main(QtCore.QObject): self.showMessage("You must select an audio file and output filename.") def progressBarUpdated(self, value): - self.window.progressBar_createVideo.setValue(value) + if value != -1: + self.window.progressBar_createVideo.setValue(value) + + if self.canceled: + self.window.pushButton_createVideo.setEnabled(True) + self.window.pushButton_Cancel.setEnabled(False) + self.startExport = False + return + + if value == 100 or value == 0: + if not self.startExport: + self.window.pushButton_createVideo.setEnabled(True) + self.window.pushButton_Cancel.setEnabled(False) + else: + if value == -1: + self.startExport = True + else: + self.startExport = False + self.window.pushButton_createVideo.setEnabled(False) + self.window.pushButton_Cancel.setEnabled(True) + def progressBarSetText(self, value): self.window.progressBar_createVideo.setFormat(value) diff --git a/mainwindow.ui b/mainwindow.ui index 808073b..6119e63 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -711,6 +711,9 @@ </item> <item> <widget class="QPushButton" name="pushButton_Cancel"> + <property name="enabled"> + <bool>false</bool> + </property> <property name="text"> <string>Cancel</string> </property> diff --git a/video_thread.py b/video_thread.py index 2e9eb13..504102a 100644 --- a/video_thread.py +++ b/video_thread.py @@ -82,20 +82,16 @@ class Worker(QtCore.QObject): ) layer = self.core.drawBaseImage(self.backgroundFrames[i]) background.paste(layer) - return background - - def stopVideo(self): - print('Stop Export') - self.canceled = True - self.out_pipe.send_signal(signal.SIGINT) + return background @pyqtSlot(str, str, str, list) def createVideo(self, backgroundImage, inputFile, outputFile, components): + self.components = components self.outputFile = outputFile + self.reset() self.width = int(self.core.settings.value('outputWidth')) self.height = int(self.core.settings.value('outputHeight')) # print('worker thread id: {}'.format(QtCore.QThread.currentThreadId())) - self.components = components progressBarValue = 0 self.progressBarUpdate.emit(progressBarValue) self.progressBarSetText.emit('Loading background imageā¦') @@ -154,14 +150,14 @@ class Worker(QtCore.QObject): # initialize components print('loaded components:', - ["%s%s" % (num, str(component)) for num, component in enumerate(components)]) + ["%s%s" % (num, str(component)) for num, component in enumerate(self.components)]) self.staticComponents = {} - for compNo, comp in enumerate(components): + for compNo, comp in enumerate(self.components): properties = None properties = comp.preFrameRender( worker=self, completeAudioArray=self.completeAudioArray, - sampleSize=self.sampleSize + sampleSize=self.sampleSize, ) if properties and 'static' in properties: @@ -189,29 +185,29 @@ class Worker(QtCore.QObject): frameBuffer = {} self.lastPreview = 0.0 - - for i in range(0, len(self.completeAudioArray), self.sampleSize): - while True: - if i in frameBuffer: - # if frame's in buffer, pipe it to ffmpeg + if not self.canceled: + for i in range(0, len(self.completeAudioArray), self.sampleSize): + while True: + if i in frameBuffer: + # if frame's in buffer, pipe it to ffmpeg + break + # else fetch the next frame & add to the buffer + data = self.renderQueue.get() + frameBuffer[data[0]] = data[1] + self.renderQueue.task_done() + + try: + self.out_pipe.stdin.write(frameBuffer[i].tobytes()) + self.previewQueue.put([i, frameBuffer[i]]) + del frameBuffer[i] + except: break - # else fetch the next frame & add to the buffer - data = self.renderQueue.get() - frameBuffer[data[0]] = data[1] - self.renderQueue.task_done() - - try: - self.out_pipe.stdin.write(frameBuffer[i].tobytes()) - self.previewQueue.put([i, frameBuffer[i]]) - del frameBuffer[i] - except: - break - # increase progress bar value - if progressBarValue + 1 <= (i / len(self.completeAudioArray)) * 100: - progressBarValue = numpy.floor((i / len(self.completeAudioArray)) * 100) - self.progressBarUpdate.emit(progressBarValue) - self.progressBarSetText.emit('%s%%' % str(int(progressBarValue))) + # increase progress bar value + if progressBarValue + 1 <= (i / len(self.completeAudioArray)) * 100: + progressBarValue = numpy.floor((i / len(self.completeAudioArray)) * 100) + self.progressBarUpdate.emit(progressBarValue) + self.progressBarSetText.emit('%s%%' % str(int(progressBarValue))) numpy.seterr(all='print') @@ -224,7 +220,10 @@ class Worker(QtCore.QObject): self.out_pipe.wait() if self.canceled: print("Export Canceled") - os.remove(self.outputFile) + try: + os.remove(self.outputFile) + except: + pass self.progressBarUpdate.emit(0) self.progressBarSetText.emit('Export Canceled') else: @@ -243,3 +242,22 @@ class Worker(QtCore.QObject): self.core.deleteTempDir() self.videoCreated.emit() + + def cancel(self): + self.canceled = True + self.core.cancel() + + for comp in self.components: + comp.cancel() + + try: + self.out_pipe.send_signal(signal.SIGINT) + except: + pass + + def reset(self): + self.core.reset() + + self.canceled = False + for comp in self.components: + comp.reset() |
