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

Grabo algunas horas de secuencias de video todos los días, que pongo en cola para codificar con ffmpeg. Utilizo el veryslowajuste preestablecido con x265, por lo que una sola hora de video puede tardar hasta 20 horas o más en codificarse.

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

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

Respuestas (9)

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 reanude con fgel comando o kill -s SIGCONT <PID>.

Desafortunadamente, esto no sobrevivirá a un reinicio.

máquina virtual

Si usa una máquina virtual, con algo como VirtualBox, podría realizar su codificación en una VM 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 de CPU máximos para el invitado para que su host siempre tenga recursos disponibles.

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

Me encanta esa solución de VM, sin embargo, a menos que ya esté usando una, es una gran molestia.
La forma de VirtualBox no funcionó para mí. Intenté simplemente guardar el estado a mitad de la codificación e intenté suspender con [Ctrl]+[z] y luego guardar el estado. Después de restaurar el estado e intentar 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ānisElmeris Parece que no puedo duplicar ese problema. Lo probé en Ubuntu 18.04 VM y funcionó.
OK, probablemente no tengo la suerte suficiente. :) Intenté con un nuevo Linux Mint 19.1 (basado en Ubuntu 18.04) VirtualBox VM.
mi ffmpeg tiene muchos subprocesos y tantos PID. ¿Tengo que SIGSTOP y SIGCONT cada uno de ellos? ¿Hay una restricción de tiempo?

En Windows, al presionar la tecla "Pausa/Break" (la tecla más a la derecha) se pausará. Intro 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 (verificada en Windows 10).
Esto libera la CPU por completo, pero la memoria RAM aún 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 importa un poco de cuerda para que las cosas se pongan en marcha cuando vuelvo a pausar.
Las aplicaciones @kite que se ejecutan en terminales Windows se denominan TSR, Terminate and Stay Resident. Asignan partes de la memoria del sistema disponible para que residan. Eliminarlas de esa asignación de memoria detiene efectivamente la aplicación. La única forma de "guardar" una aplicación en ejecución es envolverla en algún tipo de administrador de memoria que represente la asignación de memoria real. Entonces, respuesta corta, sí, puede, pero no es fácil ni simple en ninguna forma de la (s) palabra (s).
@kite La forma nativa de transferir la memoria de la aplicación al disco duro es aumentar el tamaño de la memoria virtual. Windows moverá la memoria asignada de las aplicaciones inactivas al archivo de intercambio, liberando efectivamente la memoria física para otras aplicaciones. Si es un escenario común para usted, puede aumentar el tamaño de la memoria virtual mucho más allá de la memoria física, pero tenga en cuenta que para funcionar realmente sin ralentizarse 10 veces, las aplicaciones necesitan memoria física.

No parecía posible a partir del 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 aproximada de los comandos a emitir:

Dividir 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 I-frames, estos archivos no durarán exactamente nsegundos y es posible que la parte del video no se reproduzca correctamente, pero todos 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

Volver 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 codificar de x264 a x265 y sin interrupción (escritorio), no puedo usar el truco de VM, ¡pero suena genial! Solo espero que el paso de reincorporación sea rápido, pero como no tendrá codificación, creo que lo será. ¡Tienes que probarlo, gracias vm!
crea una advertencia al unirse: "El códec para la transmisión 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

Sugiero que en lugar de hacer una pausa, le dé al proceso de codificación la prioridad mínima del sistema (también conocido como " renice "), para que pueda trabajar cómodamente todos los días y la codificación se llevará a cabo en segundo plano con los recursos del sistema no utilizados. Por lo tanto, su codificación se realizará sin problemas las 24 horas del día, los 7 días de la semana, sin interrupciones, sin conflictos con el trabajo diario.

como AFAIK OSX carece del comando pidof, necesita saber el número de proceso ffmpeg (PID)

entonces puede cambiar el proceso a fondo inactivo 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. Habrá que probarlo.
Mucho más fácil simplemente comenzar el proceso nice -19 ffmpeg ..., en lugar de refinarlo más tarde. Creo que esto le permite navegar y realizar otras tareas muy bien. Y cuando su máquina no está haciendo nada más, la codificación continúa sin un impacto visible en el rendimiento o la velocidad.

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

(Esto para Linux)

Como probablemente todos saben, al 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 el video y el audio?...

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

#!/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 combinación.

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

Las ventanas de lugares en hibernación pausarán el trabajo si necesita apagar su máquina por un tiempo.

Esto es solo una idea, pero si tiene algo de presupuesto, sería una buena idea actualizar el procesador (a Intel de octava generación) 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 también costos de electricidad.

La página ffmpeg en hwaccel dice que la calidad de salida de gpu puede no ser la misma. sólo una advertencia

En Windows... Simplemente haga clic y arrastre para seleccionar algún texto del terminal CMD, luego podrá ver que el proceso se ha "pausado", por lo que no se registra el uso de la CPU hasta que presione "enter" en el terminal (eso detiene el proceso). proceso)