Эффективное объединение аудиодорожек из avi в mp4

Эффективное объединение аудиодорожек из avi в mp4

У меня около 100 видео (эпизодов одного сериала) дважды.

  1. [avi] Разрешение видео 720p с моими любимыми звуковыми дорожками
  2. [mp4] 1080p, но не тот язык

Конечно, я хотел бы иметьхорошее видео на моем предпочитаемом языке. Но если это возможно, я бы хотел сохранить обе аудиоопции.

Я пробовал вручную объединять их с помощью mp4 joiner (GUI для mp4box), но это занимает много времени. Я бы с удовольствием увидел какие-нибудь предложения по автоматизации и оптимизации этого процесса.

решение1

Вы можете сделать это очень легко с помощью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="${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

В Интернете вы найдете множество примеров того, как выполнить команду в цикле пакетного файла Windows.

Связанный контент