PyQt5 показывает черное окно без виджетов, пока moviepy объединяет видео

#python-3.x #user-interface #pyqt5 #qthread #moviepy

#python-3.x #пользовательский интерфейс #pyqt5 #qthread #moviepy

Вопрос:

При объединении двух видеофайлов окно PyQt становится полностью черным без виджетов. Цвет фона меняется на серый, и виджет отображается только после объединения видео.

Я хотел бы видеть серое окно и мой виджет во время объединения видео.

Вот сценарий:

 import os
import sys
from PyQt5.QtWidgets import *
from moviepy.editor import VideoFileClip, concatenate_videoclips


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Using Labels")
        self.setGeometry(50,50,350,350)
        self.UI()


    def UI(self):
        text1=QLabel("Hello Python",self)
        text1.move(50,50)
        self.show()

def make_movie():
    sep = os.sep
    directory_stub = '.'   sep   'src'   sep   "assets"   sep  
    clip1 = VideoFileClip(directory_stub   'introoutro'   sep   "intro.mp4")
    clip2 = VideoFileClip(directory_stub   'introoutro'   sep   "outro.mp4")
    final_clip = concatenate_videoclips([clip1,clip2])
    final_clip.write_videofile("my_concatenation.mp4")

def main():
    App = QApplication(sys.argv)
    window=Window()
    make_movie()
    sys.exit(App.exec_())

if __name__ == '__main__':
    main()
  

Пока видео собираются вместе, я вижу это:

введите описание изображения здесь

Я хочу видеть это во время обработки видео, но я вижу это только 1. после завершения обработки или 2. если я отредактирую код, чтобы никогда не вызывать make_movie():

введите описание изображения здесь

Спасибо за любую помощь.

Ответ №1:

Конкатенация — очень трудоемкая задача, поэтому ее не следует запускать в основном потоке, поскольку она может заморозить графический интерфейс:

 import os
import sys
import threading

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from moviepy.editor import VideoFileClip, concatenate_videoclips


class QMovie(QObject):
    started = pyqtSignal()
    finished = pyqtSignal()

    def concatenate(self, inputs, output):
        threading.Thread(
            target=self._concatenate, args=(inputs, output), daemon=True
        ).start()

    def _concatenate(self, inputs, output):
        self.started.emit()
        clips = []
        for input_ in inputs:
            clip = VideoFileClip(input_)
            clips.append(clip)
        output_clip = concatenate_videoclips(clips)
        output_clip.write_videofile(output)
        self.finished.emit()


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Using Labels")
        self.setGeometry(50, 50, 350, 350)
        self.UI()

    def UI(self):
        text1 = QLabel("Hello Python", self)
        text1.move(50, 50)
        self.show()


def main():
    App = QApplication(sys.argv)
    window = Window()

    directory_stub = os.path.join(".", "src", "assets")
    in1 = os.path.join(directory_stub, "introoutro", "intro.mp4")
    in2 = os.path.join(directory_stub, "introoutro", "outro.mp4")
    qmovie = QMovie()
    qmovie.concatenate([in1, in2], "my_concatenation.mp4")
    sys.exit(App.exec_())


if __name__ == "__main__":
    main()
  

Комментарии:

1. Спасибо! Мой оригинальный сценарий использовал QThread, но это не решило проблему. Однако использование обычной потоковой передачи