Почему этот Popen с потоками не работает? - PullRequest
0 голосов
/ 06 ноября 2018

Я написал небольшой графический интерфейс tkinter для обработки 4 входных данных в ffmpeg. Поскольку подпроцесс займет некоторое время, я хочу получить статус процесса. Поэтому я использую многопоточность, чтобы tkinter не зависал при выполнении подпроцесса.

Моя проблема заключается в том, что при работе с потоками команда ffmpeg выводит конечный файл с 0 КБ, и больше ничего не записывается в файл. Если я использую свою функцию без многопоточности, все работает, но графический интерфейс зависает.

Вот основная часть кода:

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)

Почему моя тема не работает?

1 Ответ

0 голосов
/ 11 ноября 2018

Проблема была в том, что process.stdout.readline () Всегда пусто, так как ffmpeg всегда записывает все в stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...