Added ability to cancel export.

This commit is contained in:
DH4 2017-06-01 23:24:13 -05:00
parent 7d8e9ab3b1
commit 6bf36d0324
2 changed files with 51 additions and 15 deletions

14
main.py
View File

@ -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)

View File

@ -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()