linux - convert - u ffmpeg
Cómo detener ffmpeg de forma remota? (3)
Estoy ejecutando ffmpeg en otra máquina para 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.
Press [q] to stop encoding
No puedo encontrar nada en google específicamente para esto, pero algunos sugieren que el eco en / proc // fd / 0 funcionará.
Lo he intentado pero no detiene 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 tal manera que sea como si hubiera sido escrito localmente? ¿O hay otra forma de detener ffmpeg remotamente?
Las versiones más nuevas de ffmpeg ya no usan ''q'', al menos en Ubuntu Oneiric, sino que 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.
He aquí un buen truco que descubrí cuando me enfrenté a este problema: crear un archivo vacío (no tiene que ser una tubería con nombre ni nada) y luego escribir ''q'' cuando sea el momento de dejar de grabar.
- $ toque detener
- $ <./ stop ffmpeg -i ... output.ext> / dev / null 2 >> Capture.log &
- $ espera el tiempo de parada
- $ echo ''q''> stop
FFmpeg se detiene como si obtuviera ''q'' del terminal STDIN.
También puede intentar usar "esperar" para automatizar la ejecución y la detención del programa. Tendría que iniciarlo usando algún shell virtual como screen
, tmux
o byobu
y luego iniciar el ffmpeg
dentro de él. De esta forma, podría obtener de nuevo la pantalla de shell virtual y dar la opción "q".
Local o remotamente inicie una sesión de shell virtual, digamos con "pantalla". Nombra la sesión con la opción
-S
, como lascreen -S recvideo
Luego puedes iniciar el ffmpeg como quieras. Puede, opcionalmente, desconectarse de esta sesión con Ctrl + a + d.Conéctese a la máquina donde se ejecuta ffmpeg dentro de la pantalla (o tmux o lo que sea) y vuelva a conectarla:
screen -d -RR recvideo
y luego envíe la "q"
Para hacerlo desde dentro de un script, puede usar expect, 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 punto de secuencia de comandos o en otro script lo recuperas:
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.