Вы можете сделать это очень легко с помощью ffmpeg (загрузить статическую сборку) следующим образом:
ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mp4
Это отобразит следующие потоки в выходной файл:
- первый видеоканал первого входа (
0:v:0
) - аудиоканалы второго входа (
1:a
) - если вы хотите только первый, используйте1:a:0
и т. д.
Видео и аудио потоки копируются, поэтому этот процесс очень быстрый.
Несовместимый звук
В случае, если файл AVI использует MP3 для аудиопотоков, они не могут быть сопоставлены с файлом MP4. В этом случае используйте:
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
Это перекодирует аудиопотоки с использованием AAC со скоростью 192 кбит / с, что должно быть достаточно высокого качества, чтобы вы не заметили какие-либо артефакты от перекодирования.
Или вы можете использовать MKV в качестве выходного контейнера, который поддерживает практически любой кодек:
ffmpeg -i input.mp4 -i input.avi -c copy -map 0:v:0 -map 1:a output.mkv
Как запустить в партии
Вы можете использовать эту команду в цикле, очевидно, чтобы запустить ее для всех файлов, например, под Linux с Bash, предполагая, что файлы MP4 и AVI имеют одинаковое базовое имя, и что вы запускаете ее только один раз (в противном случае она попытается также преобразовать свои выходные файлы):
for f in *.mp4; do aviFile="$.avi" # replace the extension outputFile="$-output.mp4" # create output filename ffmpeg -i "$f" -i "$aviFile" -c copy -map 0:v:0 -map 1:a "$outputFile" done
В Интернете вы найдете множество примеров того, как выполнить команду в цикле пакетного файла Windows.