diff --git a/main.py b/main.py index f34cbee..bb42d1f 100644 --- a/main.py +++ b/main.py @@ -173,6 +173,7 @@ class Main(QtCore.QObject): window.toolButton_selectOutputFile.clicked.connect(self.openOutputFileDialog) window.progressBar_createVideo.setValue(0) window.pushButton_createVideo.clicked.connect(self.createAudioVisualisation) + window.pushButton_Cancel.clicked.connect(self.stopVideo) window.setWindowTitle("Audio Visualizer") self.previewWindow = PreviewWindow(self, r"background.jpg") @@ -250,6 +251,13 @@ class Main(QtCore.QObject): self.window.lineEdit_background.setText(fileName) self.drawPreview() + def stopVideo(self): + print('stop') + try: + self.videoWorker.stopVideo() + except: + pass + def createAudioVisualisation(self): # create output video if mandatory settings are filled in if self.window.lineEdit_audioFile.text() and self.window.lineEdit_outputFile.text(): @@ -262,8 +270,8 @@ class Main(QtCore.QObject): self.videoWorker.videoCreated.connect(self.videoCreated) self.videoWorker.progressBarUpdate.connect(self.progressBarUpdated) self.videoWorker.progressBarSetText.connect(self.progressBarSetText) - self.videoWorker.imageCreated.connect(self.showPreviewImage) - + self.videoWorker.imageCreated.connect(self.showPreviewImage) + self.videoThread.start() self.videoTask.emit(self.window.lineEdit_background.text(), self.window.lineEdit_audioFile.text(), @@ -271,7 +279,7 @@ class Main(QtCore.QObject): self.selectedComponents) else: self.showMessage("You must select an audio file and output filename.") - + def progressBarUpdated(self, value): self.window.progressBar_createVideo.setValue(value) diff --git a/video_thread.py b/video_thread.py index a7c7ac6..2e9eb13 100644 --- a/video_thread.py +++ b/video_thread.py @@ -6,10 +6,12 @@ import core import numpy import subprocess as sp import sys +import os from queue import Queue, PriorityQueue from threading import Thread import time from copy import copy +import signal class Worker(QtCore.QObject): @@ -27,6 +29,8 @@ class Worker(QtCore.QObject): self.parent = parent parent.videoTask.connect(self.createVideo) self.sampleSize = 1470 + self.canceled = False + self.error = False def renderNode(self): while True: @@ -80,8 +84,14 @@ class Worker(QtCore.QObject): background.paste(layer) return background + def stopVideo(self): + print('Stop Export') + self.canceled = True + self.out_pipe.send_signal(signal.SIGINT) + @pyqtSlot(str, str, str, list) def createVideo(self, backgroundImage, inputFile, outputFile, components): + self.outputFile = outputFile self.width = int(self.core.settings.value('outputWidth')) self.height = int(self.core.settings.value('outputHeight')) # print('worker thread id: {}'.format(QtCore.QThread.currentThreadId())) @@ -135,7 +145,9 @@ class Worker(QtCore.QObject): ffmpegCommand.append('-2') ffmpegCommand.append(outputFile) - out_pipe = sp.Popen(ffmpegCommand, stdin=sp.PIPE,stdout=sys.stdout, stderr=sys.stdout) + self.out_pipe = sp.Popen(ffmpegCommand, stdin=sp.PIPE,stdout=sys.stdout, stderr=sys.stdout) + + # create video for output numpy.seterr(divide='ignore') @@ -189,11 +201,11 @@ class Worker(QtCore.QObject): self.renderQueue.task_done() try: - out_pipe.stdin.write(frameBuffer[i].tobytes()) + self.out_pipe.stdin.write(frameBuffer[i].tobytes()) self.previewQueue.put([i, frameBuffer[i]]) del frameBuffer[i] - finally: - True + except: + break # increase progress bar value if progressBarValue + 1 <= (i / len(self.completeAudioArray)) * 100: @@ -203,15 +215,31 @@ class Worker(QtCore.QObject): numpy.seterr(all='print') - out_pipe.stdin.close() - if out_pipe.stderr is not None: - print(out_pipe.stderr.read()) - out_pipe.stderr.close() + self.out_pipe.stdin.close() + if self.out_pipe.stderr is not None: + print(self.out_pipe.stderr.read()) + self.out_pipe.stderr.close() + self.error = True # out_pipe.terminate() # don't terminate ffmpeg too early - out_pipe.wait() - print("Video file created") + self.out_pipe.wait() + if self.canceled: + print("Export Canceled") + os.remove(self.outputFile) + self.progressBarUpdate.emit(0) + self.progressBarSetText.emit('Export Canceled') + else: + if self.error: + print("Export Failed") + self.progressBarUpdate.emit(0) + self.progressBarSetText.emit('Export Failed') + else: + print("Export Complete") + self.progressBarUpdate.emit(100) + self.progressBarSetText.emit('Export Complete') + + self.error = False + self.canceled = False self.parent.drawPreview() self.core.deleteTempDir() - self.progressBarUpdate.emit(100) - self.progressBarSetText.emit('100%') + self.videoCreated.emit()