¿Hay alguna manera de pausar y reanudar la codificación FFmpeg?


14

Grabo unas pocas horas de video todos los días, que puse en cola para codificar ffmpeg. Utilizo el veryslowpreset con x265, por lo que una sola hora de video puede tomar hasta 20 horas o más para codificar.

Dado que mi computadora funciona día y noche, me pregunto si ffmpegtiene alguna forma de pausar y reanudar la codificación. Estoy usando Terminalpara OS X.

Si es así, ¿puedo continuar codificando incluso después de apagar la Terminal y reiniciar la computadora? Creo que la sesión de Terminal se restaura cuando vuelves a iniciar sesión en OS X, al menos el historial de Terminal lo es.

Respuestas:


14

Suspender

Un método simple es suspenderlo con ctrl+ z. O puede obtener el PID y pgrep ffmpegluego usarlo kill -s SIGSTOP <PID>para suspender.

Luego reanudar con fgcomando o kill -s SIGCONT <PID>.

Lamentablemente, esto no sobrevivirá a un reinicio.

VM

Si usa una máquina virtual, con algo como VirtualBox, podría realizar su codificación en una máquina virtual invitada. Le permitirá "guardar el estado de la máquina" en cualquier momento que pueda sobrevivir a un reinicio. También puede permitirle asignar recursos máximos de CPU para el invitado para que su host siempre tenga recursos disponibles.

Posiblemente exagerado, pero si está familiarizado con máquinas virtuales o ya está utilizando una, es una posible solución.


Sin embargo, me encanta esa solución de VM, a menos que ya esté usando una, es una molestia bastante grande.
user24601

La forma VirtualBox no funcionó para mí. Intenté guardar el estado en la mitad de la codificación e intenté suspenderlo con [Ctrl] + [z] y luego guardar el estado. Después de restaurar el estado y tratando de reanudar, ffmpegse detiene con un error ( decode_band_types: Input buffer exhausted before END element foundo Invalid NAL unit sizey Error writing trailer/ Protocol error). Tal vez esté relacionado con el salto en el tiempo, no lo sé.
Jānis Elmeris

@ JānisElmeris Parece que no puedo duplicar ese problema. Lo probé en Ubuntu 18.04 VM y funcionó.
llogan

OK, probablemente no tenga la suerte suficiente. :) Intenté con una nueva Linux Mint 19.1 (basada en Ubuntu 18.04) VirtualBox VM.
Jānis Elmeris

mi ffmpeg tiene muchos thred y tantos PID. ¿Tengo que SIGSTOP y SIGCONT cada uno de ellos? ¿hay una restricción oportuna?
wuppi

11

En Windows, al presionar la tecla "Pausa / Interrupción" (la tecla más a la derecha superior) la pausará. Entrar se reanudará.

Si no funciona, haga clic en la ventana del símbolo del sistema para enfocarlo.


Esta es la mejor y más fácil respuesta para Windows (verificado en Windows 10).
lidsinker

1
Esto libera la CPU por completo, pero el carnero todavía tiene un cuello de botella. En mi caso, tengo 8 gb de ram y está usando casi todo mientras la operación está en pausa. ¿Alguna solución para eso? ¿Puedo transferir esto al disco duro o algo así? No me molesta un poco de cuerda para que las cosas se pongan en marcha cuando pause.
cometa el

10

No parecía posible al 30 de septiembre de 2015 . Sugeriría segmentar el archivo fuente, codificar los segmentos y luego unir los archivos resultantes.

Esta no es una verdadera función de pausa / reanudación, pero la división por partes le permitirá tener un descanso de la codificación.

Una descripción general de los comandos para emitir:

Romper el archivo completo en partes

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

Esto debería crear file000.mp4, file001.mp4 y así sucesivamente. Debido a cómo funciona el segmentador, solo corta en cuadros I, estos archivos no durarán exactamente nsegundos y la parte de video puede no reproducirse correctamente, pero los datos están ahí y puede convertir cada una de las partes, por ejemplo

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

Vuelva a unir las partes codificadas

Cree un archivo de texto y ponga el nombre de cada archivo renderizado como este

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

Y correr

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

Con solo 6 GB de memoria y un tiempo estimado de 12 h para encontrar de x264 a x265 y sin interrupciones (escritorio), no puedo usar el truco de VM, ¡pero esto suena genial! Solo espero que el paso de reincorporación sea rápido, pero como no tendrá codificación, creo que lo será. Tengo que probarlo, gracias vm!
Acuario Power

crea una advertencia al unirse: "El códec para la secuencia 0 no usa encabezados globales, pero el formato del contenedor requiere encabezados globales", pero el resultado final es un video utilizable, no vi ningún problema
Aquarius Power fue el

4

Supongo que en lugar de pausar, le das al proceso de codificación la menor prioridad del sistema (también conocido como " renice "), para que puedas trabajar diariamente cómodamente y la codificación se realizará en segundo plano con los recursos del sistema no utilizados. Por lo tanto, su codificación se realizará sin interrupciones las 24 horas, los 7 días de la semana, sin interrupciones, sin entrar en conflicto con el trabajo diario.

Como AFAIK OSX carece del comando pidof, debe conocer el número de proceso ffmpeg (PID)

entonces puede cambiar el proceso de inactividad de fondo con

sudo renice 20 yourPID

si es necesario, también puede cambiar el proceso a una prioridad de primer plano más agresiva

sudo renice -10 yourPID

¡Hola! Buena sugerencia. Tendré que intentarlo.
Winterflags

4

Suspender el subproceso también funciona en Windows, no con ctrl+ Z, pero en el administrador de recursos, también puede reanudarlo allí.


1

(Esto para Linux)

Como probablemente todos sepan, presionar 'q' finaliza el archivo de grabación.

ffplay tiene la posibilidad 'p'. ¿Por qué ffmpeg no tiene lo mismo? ¿Tal vez porque puede conducir a la desincronización entre video y audio? ...

Simplemente ffmpeg-encode a x264-aac-mkv con crf (23) y siempre con las mismas condiciones de video, 'salgo' (q) las grabaciones y unir todos los segmentos en un directorio específico, donde reside este script, a 1 archivo en modo streamcopy con este script bash:

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

Después de eso, verifico el video combinado resultante y lo pego en otro directorio. Los segmentos se eliminan del directorio de fusión.

Pero, un botón 'Pausar y reanudar' sin problemas sería bienvenido;)


0

Esto es solo una idea, pero si tiene un presupuesto, sería una buena idea actualizar el procesador (a la 8a generación de Intel) o incluso mejor, la tarjeta de video (a NVIDIA GTX 1050 o superior) para que pueda codificar h.265 / HEVC con aceleración de hardware en lugar de uso intensivo de CPU x265. Su codificación de video estará terminada en mucho menos de 20 horas, ahorrándole costos de electricidad también.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.