#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, но это не решило проблему. Однако использование обычной потоковой передачи