Legendas baseadas em texto
O ffmpeg tem um subtitles
filter que pode gravar arquivos SRT no fluxo de vídeo. Você precisa do ffmpeg compilado com --enable-libass
. Eu não acho que o Libav tenha algo parecido, pelo menos olhando os filtros disponíveis .
Primeiro você precisa extrair as legendas. -map 0:s:0
seleciona o primeiro fluxo de legenda para a saída e -c:s:0
seleciona o codec para ele - apenas para garantir que seja realmente SRT.
ffmpeg -i input.mkv -an -vn -map 0:s:0 -c:s:0 srt subtitles.srt
Então, queime-os.
ffmpeg -i input.mkv -map 0:0 -map 0:1 -target pal-dvd -aspect 16:9 -q:v 1 \
-c:a mp2 -ac 2 -b:a 128k -filter:v subtitles=subtitles.srt output.mpg
Nota:
-
O comando acima está assumindo que os fluxos
0:0
e0:1
na sua entrada são os fluxos de vídeo e áudio, respectivamente. Se você quiser impedir que as legendas sejam incluídas no arquivo de saída, você também pode adicionar-sn
para desativá-las completamente. -
Você precisa alterar
-ab
para-b:a
, pois o primeiro é uma opção inexistente para o ffmpeg.
Legendas baseadas em imagem
Caso sua entrada tenha legendas baseadas em imagem como HDMV PG (parece que o MakeMKV está criando essas, e outras ferramentas não conseguem extraí-las), você pode tentar usar o filtro de sobreposição para gravá-las:
ffmpeg -i input.mkv -filter_complex "[0:v][0:s]overlay[v]" -map [v] -map 0:a \
-target pal-dvd -aspect 16:9 -q:v 1 -c:a mp2 -ac 2 -b:a 128k output.mpg
Isto também é explicado no Wiki do FFmpeg .
Caso suas legendas tenham dimensões diferentes do filme original (por exemplo, porque o fluxo de vídeo foi reduzido, mas as legendas não foram), você pode tentar usar a opção -canvas_size
para definir o tamanho.