如何远程停止ffmpeg?

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

Press [q] to stop encoding 

我无法find谷歌专门为此,但有一些build议,呼应到/ proc / / fd / 0将工作。

我已经尝试过,但不会停止ffmpeg。 然而q显示在ffmpeg正在运行的terminal中。

 echo -nq > /proc/16837/fd/0 

那么如何将字符发送到另一个现有的进程,就像在本地input一样呢? 还是有另一种方式干净地远程停止ffmpeg。

Solutions Collecting From Web of "如何远程停止ffmpeg?"

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

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

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

FFmpeg停止,就好像从终端STDIN得到'q'一样。

您也可以尝试使用“expect”来自动执行和停止程序。 您将不得不使用screentmuxbyobu等虚拟外壳来启动它,然后在其中启动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会话,传递一系列的命令,并“期待”做你想做的事情。