From 53598f7a85e0238d5c2c42cd248876fb4e06eb16 Mon Sep 17 00:00:00 2001 From: DH4 Date: Fri, 2 Jun 2017 03:30:51 -0500 Subject: Progressbar enhancement. --- asd | Bin 0 -> 1310087 bytes asdf | Bin 0 -> 9685175 bytes components/original.py | 12 ++++++++++++ core.py | 35 +++++++++++++++++++++++++++++++++-- main.py | 23 ++++++----------------- video_thread.py | 19 +++++++++++++++---- 6 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 asd create mode 100644 asdf diff --git a/asd b/asd new file mode 100644 index 0000000..39f0fa8 Binary files /dev/null and b/asd differ diff --git a/asdf b/asdf new file mode 100644 index 0000000..8cccca4 Binary files /dev/null and b/asdf differ diff --git a/components/original.py b/components/original.py index e1240e9..6903a5f 100644 --- a/components/original.py +++ b/components/original.py @@ -66,6 +66,14 @@ class Component(__base__.Component): self.smoothConstantDown, self.smoothConstantUp, self.lastSpectrum) self.spectrumArray[i] = copy(self.lastSpectrum) + progress = int(100*(i/len(self.completeAudioArray))) + if progress >= 100: + progress = 100 + pStr = "Analyzing audio: "+ str(progress) +'%' + self.progressBarSetText.emit(pStr) + self.progressBarUpdate.emit(int(progress)) + + def frameRender(self, moduleNo, frameNo): width = int(self.worker.core.settings.value('outputWidth')) height = int(self.worker.core.settings.value('outputHeight')) @@ -151,3 +159,7 @@ class Component(__base__.Component): def reset(self): self.canceled = False + + + + diff --git a/core.py b/core.py index 0bbe001..96f5670 100644 --- a/core.py +++ b/core.py @@ -55,7 +55,24 @@ class Core(): return im - def readAudioFile(self, filename): + def readAudioFile(self, filename, parent): + command = [ self.FFMPEG_BIN, + '-i', filename] + + try: + fileInfo = sp.check_output(command, stderr=sp.STDOUT, shell=False) + except sp.CalledProcessError as ex: + fileInfo = ex.output + pass + + info = fileInfo.decode("utf-8").split('\n') + for line in info: + if 'Duration' in line: + d = line.split(',')[0] + d = d.split(' ')[3] + d = d.split(':') + duration = float(d[0])*3600 + float(d[1])*60 + float(d[2]) + command = [ self.FFMPEG_BIN, '-i', filename, '-f', 's16le', @@ -67,16 +84,30 @@ class Core(): completeAudioArray = numpy.empty(0, dtype="int16") + progress = 0 + lastPercent = None while True: if self.canceled: break # read 2 seconds of audio + progress = progress + 4 raw_audio = in_pipe.stdout.read(88200*4) if len(raw_audio) == 0: break audio_array = numpy.fromstring(raw_audio, dtype="int16") completeAudioArray = numpy.append(completeAudioArray, audio_array) - # print(audio_array) + + percent = int(100*(progress/duration)) + if percent >= 100: + percent = 100 + + if lastPercent != percent: + string = 'Loading audio file: '+str(percent)+'%' + parent.progressBarSetText.emit(string) + parent.progressBarUpdate.emit(percent) + + lastPercent = percent + in_pipe.kill() in_pipe.wait() diff --git a/main.py b/main.py index 94020b2..f13af7d 100644 --- a/main.py +++ b/main.py @@ -260,7 +260,7 @@ class Main(QtCore.QObject): # 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.changeEncodingStatus(True) self.progressBarUpdated(-1) ffmpeg_cmd = self.settings.value("ffmpeg_cmd", expanduser("~")) @@ -282,26 +282,15 @@ class Main(QtCore.QObject): self.showMessage("You must select an audio file and output filename.") def progressBarUpdated(self, 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 + def changeEncodingStatus(self, status): + if status: self.window.pushButton_createVideo.setEnabled(False) self.window.pushButton_Cancel.setEnabled(True) + else: + self.window.pushButton_createVideo.setEnabled(True) + self.window.pushButton_Cancel.setEnabled(False) def progressBarSetText(self, value): diff --git a/video_thread.py b/video_thread.py index 504102a..9f3eee2 100644 --- a/video_thread.py +++ b/video_thread.py @@ -107,8 +107,8 @@ class Worker(QtCore.QObject): self.imBackground = None self.bgI = 0 - self.progressBarSetText.emit('Loading audio file…') - self.completeAudioArray = self.core.readAudioFile(inputFile) + self.progressBarSetText.emit('Loading audio file...') + self.completeAudioArray = self.core.readAudioFile(inputFile, self) # test if user has libfdk_aac encoders = sp.check_output(self.core.FFMPEG_BIN + " -encoders -hide_banner", shell=True) @@ -152,12 +152,17 @@ class Worker(QtCore.QObject): print('loaded components:', ["%s%s" % (num, str(component)) for num, component in enumerate(self.components)]) self.staticComponents = {} + numComps = len(self.components) for compNo, comp in enumerate(self.components): + pStr = "Analyzing audio..." + self.progressBarSetText.emit(pStr) properties = None properties = comp.preFrameRender( worker=self, completeAudioArray=self.completeAudioArray, sampleSize=self.sampleSize, + progressBarUpdate=self.progressBarUpdate, + progressBarSetText=self.progressBarSetText ) if properties and 'static' in properties: @@ -207,7 +212,8 @@ class Worker(QtCore.QObject): 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))) + pStr = "Exporting video: " + str(int(progressBarValue)) + "%" + self.progressBarSetText.emit(pStr) numpy.seterr(all='print') @@ -226,6 +232,7 @@ class Worker(QtCore.QObject): pass self.progressBarUpdate.emit(0) self.progressBarSetText.emit('Export Canceled') + else: if self.error: print("Export Failed") @@ -240,9 +247,13 @@ class Worker(QtCore.QObject): self.canceled = False self.parent.drawPreview() self.core.deleteTempDir() - + self.parent.changeEncodingStatus(False) self.videoCreated.emit() + def updateProgress(self, pStr, pVal): + self.progressBarValue.emit(pVal) + self.progressBarSetText.emit(pStr) + def cancel(self): self.canceled = True self.core.cancel() -- cgit v1.2.3