Вопрос или проблема
Я пытаюсь зациклить фоновую музыку на 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
, обеспечивая сетевую службу зацикленной музыки на всём протяжении видеофайлов. Это обеспечивает безупречное воспроизведение фоновой музыки даже в тех видеофайлах, где изначально не было звука. Таким образом, пользователь получит итоговое видео, на которое был ориентирован с самого начала — с непрерывной фоновой музыкой по всей длине.