问题描述
串联两个视频文件时,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()
将视频放在一起时,我会看到:
我想在视频处理过程中看到它,但是我只能在处理完成后看到它; 2.如果我编辑代码以永不调用make_movie():
感谢您的帮助。
解决方法
串联是一项非常耗时的任务,因此不应在主线程上运行,因为它会冻结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()