Forzar la duración del video de salida con subtítulos externos en ffmpeg

Forzar la duración del video de salida con subtítulos externos en ffmpeg

Estoy extrayendo un fragmento de 1 minuto de un archivo de video a partir de los 30 minutos desde el principio y agregando subtítulos de un archivo externo usando el siguiente comando:

ffmpeg -ss 1800 -i input_video.m4v -ss 1800 -i input_subtitle.srt -map 1:0 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 -avoid_negative_ts 1 output_video.mp4

El problema que tengo es que el vídeo transcodificado tiene una duración 00:01:03.50en lugar de la esperada 00:01:00.00. Y cuando se reproduce dicho vídeo con VLC, la reproducción se detiene antes de que la barra de progreso llegue al final.

La duración es exactamente de 1 minuto sólo si elimino la entrada de subtítulos. Parece que la duración del archivo de salida se amplía para que quepa en la última frase del subtítulo que comienza dentro del rango definido de 1 minuto.

¿Hay alguna manera de forzar la duración de la salida exactamente al valor establecido en la -dbandera?

Respuesta1

Debido a cómo ffmpeg analiza los archivos de subtítulos, hay dos opciones disponibles:

Salida a MP4, pero posiblemente omitir un subtítulo:

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 output_video.mp4

Esto debería producir un archivo de 60 segundos, pero omitirá los subtítulos que comiencen antes del 1800 pero se extiendan más allá.

Salida a MKV:

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s ass -crf 35 -preset slow -t 60 output_video.mkv

Aquí, cualquier subtítulo que comience antes de 1800 y se extienda más allá estará presente y tendrá una longitud proporcional, es decir, si un subtítulo comienza en 1795 y termina en 1802, durará 2 segundos en la salida.

método de 2 pasos

ffmpeg -i subfile -ss 1800 -t 60 sub.ass

y

ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4

Esto extrae los subs correspondientes al segmento de video deseado y luego se mezcla con el video.

información relacionada