【问题标题】:How to stop ffmpeg remotely?如何远程停止ffmpeg?
【发布时间】:2012-04-01 03:09:50
【问题描述】:

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

Press [q] to stop encoding

我在谷歌上找不到任何专门针对此的内容,但有人建议回显到 /proc//fd/0 会起作用。

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

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

那么我怎样才能将一个字符发送到另一个现有进程,就好像它是在本地输入的一样?还是有另一种方法可以干净地远程停止ffmpeg。

【问题讨论】:

  • 较新版本的 ffmpeg 不再使用 'q' 了,至少在 Ubuntu Oneiric 上,他们说要按 Ctrl+C 来停止它们。因此,对于较新的版本,您可以简单地使用“killall -INT”向他们发送 SIGINT 而不是 SIGTERM,他们应该干净地退出。
  • @satuon:那个版本的 Ubuntu 很可能使用 avconv(分叉的 Libav 项目的一部分)。该实用程序已将“q”作为选项删除;主要的 FFmpeg 仍然有它。
  • 我发现我可以使用 kill -2 干净地停止 ffmpeg。不过,我仍然对如何模拟按下其他应用程序的按键感兴趣。
  • @satuon 您想添加您对 Ctrl+C 的建议作为答案,以便我接受吗?
  • 好的,我将其粘贴为答案。

标签: linux ffmpeg


【解决方案1】:

详细说明 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 (stretch),2020-02-28

【讨论】:

    【解决方案2】:

    您也可以尝试使用“expect”来自动执行和停止程序。您必须使用screentmuxbyobu 等虚拟shell 启动它,然后在其中启动ffmpeg。这样您就可以再次获得虚拟外壳屏幕并提供“q”选项。

    1. 本地或远程启动虚拟外壳会话,可以说是“屏幕”。使用-S 选项命名会话,例如screen -S recvideo 然后您可以根据需要启动ffmpeg。您可以选择使用 Ctrl+a + d 从此会话中分离。

    2. 连接到屏幕内运行 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
    

    您还可以使用期望自动执行整个 ssh 会话,传递一系列命令和“期望”来执行您想要的操作。

    【讨论】:

      【解决方案3】:

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

      1. $ 触摸停止
      2. $ <. ffmpeg ... output.ext>/dev/null 2>>Capture.log &
      3. $ 等待停止时间
      4. $ echo 'q' > 停止

      FFmpeg 停止,就好像它从终端 STDIN 获得了 'q'。

      【讨论】:

        【解决方案4】:

        较新版本的 ffmpeg 不再使用 'q' 了,至少在 Ubuntu Oneiric 上,他们说要按 Ctrl+C 来停止它们。因此,对于较新的版本,您可以简单地使用 'killall -INT' 向他们发送 SIGINT 而不是 SIGTERM,并且他们应该干净地退出。

        【讨论】:

        • ffmpeg 现在从最新的 Git 编译,仍然显示 Press [q] to stop。对于 Ubuntu 2015.10 也是如此。不过,Ctrl+C 也可以。
        • Windows 版本允许 'q' 和 Ctrl-C 干净退出
        • 有人可以写python代码来显示这个问题吗?你如何解决这种问题?
        • 最新的ffmpeg仍然使用q退出
        猜你喜欢
        • 1970-01-01
        • 2018-10-23
        • 2022-01-14
        • 2012-03-20
        • 2016-08-19
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多