¿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?
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 segment
muxer. 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 .ffcat
archivos, 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
Si conoce la parte específica del archivo en la que se atasca el trabajo de codificación, puede usar ffmpeg
las opciones --ss
y -t
para pasar por alto el punto de ahogo. Puede obtener más información sobre estas opciones consultando la documentación de la herramienta .
tonyl7126
gian