Grabo algunas horas de secuencias de video todos los días, que pongo en cola para codificar con ffmpeg
. Utilizo el veryslow
ajuste 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 ffmpeg
tiene una forma de pausar y reanudar la codificación. Estoy usando Terminal
para 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.
Un método simple es suspenderlo con ctrl+ z. O puede obtener el PID y pgrep ffmpeg
luego usarlo kill -s SIGSTOP <PID>
para suspender.
Luego reanude con fg
el comando o kill -s SIGCONT <PID>
.
Desafortunadamente, esto no sobrevivirá a un reinicio.
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.
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.
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:
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 n
segundos 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
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
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
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.
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)
usuario24601
Janis Elmeris
ffmpeg
se detiene con un error (decode_band_types: Input buffer exhausted before END element found
oInvalid NAL unit size
yError writing trailer
/Protocol error
). Tal vez esté relacionado con el salto en el tiempo, no lo sé.llogan
Janis Elmeris
wuppi