Como remover fluxos de áudio de um arquivo MKV?

16

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?

StackedCrooked
fonte

Respostas:

25

Se tudo o que você deseja fazer é remover um fluxo, não recodificar, você provavelmente fará isso com o pacote MKVtoolnix (consulte a página de videohelp.com ).

Existem algumas GUIs que podem ajudá-lo (confira no link videohelp). Não tenho certeza de qual seja a mkvmergelinha de comando exata , mas acho que algo assim funcionaria:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

Isso deve funcionar (não tenho um arquivo à mão para testar, desculpe). A --atracksopção diz mkvmergepara copiar apenas as faixas de áudio listadas no novo arquivo. Se você quiser manter 2 e 3, mas não 4, você pode usar --atracks 2,3.

mkvmergetem muitas outras opções para definir títulos, adicionar um atraso para sincronizar o áudio etc., portanto, verifique a página de manual para obter detalhes.

charlatão quixote
fonte
5
Parece que a --atracksopção não existe mais, em vez disso, deve-se usar --audio-tracksou --video-tracks.
malat
0

Tente -fforçar o formato especificado:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T
fonte
Estranhamente
tente usar um caminho completo, ou seja: C: \ path \ to \ output.mkv (eu suponho que você estiver no Windows pela referência media player)
John T
@ John T: usar o caminho completo (com ou sem aspas) ainda me dá a mensagem de erro "Pelo menos um arquivo de saída deve ser especificado".
StackedCrooked 02/12/2009
0

Existem realmente duas questões separadas aqui:

  1. Na primeira linha de comando, a ordem dos parâmetros pode estar errada. Eu acho que a -newaudioopção precisa estar no final, após o nome do arquivo de saída.

  2. A segunda linha de comando, "Removendo as legendas", como o arquivo de entrada possui legendas, você precisa usar a -snopção para removê-las. Caso contrário, parece que o FFmpeg deseja pelo menos um especificado na -maplista.

user57355
fonte
0

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.mkvou especificar o codec como ... -c:s copy test.mkv.

E não tenho certeza do que essa -newsubtitlebandeira 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 copyinstrução e ela deve funcionar. :)

Chef Faraó
fonte
11
Não há l especificador de fluxo .
llogan