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