Junte com eficiência faixas de áudio de AVI para MP4

Junte com eficiência faixas de áudio de AVI para MP4

Tenho cerca de 100 vídeos (episódios de uma série) duas vezes.

  1. [avi] Resolução de vídeo 720p com minhas faixas de áudio preferidas
  2. [mp4] 1080p mas o idioma errado

Obviamente, eu gostaria de terbom vídeo com meu idioma preferido. Mas se for possível gostaria de manter as duas opções de áudio.

Tentei juntá-los manualmente com um joiner mp4 (GUI para mp4box), mas isso leva muito tempo. Eu adoraria ver algumas sugestões para automatizar e otimizar esse processo.

Responder1

Você pode fazer isso facilmente comffmpeg(baixe uma compilação estática) assim:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4

Isso vaimapaos seguintes fluxos para o arquivo de saída:

  • o primeiro canal de vídeo da primeira entrada ( 0:v:0)
  • os canais de áudio da segunda entrada ( 1:a) – se quiser apenas a primeira use , 1:a:0etc.

Os fluxos de vídeo e áudio são copiados, portanto esse processo é rápido.

Áudio incompatível

Caso o arquivo AVI use MP3 para fluxos de áudio, eles não poderão ser mapeados para um arquivo MP4. Neste caso, use:

ffmpeg -i input.mp4 -i input.avi -c:v copy -c:a aac -b:a 192k -map 0:v:0 -map 1:a output.mp4

Isso recodificaria os fluxos de áudio usando AAC a 192 kBit/s, o que deve ser de qualidade alta o suficiente para que você não perceba nenhum artefato de recodificação.

Ou você pode usar MKV como contêiner de saída, que suporta praticamente qualquer codec:

ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mkv

Como executar em lote

Você pode usar este comando em um loop, obviamente, para executá-lo em todos os arquivos, por exemplo, no Linux com Bash, assumindo que os arquivos MP4 e AVI tenham o mesmo nome base e que você execute-o apenas uma vez (caso contrário, tentará para converter seus arquivos de saída também):

for f in *.mp4; do
    aviFile="${f%%.mp4}.avi" # replace the extension
    outputFile="${f%%.mp4}-output.mp4" # create output filename
    ffmpeg -i "$f" -i "$aviFile" -c copy -map 0:v:0 -map 1:a "$outputFile"
done

Você encontrará muitos exemplos online sobre como executar um comando em um loop de arquivo em lote do Windows.

informação relacionada