PyQt5在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()

将视频放在一起时,我会看到:

enter image description here

我想在视频处理过程中看到它,但是我只能在处理完成后看到它; 2.如果我编辑代码以永不调用make_movie():

enter image description here

感谢您的帮助。

解决方法

串联是一项非常耗时的任务,因此不应在主线程上运行,因为它会冻结GUI:

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,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,"outro.mp4")
    qmovie = QMovie()
    qmovie.concatenate([in1,in2],"my_concatenation.mp4")
    sys.exit(App.exec_())


if __name__ == "__main__":
    main()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...