Como remover fluxos de áudio de um arquivo MKV?

16

Estou tentando remover fluxos de áudio desnecessários de um arquivo MKV (Matroska). A razão pela qual eu quero fazer isso é evitar ter que selecionar manualmente o 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

Como eu quero os streams 0, 1 e 3 (sub), meu comando ffmpeg se parece com isto:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

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á isso:

Number of stream maps must match number of output streams

Parece que não entendo como funciona a opção "map". Alguém me ajudaria a descobrir isso?

    
por StackedCrooked 01.12.2009 / 20:48

4 respostas

25

Se tudo o que você deseja fazer é remover um fluxo e não recodificá-lo, provavelmente desejará fazer isso com o pacote MKVtoolnix (consulte a página do videohelp.com ).

Existem algumas GUIs que podem ajudá-lo (consulte o link videohelp). Não tenho certeza qual pode ser a linha de comando exata de mkvmerge , 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 fazer o truque (eu não tenho um arquivo acessível para testes, desculpe). A opção --atracks diz a mkvmerge para copiar apenas as faixas de áudio listadas para o novo arquivo. Se você quisesse manter 2 & 3 mas não 4, você poderia usar --atracks 2,3 .

mkvmerge tem muitas outras opções para definir títulos, adicionando um atraso para sincronizar o áudio, etc, então verifique a página do manual para detalhes.

    
por 02.12.2009 / 00:13
0

Teste -f para forç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
    
por 01.12.2009 / 21:02
0

Existem dois problemas separados aqui:

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

  2. A segunda linha de comando, "Removendo as legendas", já que o arquivo de entrada tem legendas, você precisa usar a opção -sn para removê-las. Caso contrário, parece que o FFmpeg quer pelo menos um especificado na lista -map .

por 30.11.2010 / 05:53
0

No seu primeiro comando, você não especificou que test.mkv era seu arquivo de saída. Parece que você precisa alterar essa parte para algo como ... -c copy test.mkv ou especificar o codec como ... -c:s copy test.mkv .

E não tenho certeza do que a -newsubtitle flag 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.

Em seu segundo comando, parece que você está tentando mapear o fluxo de vídeo e tentar copiá-lo. Então você pode querer tentar remover a instrução -vcodec copy e ela deve funcionar. :)

    
por 16.06.2015 / 19:49

Tags