
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.50
en 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 -d
bandera?
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.