Você pode fazer isso muito facilmente com o ffmpeg (faça o download de uma versão estática) da seguinte forma:
ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4
Isso mapeará os 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 você quiser apenas o primeiro, use1:a:0
, etc.
Os fluxos de áudio e vídeo são copiados, portanto, esse processo é rápido.
Áudio incompatível
No caso em que o arquivo AVI usa MP3 para fluxos de áudio, eles não podem 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 recodificará os streams de áudio usando o AAC em 192 kBit / s, o que deve ter qualidade alta o suficiente para que você não perceba nenhum artefato da re-codificação.
Ou, você pode usar o MKV como um contêiner de saída, que suporta virtualmente 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, obvisouly, para executá-lo em todos os arquivos, por exemplo, no Linux com o Bash, supondo que os arquivos MP4 e AVI tenham o mesmo nome base e que você o execute apenas uma vez (caso contrário, ele também tentará converter seus arquivos de saída):
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 on-line sobre como executar um comando em um loop de arquivo em lotes do Windows.