reinicie el trabajo ffmpeg desde un error

¿Existe una técnica común o algún tipo de estrategia para reiniciar un trabajo de transcodificación fallido desde donde lo había dejado cuando se bloqueó (o se detuvo por cualquier motivo)?

Por ejemplo, si tengo un trabajo de transcodificación de 2 horas y falla/falla a la hora y 59 minutos, ¿hay alguna manera de que pueda hacer el trabajo de los últimos minutos y usar el progreso que ya tenía asumiendo que el archivo parcialmente transcodificado es ¿aun disponible?

Respuestas (2)

Una opción directa para reanudar la codificación no está disponible.

Y en cuanto a reiniciar manualmente la codificación, tampoco es posible. Dos razones:

1) al transcodificar a un contenedor típico como MP4, el índice se escribe después de completar la codificación. No habrá dicho índice en un archivo parcial si el proceso finalizó inesperadamente y, por lo tanto, el archivo existente no se puede analizar.

2) Si no puede identificar con precisión el último cuadro no corrupto codificado en el archivo parcial, su unión no será perfecta.


Dicho esto, hay una manera tediosa de hacerlo. El método depende del uso del segmentmuxer. Codifica en formato MPEG-TS pero segmenta la salida a medida que se genera. Si el trabajo falla, examina algunos atributos y reanuda la codificación en función de esos datos. Finalmente, une todos los segmentos.

Paso 1 : codificar y segmentar

Para obtener los mejores resultados, el audio y el video deben realizarse por separado. De hecho el audio se puede hacer sin segmentar ya que se codificará mucho más rápido

ffmpeg -i in.mp4 -c:a aac -vn job-audio.mp4

y para vídeo

ffmpeg -copyts -start_at_zero -ss 0 -i in.mp4 -c:v libx264 -an
       -f segment -segment_time 0.01 -segment_time_delta 1
       -muxpreload 0 -muxdelay 0 -mpegts_copyts 1
       -segment_start_number 0 -segment_list files.ffcat
job-video%d.ts

Cada segmento anterior contendrá un GOP, por lo que ningún cuadro de un segmento depende de los cuadros de otros segmentos para la reproducción.

Paso 2 Identificar el punto de reanudación

Suponga que el trabajo falla al crear el segmento #5.

primero tu corres

ffprobe "in.mp4" -show_entries stream=codec_type,start_time,duration -of compact

Esto producirá una lectura como esta

stream|codec_type=audio|start_time=0.000000|duration=356.309333
stream|codec_type=video|start_time=0.040000|duration=356.360000

Tenga en cuenta la hora de inicio de la transmisión de video.

Ahora, ejecútelo para el primer y último segmento (incompleto)

ffprobe "job-video0.ts" -show_entries stream=codec_type,start_time,duration -of compact

stream|codec_type=video|start_time=0.080000|duration=10.000000

Verá que hay una compensación positiva de 0.04 con respecto a la transmisión de video MP4. Llamemos a esto el valor de compensación inicial

Ahora, para la última secuencia

ffprobe "job-video5.ts" -show_entries stream=codec_type,start_time,duration -of compact

stream|codec_type=video|start_time=20.080000|duration=4.320000

Paso 3 Reanudar la codificación

Entonces, ahora corres

ffmpeg -copyts -start_at_zero -ss {start_time of last segment - initial offset} -i in.mp4 -c:v libx264 -an
       -f segment -segment_time 0.01 -segment_time_delta 1
       -muxpreload 0 -muxdelay 0 -mpegts_copyts 1 -initial_offset {initial offset}
       -segment_start_number {index number of last segment} -segment_list files-resume.ffcat
job-video%d.ts

Paso 4 Unir segmentos

Tendrá varios .ffcatarchivos, desde la primera ejecución y todas las ejecuciones reanudadas. Copie las entradas de todas las ejecuciones secundarias y agréguelas al primer archivo. Evite la duplicación.

Correr

ffmpeg -f concat -i files.ffcat -i job-audio.mp4 -c copy full.mp4
para aclarar, ¿sabe que habrá un GOP por segmento porque, como dice en los documentos, cuando se especifica segment_time_delta "... un fotograma clave comenzará un nuevo segmento si su PTS satisface la relación..."?
Sí, el muy bajo segment_time asegura que el delta rara vez entre en juego. Originalmente agregué esa opción porque mis comandos iniciales también incluían audio. Y el formato start_time en esos casos no siempre es el mismo que el video start_time. Ahora, es discutible.

Si conoce la parte específica del archivo en la que se atasca el trabajo de codificación, puede usar ffmpeglas opciones --ssy -tpara pasar por alto el punto de ahogo. Puede obtener más información sobre estas opciones consultando la documentación de la herramienta .

supongamos que la falla es impredecible, es decir, no hay un punto de falla conocido.