Как объединить два аудиофайла, сохраняя правильное время с помощью ffmpeg

Отказ от ответственности: я не понимаю ffmpeg и в основном просто копирую команды

У меня есть два видеофайла webm. Их продолжительность отключена примерно на секунду.

Я преобразовал их в mp4, и все было в порядке:

ffmpeg -acodec libopus -i 1.webm -r 10 -cpu-used 5 -c:v libx264 -crf 20 -c:a aac -strict experimental -loglevel error 1.mp4

Затем я извлек звук из каждого видео, и все было в порядке. Под «хорошо» я подразумеваю, что когда я воспроизводю аудиофайлы сами по себе, они совпадают с синхронизацией исходного видео. Я использовал эту команду для извлечения аудио:

fmpeg -i 1.mp4 -map 0:a -vn -acodec copy 1audio.m4a

Теперь у меня есть две звуковые дорожки, и я хочу объединить их в одну, я хочу «наложить» их, И я хочу сохранить такие же тайминги, как и были.

НО, всякий раз, когда я пытаюсь объединить звук, тайминги отключаются. «Секунды» не соответствуют исходным одиночным аудиофайлам.

Я пробовал эти команды для объединения аудио:

ffmpeg -i 1audio.m4a -i 2audio.m4a -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map [a] -c:a libfdk_aac mergedaudio.m4a

ffmpeg -i 2audio.m4a -i 1audio.m4a -filter_complex amix=inputs=2:duration=first mergedaudio.m4a

ffmpeg -i 1audio.m4a -i 2audio.m4a -filter_complex amerge -ac 2 -c:a libfdk_aac -vbr 4 mergedaudio.m4a

Все приведенные выше команды привели к объединению аудиофайла... но тайминги отключены.

Что я делаю неправильно?


person andy    schedule 30.08.2017    source источник
comment
Покажите полный вывод консоли для команды слияния и поделитесь файлами, если можете.   -  person Gyan    schedule 30.08.2017


Ответы (1)


Я нашел проблему, и вопрос ошибочен, но стоит ответить.

Проблема в том, что перед слиянием два аудиофайла имели временные метки начала> 0.

Но когда файлы объединялись, они «обнулялись», поэтому их отложенное время начала игнорировалось, а звук начинался слишком рано.

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

Итак, давайте пробежимся по этому снова:

  1. Вы начинаете с двух файлов acc, которые по какой-то причине имеют время запуска 3 и 5 секунд соответственно.

  2. Затем вы «обнуляете» каждый файл:

ffmpeg -i 1audio.m4a -filter_complex "[0:a]adelay=3000[a0];[a0]amix=inputs=1[out]" -map "[out]" -ac 2 -c:a libfdk_aac 1zeroed.m4a

ffmpeg -i 2audio.m4a -filter_complex "[0:a]adelay=5000[a0];[a0]amix=inputs=1[out]" -map "[out]" -ac 2 -c:a libfdk_aac 2zeroed.m4a

Новые аудиофайлы, 1zeroed и 2zeroed, теперь имеют время начала 0, но во время кодирования было добавлено дополнение, поэтому при каждом воспроизведении звук начинается только тогда, когда он должен.

Теперь, когда вы объединяете два файла, все супер круто! :-)

ffmpeg -i 1zeroed.m4a -i 2zeroed.m4a -filter_complex amerge -ac 2 -c:a libfdk_aac -vbr 4 mergedaudio.m4a

person andy    schedule 31.08.2017