ffmpeg – объединенное видео обрывает зацикленный аудиопоток

Вопрос или проблема

Я пытаюсь зациклить фоновую музыку на 4 видео. 2 видео уже имеют звук, а другие 2 видео не имеют. Зацикленная аудиодорожка внезапно перестает воспроизводиться, когда начинают играть видео без звука.

ffmpeg -y -i merged_video.mp4 -stream_loop -1 -i bgmusic.mp3 -filter_complex "[0]volume=1.0[a];[1]volume=1.0[b];[a][b]amix=inputs=2:duration=shortest" -c:a libmp3lame merged_video_withAudio.mp4

Как мне сделать так, чтобы аудио повторялось на всех 4 видео (включая те, что без звука)?

Спасибо!

ОБНОВЛЕНИЕ

Вот ссылка на видео, которые я объединяю

файлы для слияния видео (с кодом)

encoded_test1.mp4
encoded_test2.mp4
encoded_test3.mp4 (без звука)

Вот объединенные видео (и код)

петля аудио BG-AUDIO на объединенных видео

Вот выходное видео

в результате неудачи

Идея кода заключается в том, что любое количество видео может быть объединено, и аудио будет продолжать зацикливаться без указания конечной продолжительности. Эта возможность успешна, если я заменяю все аудио на зацикленное аудио … но невозможна … если я накладываю видео с зацикленным аудио.

Вот пример работающего замещения аудио …

ffmpeg -i merged_video.mp4 -stream_loop -1 -i bgmusic.mp3 -shortest -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 merged_video_withAudio.mp4

Ответ или решение

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

Теория

Основная задача состоит в зацикливании фонововой музыки на все четыре видео, включая те, которые изначально не имеют звука. Команда ffmpeg попыталась смешать аудиодорожки всех видео с фоновым звуком, но столкнулась с проблемой, когда начинается видеоклип без звука, поскольку у amix параметр duration установлен в shortest. Это приводит к остановке проигрывания зацикленного аудио при отсутствии звука у видеофайла.

Параметр -stream_loop -1 позволяет воспроизводить аудиофайл бесконечно, однако, поскольку используется amix с duration=shortest, аудио останавливается, когда достигается конец наименьшего входного аудиопотока — в данном случае это видео без звука.

Пример

Чтобы лучше понять, где возникает ошибка, давайте подробнее рассмотрим вашу команду:

ffmpeg -y -i merged_video.mp4 -stream_loop -1 -i bgmusic.mp3 \
-filter_complex "[0]volume=1.0[a];[1]volume=1.0[b];[a][b]amix=inputs=2:duration=shortest" \
-c:a libmp3lame merged_video_withAudio.mp4

Как видно из команды:

  • К видеофайлу merged_video.mp4 добавляется фонова музыка с bgmusic.mp3.
  • -stream_loop -1 зацикливает аудио.
  • Концепция amix=inputs=2:duration=shortest является узким местом, так как остановит аудиофайл с достижением конца самого короткого аудиопотока.

Применение

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

Шаг 1: Создайте фиктивную аудиодорожку для видеофайлов без звука

Прежде чем переходить к смешиванию музыки, создайте аудиодорожку для каждого видео без звука, чтобы ffmpeg не воспринимал её как отсутствие звука. Это можно сделать с помощью команды:

ffmpeg -f lavfi -i anullsrc=r=44100:cl=stereo -i encoded_test3.mp4 -c:v copy -c:a aac -map 0:a -map 1:v encoded_test3_with_sound.mp4

Эта команда добавляет пустую аудиодорожку к видео.

Шаг 2: Объединение видео с постоянной фонововой музыкой

Теперь можно создать команду для объединения всех видео с зацикленной аудиодорожкой. Убедитесь, что все видео имеют аудиодорожку (даже если это пустая дорожка):

ffmpeg -f concat -safe 0 -i <(for f in *.mp4; do echo "file '$PWD/$f'"; done) -stream_loop -1 -i bgmusic.mp3 -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" -c:v copy -c:a aac output_with_bgmusic.mp4
  • Параметр duration=longest позволяет зацикленной музыке проигрываться по длине самого длинного аудиопотока, предотвращая преждевременное завершение.

Заключение

Предложенное решение с добавлением фиктивных аудиодорожек позволяет избежать ограничения с duration=shortest, обеспечивая сетевую службу зацикленной музыки на всём протяжении видеофайлов. Это обеспечивает безупречное воспроизведение фоновой музыки даже в тех видеофайлах, где изначально не было звука. Таким образом, пользователь получит итоговое видео, на которое был ориентирован с самого начала — с непрерывной фоновой музыкой по всей длине.

Оцените материал
Добавить комментарий

Капча загружается...