Respostas:
ffmpeg tem um subtitles
filtro que pode gravar arquivos SRT no fluxo de vídeo. Você precisa do ffmpeg compilado com --enable-libass
Apesar. Eu não acho que Libav tem algo parecido, pelo menos olhando o filtros disponíveis .
Você primeiro precisa extrair as legendas. -map 0:s:0
seleciona o primeiro fluxo de legendas para a saída e -c:s:0
seleciona o codec para isso - só para ter certeza de que é 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 fluxos 0:0
e 0: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á-los completamente.
Você tem que mudar -ab
para -b:a
, uma vez que o primeiro é uma opção inexistente para o ffmpeg.
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 em:
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
Isso também é explicado na 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 -canvas_size
opção para definir o tamanho.
"[0:s]scale=-1:720[subs];[0:v][subs]overlay[v]"
ou alguma coisa. Eu não posso testá-lo agora, mas algo assim deveria funcionar.