Threading changes.

This commit is contained in:
DH4 2017-06-02 08:14:04 -05:00
parent 53598f7a85
commit e33caa9179
4 changed files with 19 additions and 16 deletions

BIN
asd

Binary file not shown.

BIN
asdf

Binary file not shown.

View File

@ -263,16 +263,13 @@ class Main(QtCore.QObject):
self.changeEncodingStatus(True) self.changeEncodingStatus(True)
self.progressBarUpdated(-1) self.progressBarUpdated(-1)
ffmpeg_cmd = self.settings.value("ffmpeg_cmd", expanduser("~")) ffmpeg_cmd = self.settings.value("ffmpeg_cmd", expanduser("~"))
self.videoThread = QtCore.QThread(self) self.videoThread = QtCore.QThread(self)
self.videoWorker = video_thread.Worker(self) self.videoWorker = video_thread.Worker(self)
self.videoWorker.moveToThread(self.videoThread) self.videoWorker.moveToThread(self.videoThread)
self.videoWorker.videoCreated.connect(self.videoCreated) self.videoWorker.videoCreated.connect(self.videoCreated)
self.videoWorker.progressBarUpdate.connect(self.progressBarUpdated) self.videoWorker.progressBarUpdate.connect(self.progressBarUpdated)
self.videoWorker.progressBarSetText.connect(self.progressBarSetText) self.videoWorker.progressBarSetText.connect(self.progressBarSetText)
self.videoWorker.imageCreated.connect(self.showPreviewImage) self.videoWorker.imageCreated.connect(self.showPreviewImage)
self.videoThread.start() self.videoThread.start()
self.videoTask.emit(self.window.lineEdit_background.text(), self.videoTask.emit(self.window.lineEdit_background.text(),
self.window.lineEdit_audioFile.text(), self.window.lineEdit_audioFile.text(),
@ -291,6 +288,7 @@ class Main(QtCore.QObject):
else: else:
self.window.pushButton_createVideo.setEnabled(True) self.window.pushButton_createVideo.setEnabled(True)
self.window.pushButton_Cancel.setEnabled(False) self.window.pushButton_Cancel.setEnabled(False)
def progressBarSetText(self, value): def progressBarSetText(self, value):

View File

@ -8,7 +8,7 @@ import subprocess as sp
import sys import sys
import os import os
from queue import Queue, PriorityQueue from queue import Queue, PriorityQueue
from threading import Thread from threading import Thread, Event
import time import time
from copy import copy from copy import copy
import signal import signal
@ -31,9 +31,10 @@ class Worker(QtCore.QObject):
self.sampleSize = 1470 self.sampleSize = 1470
self.canceled = False self.canceled = False
self.error = False self.error = False
self.stopped = False
def renderNode(self): def renderNode(self):
while True: while not self.stopped:
i = self.compositeQueue.get() i = self.compositeQueue.get()
if self.imBackground is not None: if self.imBackground is not None:
@ -61,11 +62,9 @@ class Worker(QtCore.QObject):
for i in range(0, len(self.completeAudioArray), self.sampleSize): for i in range(0, len(self.completeAudioArray), self.sampleSize):
self.compositeQueue.put([i, self.bgI]) self.compositeQueue.put([i, self.bgI])
self.compositeQueue.join()
print('Compositing Complete.')
def previewDispatch(self): def previewDispatch(self):
while True: while not self.stopped:
i = self.previewQueue.get() i = self.previewQueue.get()
if time.time() - self.lastPreview >= 0.06 or i[0] == 0: if time.time() - self.lastPreview >= 0.06 or i[0] == 0:
self._image = ImageQt(i[1]) self._image = ImageQt(i[1])
@ -82,7 +81,7 @@ class Worker(QtCore.QObject):
) )
layer = self.core.drawBaseImage(self.backgroundFrames[i]) layer = self.core.drawBaseImage(self.backgroundFrames[i])
background.paste(layer) background.paste(layer)
return background return background
@pyqtSlot(str, str, str, list) @pyqtSlot(str, str, str, list)
def createVideo(self, backgroundImage, inputFile, outputFile, components): def createVideo(self, backgroundImage, inputFile, outputFile, components):
@ -113,7 +112,7 @@ class Worker(QtCore.QObject):
# test if user has libfdk_aac # test if user has libfdk_aac
encoders = sp.check_output(self.core.FFMPEG_BIN + " -encoders -hide_banner", shell=True) encoders = sp.check_output(self.core.FFMPEG_BIN + " -encoders -hide_banner", shell=True)
acodec = self.core.settings.value('outputAudioCodec') acodec = self.core.settings.value('outputAudioCodec')
if b'libfdk_aac' in encoders and acodec == 'aac': if b'libfdk_aac' in encoders and acodec == 'aac':
acodec = 'libfdk_aac' acodec = 'libfdk_aac'
@ -143,8 +142,6 @@ class Worker(QtCore.QObject):
ffmpegCommand.append(outputFile) ffmpegCommand.append(outputFile)
self.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 # create video for output
numpy.seterr(divide='ignore') numpy.seterr(divide='ignore')
@ -167,6 +164,7 @@ class Worker(QtCore.QObject):
if properties and 'static' in properties: if properties and 'static' in properties:
self.staticComponents[compNo] = copy(comp.frameRender(compNo, 0)) self.staticComponents[compNo] = copy(comp.frameRender(compNo, 0))
self.progressBarUpdate.emit(100)
self.compositeQueue = Queue() self.compositeQueue = Queue()
self.compositeQueue.maxsize = 20 self.compositeQueue.maxsize = 20
@ -174,11 +172,12 @@ class Worker(QtCore.QObject):
self.renderQueue.maxsize = 20 self.renderQueue.maxsize = 20
self.previewQueue = PriorityQueue() self.previewQueue = PriorityQueue()
self.renderThreads = []
# create threads to render frames and send them back here for piping out # create threads to render frames and send them back here for piping out
for i in range(3): for i in range(3):
t = Thread(target=self.renderNode, name="Render Thread") self.renderThreads.append(Thread(target=self.renderNode, name="Render Thread"))
t.daemon = True self.renderThreads[i].daemon = True
t.start() self.renderThreads[i].start()
self.dispatchThread = Thread(target=self.renderDispatch, name="Render Dispatch Thread") self.dispatchThread = Thread(target=self.renderDispatch, name="Render Dispatch Thread")
self.dispatchThread.daemon = True self.dispatchThread.daemon = True
@ -190,6 +189,9 @@ class Worker(QtCore.QObject):
frameBuffer = {} frameBuffer = {}
self.lastPreview = 0.0 self.lastPreview = 0.0
self.progressBarUpdate.emit(0)
pStr = "Exporting video..."
self.progressBarSetText.emit(pStr)
if not self.canceled: if not self.canceled:
for i in range(0, len(self.completeAudioArray), self.sampleSize): for i in range(0, len(self.completeAudioArray), self.sampleSize):
while True: while True:
@ -247,8 +249,11 @@ class Worker(QtCore.QObject):
self.canceled = False self.canceled = False
self.parent.drawPreview() self.parent.drawPreview()
self.core.deleteTempDir() self.core.deleteTempDir()
self.parent.changeEncodingStatus(False) self.stopped = True
self.videoCreated.emit() self.videoCreated.emit()
self.parent.changeEncodingStatus(False)
return
def updateProgress(self, pStr, pVal): def updateProgress(self, pStr, pVal):
self.progressBarValue.emit(pVal) self.progressBarValue.emit(pVal)