Como remover uma faixa de áudio de um arquivo de vídeo mp4?

97

Eu tenho um arquivo de vídeo mp4 com várias faixas de áudio. Eu gostaria de tirar o resto das faixas e manter apenas uma. Como eu faço isso?

tshepang
fonte
related: stackoverflow.com/questions/38161697/…
Ciro Santilli escreveu uma avaliação a

Respostas:

111

Primeiro, execute ffmpeg -i file.mp4para ver quais fluxos existem no seu arquivo. Você deve ver algo assim:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

Em seguida, corra ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4para copiar o fluxo de vídeo e o segundo fluxo de áudio para new_file.mp4.

gelraen
fonte
3
No Windows, este comando deu o erro Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.: para corrigi-lo, basta alterar a ordem dos argumentos da seguinte maneira:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
MrLore
Mesmo erro que @MrLore no OS X.
Oskar Persson
1
É o mesmo no Ubuntu!
Tommaso
Funciona para o formato MKV também
user3405291
1
Você pode usar a opção mais genérico -c copyde ter fluxos idênticos para áudio, vídeo, mas também legendas: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4.
Futal 9/09/17
97

Problema relacionado - a remoção de todas as faixas de áudio de um arquivo mp4 pode ser feita da seguinte maneira:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
Greg Marks
fonte
1
Isso me dá o erro The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.Mas eu adicionei essas bandeiras e ainda é o mesmo ...?
poshaughnessy
Veja também: superuser.com/questions/268985/…
Ciro Santilli Enviado em 8/9
Re-comentando o comentário: parece haver algumas informações aqui: stackoverflow.com/questions/32931685/… A discussão sugere que versões recentes do ffmpeg não enfrentam o problema "aac experimental". Como regra geral, ajuda a diagnosticar o seu problema se você indicar a versão do software que está usando e a sintaxe exata do comando (depois de adicionar os sinalizadores) que causou o erro (cf. resposta da freeseek loc. Cit. ) Nesse caso específico, as informações de vídeo do arquivo de entrada também podem ser úteis.
Greg Marks em
8

Identifique os números dos fluxos:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

Use -map _file_:_stream_para selecionar quais fluxos processar e enviar

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

consulte: https://ffmpeg.org/ffmpeg.html#Advanced-options

jgr
fonte
4

Você pode tentar avidemuxlidar com apenas um arquivo de áudio internamente (e, portanto, forçar você a selecionar uma faixa específica). Eu nunca tentei com .mp4, mas funciona com outros formatos.

abanar
fonte
Não funciona tão bem. Talvez seja um erro, mas o áudio volta distorcido, embora ele faça o trabalho (remova o restante das faixas de áudio).
tshepang
3

Eu usei o Avidemux (GUI) várias vezes e o ffmpeg (console).

No Avidemux, você escolhe "Áudio" -> "Selecionar faixas" no menu principal; salve o vídeo como um novo arquivo.

Curiosamente, em alguns casos, o Avidemux produziu uma saída "melhor" que o ffmpeg.

por precaução, o Avidemux e o ffmpeg estão no repositório padrão do Fedora Linux. (Tenho certeza de que eles também são padrão em outros tipos de Linux.)

Máxima
fonte
1

-vnou -anremoverá todas as faixas de vídeo ou áudio. O fornecimento -vn -acodec copyremoverá o vídeo; -an -vcodec copyirá remover todo o áudio.

-vcodec copyespecifica que o ffmpeg deve copiar diretamente a faixa de vídeo existente (e não processar / codificar). Se você não especificá-lo, ele ainda funcionará, mas o ffmpeg poderá recodificar a faixa de vídeo existente e a operação usará mais CPU e poderá demorar consideravelmente mais.

muitas batatas fritas
fonte
0

Usando o avidemux na linha de comando.

(Na GUI do Avidemux, conforme descrito em https://unix.stackexchange.com/a/85834/4319 acima, basta selecionar / desmarcar as faixas de áudio e salvar o arquivo. (Tudo é copiado para o novo AVI.)

Examinei que tipo de projetos são salvos como projetos SpiderMonkey ou TinyPy para minhas ações, e o projeto SpiderMonkey (JavaScript) não possui as ações de seleção de faixa de áudio que eu precisava, mas o projeto TinyPy (Python) tinha eles.

Eu removi tudo não relacionado (uma dúzia de linhas desnecessárias), e é isso que eu tenho no meu some_series.py:

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

Ele sai da faixa 1, mas descarta a faixa 0.

Em seguida, executei uma conversão em lote de muitos arquivos com um comando como este:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

Ele copia tudo, mas descarta tudo, exceto a faixa de áudio necessária.

A maneira de executar o avidemux a partir da linha de comando foi aprendida por mim em https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing , embora eles não mencionem os scripts Python, apenas os scripts JS ( o que não funcionou para mim).

imz - Ivan Zakharyaschev
fonte
-1

Se você não se importa que o programa seja GUI, com o editor de vídeo do Blender , você pode fazer isso e muito mais.

YoMismo
fonte
-2

O ffmpegprograma foi substituído por avconv. avconvtem um uso muito semelhante ao ffmpeg, portanto, todos os comandos neste post podem ser algo como:

avconv <old ffpmeg command line options>

Siga este link para instalar avconvse você estiver no Ubuntu.

SmallChess
fonte
-3

O FFMPEG pode ser uma solução útil para você.

$ man ffmpeg
koolhead17
fonte
Dei uma breve olhada e é bastante densa. Eu procurei por "audio" e "audio track" e nada parecia óbvio.
tshepang
@Tshepang, "track" é ambíguo, e é provavelmente por isso que o FFmpeg prefere terminologia mais precisa. O FFmpeg considera o áudio em "fluxos", cada um compreendendo um ou mais "canais". AFAICT, cada canal é mono, com o fluxo descrevendo para quais saídas ele deve ser enviado (em pan) por padrão. Por exemplo, um fluxo estéreo consiste em dois canais, um enviado à saída esquerda da placa de som por padrão e o outro enviado à saída direita da placa de som por padrão.
Sampablokuper 02/08/19