Как остановить ffmpeg удаленно? - PullRequest
10 голосов
/ 15 марта 2012

Я запускаю ffmpeg на другом компьютере для захвата экрана. Я хотел бы иметь возможность остановить запись удаленно. FFMPEG требует, чтобы была нажата q, чтобы остановить кодирование, так как он должен выполнить некоторую финализацию, чтобы завершить файл без ошибок. Я знаю, что могу убить его с помощью kill / killall, однако это может привести к повреждению видео.

Press [q] to stop encoding

Я не могу найти что-либо в Google специально для этого, но некоторые полагают, что эхо в / proc // fd / 0 будет работать.

Я пробовал это, но это не останавливает ffmpeg. Однако q отображается в терминале, в котором работает ffmpeg.

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

Так как я могу отправить символ другому существующему процессу таким образом, как если бы он был набран локально? Или есть другой способ удаленной остановки ffmpeg.

Ответы [ 3 ]

14 голосов
/ 10 января 2014

Вот замечательный трюк, который я обнаружил, когда столкнулся с этой проблемой: создайте пустой файл (он не должен быть именованным каналом или чем-то еще), затем напишите в него 'q', когда пришло время остановить запись.

  1. $ touch stop
  2. $ <./ stop ffmpeg -i ... output.ext> / dev / null 2 ​​>> Capture.log &
  3. $ ожидание времени остановки
  4. $ echo 'q'> stop

FFmpeg останавливается, как если бы он получил 'q' от терминала STDIN.

10 голосов
/ 18 апреля 2012

Более новые версии ffmpeg больше не используют 'q', по крайней мере в Ubuntu Oneiric, вместо этого они говорят, что нажимают Ctrl + C, чтобы остановить их.Таким образом, в более новой версии вы можете просто использовать killall -INT для отправки им SIGINT вместо SIGTERM, и они должны выйти чисто.

0 голосов
/ 30 ноября 2016

Вы также можете попытаться использовать «ожидать» для автоматизации выполнения и остановки программы.Вам придется запустить его, используя какую-нибудь виртуальную оболочку, например screen, tmux или byobu, а затем запустить ffmpeg внутри нее.Таким образом, вы сможете снова получить экран виртуальной оболочки и задать опцию «q».

  1. Локально или удаленно запустить сеанс виртуальной оболочки, скажем, с помощью «экрана».Назовите сессию с параметром -S, например screen -S recvideo. Затем вы можете запустить ffmpeg, как вам нравится.При желании вы можете отсоединиться от этого сеанса с помощью Ctrl + a + d.

  2. Подключиться к машине, на которой запущен ffmpeg внутри экрана (или tmux или что-то еще), и повторно подключиться кit: screen -d -RR recvideo, а затем отправьте «q»

Чтобы сделать это изнутри скрипта, вы можете использовать ожидаемое, например:

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 с ожидаемым, передавая последовательность команд и «ожидая» делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...