2012-03-15 27 views
6

estoy corriendo ffmpeg en otra máquina para la captura de pantalla. Me gustaría poder detener la grabación de forma remota. FFMPEG requiere que se presione q para detener la codificación, ya que tiene que hacer una finalización para terminar el archivo limpiamente. Sé que podría matarlo con kill/killall, pero esto puede llevar a videos corruptos.Cómo detener ffmpeg de forma remota?

Press [q] to stop encoding 

no puedo encontrar nada en Google específicamente para esto, pero algunos no hay sugerencia de que haciendo eco en/proc // fd/0 funcionará.

He intentado esto pero no para ffmpeg. Sin embargo, q se muestra en la terminal en la que se está ejecutando ffmpeg.

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

Entonces, ¿cómo puedo enviar un personaje a otro proceso existente de manera que sea como si hubiera sido escrito localmente? ¿O hay otra forma de detener ffmpeg remotamente?

+0

Las versiones más nuevas de ffmpeg ya no usan 'q', al menos en Ubuntu Oneiric, en cambio dicen presionar Ctrl + C para detenerlas. Entonces, con una versión más nueva, simplemente puede usar 'killall -INT' para enviarlos SIGINT en lugar de SIGTERM, y deben salir limpiamente. – sashoalm

+0

@satuon: Es probable que esa versión de Ubuntu use avconv (parte del proyecto bifurcado de Libav). Esa utilidad ha eliminado 'q' como una opción; FFmpeg principal todavía lo tiene. –

+0

Desde entonces he descubierto que puedo usar kill -2 para detener ffmpeg limpiamente. Sin embargo, todavía estoy interesado en cómo simular la tecla presionada en otras aplicaciones. – Adam

Respuesta

6

Las nuevas versiones de ffmpeg no usan 'q' más, al menos en Ubuntu onírico, en cambio dicen que pulsar Ctrl + C para detenerlos. Entonces, con una versión más nueva, simplemente puede usar 'killall -INT' para enviarlos SIGINT en lugar de SIGTERM, y deben salir limpiamente.

+0

ffmpeg compilado en este momento desde el último Git todavía dice 'Presione [q] para detener'. Lo mismo para Ubuntu 2015.10. Ctrl + C también funciona, sin embargo. –

+0

Las compilaciones de Windows permiten que tanto 'q' como Ctrl-C salgan limpiamente – dkrikun

12

He aquí un buen truco que descubrí cuando tuve este problema: hacer un archivo vacío (no tiene que ser un tubo con nombre ni nada), y luego escribir 'q' en él cuando sea el momento de dejar de grabar .

  1. detener $ toque
  2. $ < ./stop ffmpeg -i ... output.ext>/dev/null 2 ​​>> Capture.log &
  3. $ esperar a que el tiempo de parada
  4. $ echo 'q'> stop

FFmpeg se detiene como si tuviera 'q' del terminal STDIN.

+0

Bueno, ¡funciona muy bien para mí! – Lukas

0

También puede tratar de utilizar "espera" para automatizar la ejecución y parada del programa. Usted tendría que comenzar usando alguna cáscara virtual como screen, tmux o byobu y luego iniciar el ffmpeg dentro de ella. De esta forma, podría obtener de nuevo la pantalla de shell virtual y dar la opción "q".

  1. Local o remotamente inicie una sesión de shell virtual, digamos con "pantalla". Nombrar la sesión con -S opción, al igual que screen -S recvideo, entonces puede comenzar el ffmpeg como desee. Puede, opcionalmente, desconectarse de esta sesión con Ctrl + a + d.

  2. conectarse a la máquina donde el ffmpeg se ejecuta dentro de la pantalla (o tmux o lo que sea) y vuelva a conectar a la misma: screen -d -RR recvideo y luego enviar la "q"

Para hacerlo desde dentro de un script después, puede utilizar esperar, como:

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

luego, en otro momento o script punto o en otro script que recuperarlo:

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

También puede automatizar toda la sesión ssh con expect, pasar una secuencia de comandos y "esperar" que haga lo que desee.

Cuestiones relacionadas