
Estou extraindo um fragmento de 1 minuto de um arquivo de vídeo começando 30 minutos desde o início e adicionando legendas de um arquivo externo usando o seguinte 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
O problema que recebo é que o vídeo transcodificado tem duração 00:01:03.50
em vez de esperado 00:01:00.00
. E ao reproduzir esse vídeo com o VLC, a reprodução para antes que a barra de progresso chegue ao fim.
A duração passa a ser exatamente 1 minuto somente se eu remover a entrada da legenda. Parece que a duração do arquivo de saída foi estendida para caber na última frase da legenda que começa dentro do intervalo definido de 1 minuto.
Existe uma maneira de forçar a duração da saída exatamente para o valor definido no -d
sinalizador?
Responder1
Devido à forma como o ffmpeg analisa os arquivos de legenda, existem duas opções disponíveis para você:
Saída para MP4, mas possivelmente pule uma legenda:
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
Isso deve produzir um arquivo de 60 segundos, mas irá ignorar quaisquer legendas que comecem antes de 1800, mas que se estendam além dele.
Saída para 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
Aqui, qualquer legenda começando antes de 1800 e estendendo-se além dele estará presente e terá duração proporcional, ou seja, se uma legenda começar em 1795 e terminar em 1802, ela durará 2 segundos na saída.
Método de 2 etapas
ffmpeg -i subfile -ss 1800 -t 60 sub.ass
e
ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4
Isso extrai os subs correspondentes ao segmento de vídeo desejado e depois é mixado com o vídeo.