Эффективно соединяйте аудио треки от avi до mp4

350
Proxycon

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

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

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

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

1
Возможное дублирование [Как заменить аудиопоток в видеофайле несколькими аудиопотоками?] (Https://superuser.com/questions/800234/how-to-replace-an-audio-stream-in-a-video -file-с-несколько аудио-потоки) Vlastimil Ovčáčík 5 лет назад 0

1 ответ на вопрос

1
slhck

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

Вместо перекодирования звуковой дорожки я бы использовал Matroska (MKV) в качестве контейнера ... grawity 5 лет назад 0
А если вам нужно синхронизировать аудио и видео, вы можете использовать фильтр задержки. Вот пример для стереозвука, задержанного на 10 секунд: `-filter: a: 0" adelay = 10000 ^ | 10000 "`. (`^` является escape-символом для командной строки Windows) Vlastimil Ovčáčík 5 лет назад 0
@ VlastimilOvčáčík Да, однако, если вы используете этот фильтр, вам нужно перекодировать; Вы не можете скопировать поток в этом случае. Параметр `-itsoffset` также можно использовать для смещения входных сигналов без использования фильтра. slhck 5 лет назад 0
Я могу ошибаться, но `-itsoffset` не добавляет молчания к создаваемому промежутку, в то время как` adelay` будет. Мой * MPC-HC * плеер был смущен этим, и с добавленной тишиной проблем не было. Vlastimil Ovčáčík 5 лет назад 0