如何远程停止ffmpeg?

时间:2012-03-15 15:12:20

标签: linux ffmpeg

我在另一台机器上运行ffmpeg进行屏幕捕获。我希望能够阻止它远程录制。 FFMPEG要求按下q以停止编码,因为它必须完成一些完成以干净地完成文件。我知道我可以用kill / killall杀死它但是这会导致视频损坏。

Press [q] to stop encoding

我在谷歌专门为此找不到任何东西,但有些人建议回复到/ proc // fd / 0将起作用。

我试过这个,但它并没有停止ffmpeg。然而,q显示在运行ffmpeg的终端中。

echo -n q > /proc/16837/fd/0

那么如何将角色以这样的方式发送到另一个现有流程呢?就好像它是在本地键入的一样?还是有另一种方法可以干净地远程停止ffmpeg。

4 个答案:

答案 0 :(得分:13)

这是我在遇到这个问题时发现的一个巧妙的技巧:创建一个空文件(它不必是命名管道或任何东西),然后在停止录制时向它写'q'。

  1. $ touch stop
  2. $< ./ stop ffmpeg -i ... output.ext> / dev / null 2>> Capture.log&
  3. $等待停止时间
  4. $ echo'q'>停止
  5. 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

在运行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”来自动执行和停止程序。您必须使用screentmuxbyobu之类的虚拟shell启动它,然后启动它内部的ffmpeg。通过这种方式,您将能够再次获得虚拟外壳屏幕并提供“q”选项。

  1. 本地或远程启动虚拟shell会话,让我们说“屏幕”。使用-S选项命名会话,例如screen -S recvideo然后您可以根据需要启动ffmpeg。您可以选择使用Ctrl + a + d

  2. 从此会话中分离
  3. 连接到屏幕内运行ffmpeg的机器(或tmux或其他)并重新连接到它:screen -d -RR recvideo然后发送“q”

  4. 要从脚本内部执行此操作,您可以使用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会话,传递一系列命令并“期望”执行您想要的操作。