Respostas:
Primeiro, execute ffmpeg -i file.mp4
para 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.mp4
para copiar o fluxo de vídeo e o segundo fluxo de áudio para new_file.mp4
.
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
-c copy
de 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
.
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
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 ...?
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
Você pode tentar avidemux
lidar 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.
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.)
-vn
ou -an
removerá todas as faixas de vídeo ou áudio. O fornecimento -vn -acodec copy
removerá o vídeo; -an -vcodec copy
irá remover todo o áudio.
-vcodec copy
especifica 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.
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).
O ffmpeg
programa foi substituído por avconv
. avconv
tem 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 avconv
se você estiver no Ubuntu.
O FFMPEG pode ser uma solução útil para você.
$ man ffmpeg