diff options
| author | Brianna Rainey | 2022-05-02 17:37:11 -0700 |
|---|---|---|
| committer | GitHub | 2022-05-02 17:37:11 -0700 |
| commit | b765295d9790c240473dbdccd5dc730f39c2a763 (patch) | |
| tree | af1776499661cbea87e65b03719fbe722391f23f /src/video_thread.py | |
| parent | 4c5aa37aa6f41d909153a2b7d522db6d7582659a (diff) | |
| parent | 6c3410da0b7fc39a9bc613c208b6e6cd3d3c6ed2 (diff) | |
Merge pull request #71 from djfun/fix-70
Fix #70 - Crash when exporting video in GUI mode
Diffstat (limited to 'src/video_thread.py')
| -rw-r--r-- | src/video_thread.py | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/video_thread.py b/src/video_thread.py index 5a28beb..dc6db89 100644 --- a/src/video_thread.py +++ b/src/video_thread.py @@ -44,6 +44,7 @@ class Worker(QtCore.QObject): self.settings = parent.settings self.modules = parent.core.modules parent.createVideo.connect(self.createVideo) + self.previewEnabled = type(parent.core).previewEnabled #self.parent = parent self.components = components @@ -114,25 +115,23 @@ class Worker(QtCore.QObject): for audioI in range(0, self.audioArrayLen, self.sampleSize): self.compositeQueue.put(audioI) - def previewDispatch(self): + def showPreview(self, frame): ''' - Grabs frames from the previewQueue, adds them to the checkerboard - and emits a final QImage to the MainWindow for the live preview + Receives a final frame that will be piped to FFmpeg, + adds it to the checkerboard and emits a final QImage + to the MainWindow for the live preview ''' - background = Checkerboard(self.width, self.height) - - while not self.stopped: - audioI, frame = self.previewQueue.get() - if time.time() - self.lastPreview >= 0.06 or audioI == 0: - image = Image.alpha_composite(background.copy(), frame) - self.imageCreated.emit(QtGui.QImage(ImageQt(image))) - self.lastPreview = time.time() - - self.previewQueue.task_done() + # We must store a reference to this QImage + # or else Qt will garbage-collect it on the C++ side + self.latestPreview = ImageQt(frame) + self.imageCreated.emit(QtGui.QImage(self.latestPreview)) + self.lastPreview = time.time() @pyqtSlot() def createVideo(self): log.debug("Video worker received signal to createVideo") + log.debug( + 'Video thread id: {}'.format(int(QtCore.QThread.currentThreadId()))) numpy.seterr(divide='ignore') self.encoding.emit(True) self.extraAudio = [] @@ -143,7 +142,6 @@ class Worker(QtCore.QObject): self.compositeQueue.maxsize = 20 self.renderQueue = PriorityQueue() self.renderQueue.maxsize = 20 - self.previewQueue = PriorityQueue() self.reset() progressBarValue = 0 @@ -305,15 +303,13 @@ class Worker(QtCore.QObject): self.dispatchThread.daemon = True self.dispatchThread.start() - self.lastPreview = 0.0 - self.previewDispatch = Thread( - target=self.previewDispatch, name="Render Dispatch Thread" - ) - self.previewDispatch.daemon = True - self.previewDispatch.start() + # Last time preview was drawn + self.lastPreview = time.time() # Begin piping into ffmpeg! - frameBuffer = {} + frameBuffer = { + # audioI: bytes ready to be piped + } progressBarValue = 0 self.progressBarUpdate.emit(progressBarValue) self.progressBarSetText.emit("Exporting video...") @@ -331,9 +327,12 @@ class Worker(QtCore.QObject): if self.canceled: break + # Update live preview + if self.previewEnabled and time.time() - self.lastPreview > 0.5: + self.showPreview(frameBuffer[audioI]) + try: self.out_pipe.stdin.write(frameBuffer[audioI].tobytes()) - self.previewQueue.put([audioI, frameBuffer.pop(audioI)]) except Exception: break @@ -346,6 +345,7 @@ class Worker(QtCore.QObject): "Exporting video: %s%%" % str(int(progressBarValue)) ) + numpy.seterr(all='print') self.closePipe() |
