Converta faixas de vídeo e áudio específicas apenas com ffmpeg

26

Eu tenho um arquivo MKV ( vidui.mkv) com 6 faixas nele.

Track 1 - video - xvid - 1920x1080
Track 2 - video - xvid - 720x576
Track 3 - audio -  AAC - 1240kbps - English
Track 4 - audio -  AAC - 648kbps - Spanish
Track 5 - audio -  AAC - 648kbps - Commentary 1
Track 6 - audio -  AAC - 648kbps - Commentary 2

Quero converter o arquivo acima em um formato mp4 com um vídeo h264 e um áudio AC3. Também quero converter a faixa 1 (vídeo) e a faixa 5 (áudio).

Se eu usar

ffmpeg.exe -i vidui.mkv -f mp4 -vcodec libx264 -acodec ac3 -crf 20 -sn -n vidui.mp4

ele converte a primeira faixa de vídeo e a primeira faixa de áudio, mas o que eu gostaria de fazer é converter as faixas 1 e 5.

hbelouf
fonte

Respostas:

43

Você pode usar a -mapopção ( documentação completa ) para selecionar fluxos de entrada específicos e mapeá-los para sua saída.

A mapsintaxe mais simples que você pode usar é -map i:s: onde iestá o ID do arquivo de entrada e so ID do fluxo, ambos começando com 0. No seu caso, isso significa que selecionamos faixa 0e 4:

ffmpeg -i vidui.mkv -c:v libx264 -c:a ac3 -crf 20 -map 0:0 -map 0:4 vidui.mp4

Se você deseja escolher faixas de vídeo, áudio ou legenda especificamente, também pode usar especificadores de fluxo :

ffmpeg -i vidui.mkv -c:v libx264 -c:a ac3 -crf 20 -map 0:v:0 -map 0:a:1 vidui.mp4

Aqui 0:v:0está o primeiro fluxo de vídeo e 0:a:1o segundo fluxo de áudio.

slhck
fonte
Existe uma maneira de fazer isso dinamicamente? Digamos que eu queira fazer isso apenas com faixas de áudio do idioma X e o ffmpeg capte isso?
Freedo
@ Freedo Sim, consulte a documentação. Por exemplo-map 0:m:language:eng
slhck