在Windows上的Python Popen子进程中暂停FFmpeg编码

在Windows上的Python Popen子进程中暂停FFmpeg编码,python,ffmpeg,subprocess,signals,popen,Python,Ffmpeg,Subprocess,Signals,Popen,我试图在FFmpeg处于非shell子进程时暂停它的编码(这对于它如何在更大的程序中播放很重要)。这可以通过自己按键盘上的“暂停/中断”键来完成,我正在尝试将其发送给Popen 命令本身必须是跨平台兼容的,所以我不能以任何方式包装它,但我可以根据需要发送信号或运行特定于平台的函数 我看了一下,它建议发送一个信号,但这引发了一个“ValueError:Unsupported signal:21” 然后尝试使用GenerateConsoleCtrlEvent创建Ctrl+Break事件,如下所述 我

我试图在FFmpeg处于非shell子进程时暂停它的编码(这对于它如何在更大的程序中播放很重要)。这可以通过自己按键盘上的“暂停/中断”键来完成,我正在尝试将其发送给Popen

命令本身必须是跨平台兼容的,所以我不能以任何方式包装它,但我可以根据需要发送信号或运行特定于平台的函数

我看了一下,它建议发送一个信号,但这引发了一个“ValueError:Unsupported signal:21”

然后尝试使用GenerateConsoleCtrlEvent创建Ctrl+Break事件,如下所述

我已经尝试了psutil的暂停功能,但它即使在“暂停”时也能保持很高的CPU负载

尽管它在整个程序中不起作用,但我至少尝试过设置
creationflags=CREATE\u NEW\u PROCESS\u GROUP
,这使得SIGBREAK不会出错,也不会暂停。因为Ctrl-Break事件将完全停止编码,而不是暂停编码

from subprocess import Popen, PIPE
import signal


if __name__ == '__main__':
    command = "ffmpeg.exe -y -i example_video.mkv -map 0:v -c:v libx265 -preset slow -crf 18 output.mkv"
    proc = Popen(command, stdin=PIPE, shell=False)

    try:
        proc.send_signal(signal.SIGBREAK)
    finally:
        proc.wait()
from subprocess import Popen, PIPE
import ctypes


if __name__ == '__main__':
    command = "ffmpeg.exe -y -i example_video.mkv -map 0:v -c:v libx265 -preset slow -crf 18 output.mkv"
    proc = Popen(command, stdin=PIPE, shell=False)

    try:
        ctypes.windll.kernel32.GenerateConsoleCtrlEvent(1, proc.pid)
    finally:
        proc.wait()