2012-03-15 20 views
6

Sto eseguendo ffmpeg su un'altra macchina per l'acquisizione dello schermo. Mi piacerebbe poter interrompere la registrazione da remoto. FFMPEG richiede che q sia premuto per interrompere la codifica in quanto deve eseguire alcune finalizzazioni per completare il file in modo pulito. So che potrei ucciderlo con kill/killall tuttavia questo può portare a video corrotti.Come fermare ffmpeg da remoto?

Press [q] to stop encoding 

io non riesco a trovare nulla su google appositamente per questo, ma alcuni non v'è il suggerimento che riecheggia in/proc // fd/0 funzionerà.

Ho provato questo ma non si ferma ffmpeg. Il q è comunque mostrato nel terminale in cui è in esecuzione ffmpeg.

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

Così come posso inviare un personaggio a un altro processo esistente in modo tale che è come se fosse stato digitato localmente? O c'è un altro modo per fermare remotamente ffmpeg in modo pulito.

+0

Le versioni più recenti di ffmpeg non usano più "q", almeno su Ubuntu Oneiric, ma dicono di premere Ctrl + C per fermarli. Quindi con una versione più recente puoi semplicemente usare 'killall -INT' per inviarli SIGINT invece di SIGTERM, e dovrebbero uscire in modo pulito. – sashoalm

+0

@satuon: Quella versione di Ubuntu è probabile che usi avconv (parte del progetto libav biforcuto). Quell'utilità ha rimosso 'q' come opzione; il principale FFmpeg ce l'ha ancora. –

+0

Da allora ho scoperto che posso usare kill -2 per fermare ffmpeg in modo pulito. Sono ancora interessato a come simulare il tasto premuto in altre applicazioni però. – Adam

risposta

6

Le versioni più recenti di ffmpeg non usano più "q", almeno su Ubuntu Oneiric, ma dicono di premere Ctrl + C per fermarli. Quindi con una versione più recente puoi semplicemente usare 'killall -INT' per inviarli SIGINT invece di SIGTERM, e dovrebbero uscire in modo pulito.

+0

ffmpeg compilato in questo momento dall'ultima versione di Git dice ancora "Premere [q] per interrompere". Lo stesso per Ubuntu 2015.10. Ctrl + C funziona anche, però. –

+0

I build di Windows consentono sia l''q' che Ctrl-C per uscire in modo pulito – dkrikun

12

Ecco un trucco accurato che ho scoperto quando mi sono trovato di fronte a questo problema: creare un file vuoto (non deve essere una named pipe o altro), quindi scrivere "q" quando è ora di smettere di registrare .

  1. $ toccare Stop
  2. $ < ./stop ffmpeg -i ... output.ext>/dev/null 2 ​​>> Capture.log &
  3. $ attendere per fermare il tempo
  4. $ echo 'q'> stop

FFmpeg si arresta come se avesse "q" dal terminale STDIN.

+0

Bello - funziona alla grande per me! – Lukas

0

Si può anche provare a utilizzare "expect" per automatizzare l'esecuzione e l'interruzione del programma. Dovresti avviarlo utilizzando qualche shell virtuale come screen, tmux o byobu e quindi avviare lo ffmpeg all'interno di esso. In questo modo sarai in grado di recuperare la schermata della shell virtuale e dare l'opzione "q".

  1. Avviare in locale o in remoto una sessione di shell virtuale, diciamo con "schermo". Assegna un nome alla sessione con l'opzione -S, ad esempio screen -S recvideo Quindi puoi avviare ffmpeg come preferisci. Puoi, facoltativamente, staccare da questa sessione con un Ctrl + a + d.

  2. connettersi alla macchina dove il ffmpeg è in esecuzione all'interno dello schermo (o tmux o altro) e ricollegare ad esso: screen -d -RR recvideo e quindi inviare la "q"

Per fare questo dall'interno di uno script è quindi possibile utilizzare aspettare, come:

prompt="> " 
expect << EOF 
set timeout 20 
spawn screen -S recvideo 
expect "$prompt" 
send -- "ffmpeg xxxxx\r" 
set timeout 1 
expect eof 
EOF 

poi, in un altro momento o uno script punto o in un altro script è recuperarlo:

expect << EOF 
set timeout 30 
spawn screen -d -RR recvideo 
expect "$prompt" 
send -- "q" 
expect "$prompt" 
send -- "exit\r" 
expect eof 
EOF 

È inoltre possibile automatizzare l'intera sessione ssh con aspettativa, passando una sequenza di comandi e "si aspetta" di fare ciò che si desidera.