Search code examples
pythonpython-3.xffmpegsubprocesspopen

Python subprocess.Popen + ffmpeg breaks terminal input


I was writing a module to create random screenshots from a video and used subprocess.Popen to run multiple commands in parallel but this leads to terminal refusing from showing any input once the python program is finished running. But it still accepts most inputs given from the keyboard it just doesn't display it.

Only if I type the reset command terminal starts working fine This happened on ssh with putty and other ssh clients even ssh with powershell on windows and directly running on terminal with VNC

But without ssh directly running the same command on windows ssh works fine and and inputs are visible

here's a gif example for whats happening enter image description here

and code to replicate it

#!/usr/bin/env python3.8
from subprocess import Popen

def create_screenshots():

    commands = ['ffmpeg -hide_banner -loglevel panic -ss 329  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.329.frame.png"',
                'ffmpeg -hide_banner -loglevel panic -ss 312  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.312.frame.png"',
                'ffmpeg -hide_banner -loglevel panic -ss 533  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.533.frame.png"',
                'ffmpeg -hide_banner -loglevel panic -ss 444  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.444.frame.png"',
                'ffmpeg -hide_banner -loglevel panic -ss 411  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.411.frame.png"',
                'ffmpeg -hide_banner -loglevel panic -ss 413  -i "/home/user/file.mkv" -y -vframes 1   "/home/user/file.413.frame.png"']
    screenshot_files = []
    processes = [Popen(command, shell=True) for command in commands]
    for process in processes:
        process.wait()
    
    return screenshot_files


create_screenshots()

Solution

  • After weeks of searching finally found the answer to this right after I posted the question

    this answer is what I was looking for https://stackoverflow.com/a/59148094

    not sure if there is a better way to handle this with Popen but adding -nostdin flag to ffmpeg command fixed the issue I was having