2012-03-15 2 views
6

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

Press [q] to stop encoding 

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

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

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

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

+0

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

+0

@satuon: Эта версия Ubuntu, скорее всего, использует avconv (часть разветвленного проекта Libav). Эта утилита удалила «q» в качестве опции; главный FFmpeg все еще имеет его. –

+0

С тех пор я обнаружил, что могу использовать kill -2, чтобы остановить ffmpeg чисто. Меня все еще интересует, как имитировать нажатие клавиши в других приложениях. – Adam

ответ

6

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

+0

ffmpeg скомпилирован прямо сейчас из последнего Git все еще говорит 'Нажмите [q], чтобы остановить'. То же самое для Ubuntu 2015.10. Тем не менее, Ctrl + C тоже работает. –

+0

Windows builds позволяют «q» и «Ctrl-C» выйти чисто – dkrikun

12

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

  1. $ сенсорный остановить
  2. $ < ./stop FFmpeg -i ... output.ext>/DEV/нуль 2 >> Capture.log &
  3. $ ждать остановки времени
  4. $ echo 'q'> stop

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

+0

Nice one - отлично работает для меня! – Lukas

0

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

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

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

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

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