Eu tenho tentado remover fluxos de áudio desnecessários de um arquivo MKV (Matroska). O motivo pelo qual desejo fazer isso é evitar a seleção manual do fluxo desejado no Windows Media Player.
O arquivo de entrada fornece as seguintes informações do ffmpeg:
Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000
Desde que eu quero fluxos 0, 1 e 3 (sub), meu comando ffmpeg se parece com isso:
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv
o que estranhamente dá o erro:
At least one output file must be specified
Removendo as legendas:
ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv
me dá o seguinte:
Number of stream maps must match number of output streams
Parece que eu realmente não entendo como a opção "map" funciona. Alguém me ajudaria a descobrir isso?
--atracks
opção não existe mais, em vez disso, deve-se usar--audio-tracks
ou--video-tracks
.Tente
-f
forçar o formato especificado:fonte
Existem realmente duas questões separadas aqui:
Na primeira linha de comando, a ordem dos parâmetros pode estar errada. Eu acho que a
-newaudio
opção precisa estar no final, após o nome do arquivo de saída.A segunda linha de comando, "Removendo as legendas", como o arquivo de entrada possui legendas, você precisa usar a
-sn
opção para removê-las. Caso contrário, parece que o FFmpeg deseja pelo menos um especificado na-map
lista.fonte
Em seu primeiro comando, você não especificou que test.mkv era seu arquivo de saída. Parece que você precisa alterar essa parte para ser algo como
... -c copy test.mkv
ou especificar o codec como... -c:s copy test.mkv
.E não tenho certeza do que essa
-newsubtitle
bandeira está fazendo lá. Mas se você tiver um arquivo de legendas que deseja adicionar, poderá fazer outro sinalizador de entrada-i input.srt
. Veja este link para isso.No seu segundo comando, acho que parece que você está tentando mapear o fluxo de vídeo e copiá-lo. Então, você pode tentar remover a
-vcodec copy
instrução e ela deve funcionar. :)fonte
l
especificador de fluxo .