我写了一点tkinter GUI来处理ffmpeg的4个输入。由于该子流程将花费一些时间,因此我想说明该流程。因此,我使用线程,以便在执行子进程时tkinter不会冻结。
我的问题是,使用ffmpeg命令执行线程输出时,目标文件的大小为0kb,并且没有任何内容写入该文件。如果我在没有线程的情况下使用函数,则一切正常,但GUI冻结。
这是代码的主要部分:
def ffmpeg(v0,v1,v2,v3):
cmd = [ path+'ffmpeg.exe',"-y","-i",v0,"-i",v1,"-i",v2,'-i',v3,'-filter_complex',"[0:v][1:v]hstack[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack,format=yuv420p[v]",'-map',"[v]","out.mp4"]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
while True:
output = process.stdout.readline()
inpu = process.stderr.readline()
if output == b'' and process.poll() is not None:
break
if output:
print(output.strip()) # HERE i will insert into tkinter textfield
rc = process.poll()
def buttonClick(v0,v1,v2,v3):
#ffmpeg(v0,v1,v2,v3) # This line works
t = threading.Thread(target=ffmpeg,args=(v0,v1,v2,v3,)) #This doesn't work
t.start()
#t.join()
#tkvar list elements are absolute paths to the videofiles
submitButton = Button(mainframe, text="Process Video", command=lambda: buttonClick(tkvar[0].get(),tkvar[1].get(),tkvar[2].get(),tkvar[3].get()))
submitButton.grid(row = 7, column =3)
为什么我的线程无法正常工作?
答案 0 :(得分:0)
问题是 process.stdout.readline() 由于ffmpeg始终将所有内容都写入stderr,因此始终为空。