我在另一台机器上运行ffmpeg进行屏幕捕获。我希望能够阻止它远程录制。 FFMPEG要求按下q以停止编码,因为它必须完成一些完成以干净地完成文件。我知道我可以用kill / killall杀死它但是这会导致视频损坏。
Press [q] to stop encoding
我在谷歌专门为此找不到任何东西,但有些人建议回复到/ proc // fd / 0将起作用。
我试过这个,但它并没有停止ffmpeg。然而,q显示在运行ffmpeg的终端中。
echo -n q > /proc/16837/fd/0
那么如何将角色以这样的方式发送到另一个现有流程呢?就好像它是在本地键入的一样?还是有另一种方法可以干净地远程停止ffmpeg。
答案 0 :(得分:13)
这是我在遇到这个问题时发现的一个巧妙的技巧:创建一个空文件(它不必是命名管道或任何东西),然后在停止录制时向它写'q'。
FFmpeg停止,好像从终端STDIN得到'q'。
答案 1 :(得分:11)
较新版本的ffmpeg不再使用'q',至少在Ubuntu Oneiric上,而是按Ctrl + C来停止它们。因此,对于更新的版本,您只需使用'killall -INT'向它们发送SIGINT而不是SIGTERM,它们应该干净地退出。
答案 2 :(得分:2)
详细说明sashoalm的答案,我已经测试了这两种情况,结果如下:
killall --user $USER --ignore-case --signal INT ffmpeg
Exiting normally, received signal 2.
killall --user $USER --ignore-case --signal SIGTERM ffmpeg
Exiting normally, received signal 15.
所以看起来ffmpeg对两个信号都很好。
系统:Debian GNU / Linux 9(拉伸),2020-02-28
答案 3 :(得分:0)
您还可以尝试使用“expect”来自动执行和停止程序。您必须使用screen
,tmux
或byobu
之类的虚拟shell启动它,然后启动它内部的ffmpeg
。通过这种方式,您将能够再次获得虚拟外壳屏幕并提供“q”选项。
本地或远程启动虚拟shell会话,让我们说“屏幕”。使用-S
选项命名会话,例如screen -S recvideo
然后您可以根据需要启动ffmpeg。您可以选择使用Ctrl + a + d
连接到屏幕内运行ffmpeg的机器(或tmux或其他)并重新连接到它:screen -d -RR recvideo
然后发送“q”
要从脚本内部执行此操作,您可以使用expect,例如:
prompt="> "
expect << EOF
set timeout 20
spawn screen -S recvideo
expect "$prompt"
send -- "ffmpeg xxxxx\r"
set timeout 1
expect eof
EOF
然后,在另一个时刻或脚本点或另一个脚本中,您可以恢复它:
expect << EOF
set timeout 30
spawn screen -d -RR recvideo
expect "$prompt"
send -- "q"
expect "$prompt"
send -- "exit\r"
expect eof
EOF
您还可以使用expect自动执行整个ssh
会话,传递一系列命令并“期望”执行您想要的操作。