Вопрос или проблема
Я пытаюсь добавить 5 разных аудиофайлов (они содержат как аудио, так и видеопотоки, но я просто пытаюсь добавить аудио) в одно видео. Аудиопотоки задержаны таким образом, что будут части, где нет звукового потока, если это имеет значение.
То, что я смог собрать, используя Google, GPT и мои небольшие знания о ffmpeg, это следующее:
ffmpeg -i output_na.mp4 -i cameraVoip_13_4.flv -i cameraVoip_15_7.flv
-i cameraVoip_17_9.flv -i cameraVoip_17_11.flv -i cameraVoip_20_13.flv
-filter_complex " [1:a]adelay=0:all=1[a1]; [2:a]adelay=192000:all=1[a2]; [3:a]adelay=1240000[a3]; [4:a]adelay=1725000[a4]; [5:a]adelay=1818000[a5]; [a1][a2][a3][a4][a5]amix=inputs=5:duration=first[aout]"
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k -y output_final.mp4
но проблема в том, что когда я запускаю эту команду, output_final.mp4
воспроизводит первое аудио (то, которое из звукового потока cameraVoip_13_4.flv
), но после этого видео полностью без звука, и остальные 4 аудио не воспроизводятся (а при генерации видео после 3 минут, которые составляют длину cameraVoip_13_4.flv
, генерация становится x540 и почти мгновенно заканчивается, что, вероятно, означает, что ffmpeg не добавляет аудио в первую очередь, но я не знаю почему).
В ffmpeg нет такого понятия, как отсутствие аудио. Существует тихое аудио или отсутствие звука, но вам нужно, чтобы что-то там было. То, что вам нужно для пробелов, это фильтр anullsrc
и установка sample_rate и продолжительности. Также обратите внимание на asetpts
для сброса временного кода в аудиофайле.
Ответ или решение
Добавление множества задержанных аудио к одному видеофайлу с использованием FFmpeg — это задача, требующая детального понимания синтаксиса команд и фильтров FFmpeg. Проблема состоит в необходимости использования нескольких аудиодорожек с разными временными задержками и возможным наличием беззвучных участков между ними. В этом ответе я дам подробные объяснения и пошаговые инструкции по решению данной задачи.
Теория
FFmpeg — это мощный инструмент командной строки для обработки мультимедийных файлов, включая видео и аудио. Для добавления нескольких аудиодорожек к видео с задержками необходимо глубоко понимать несколько ключевых концепций:
-
adelay: Фильтр, который добавляет задержку (в миллисекундах) к аудиопотоку. Это позволяет синхронизировать аудио с нужными временными метками видео.
-
amix: Этот фильтр позволяет смешивать несколько аудиодорожек. Параметр
inputs
указывает количество входов,duration
определяет длительность выходного аудиопотока. -
anullsrc: Используется для генерации "тихой" аудиодорожки, которая может заполнять пробелы между разными аудиотреками.
-
asetpts: Этот фильтр модифицирует временные метки аудиопотока, что помогает в корректировке временной привязки аудио к видео.
Пример
Ваша попытка использовать FFmpeg выглядела следующим образом:
ffmpeg -i output_na.mp4 -i cameraVoip_13_4.flv -i cameraVoip_15_7.flv \
-i cameraVoip_17_9.flv -i cameraVoip_17_11.flv -i cameraVoip_20_13.flv \
-filter_complex "[1:a]adelay=0:all=1[a1]; [2:a]adelay=192000:all=1[a2]; \
[3:a]adelay=1240000:all=1[a3]; [4:a]adelay=1725000:all=1[a4]; \
[5:a]adelay=1818000:all=1[a5]; [a1][a2][a3][a4][a5]amix=inputs=5:duration=first[aout]" \
-map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k -y output_final.mp4
Проблема в том, что после первой аудиодорожки видео становится беззвучным, а позже процесс кодирования завершается практически мгновенно. Это может быть связано с тем, что другие аудиодорожки не были корректно интегрированы в итоговое видео. Основные шаги предполагают использование anullsrc
для заполнения тишины и asetpts
для изменения временных меток аудио.
Применение
-
Добавление тишины с помощью anullsrc:
Чтобы заполнить беззвучные промежутки, можно использовать
anullsrc
. Это создаст необходимую "тихую" дорожку, которая будет приводить размер аудиофайла к нужным временным рамкам:anullsrc=r=48000:cl=stereo,atrim=duration=total_video_length
-
Корректировка временных меток с asetpts:
Используйте
asetpts
для сброса временных меток, чтобы аудиопотоки начались в правильный момент:[a]asetpts=PTS-STARTPTS
-
Новая команда:
На основе указанных шагов, переработанная команда FFmpeg может выглядеть так (замените
total_video_length
на фактическую длину вашего видео):ffmpeg -i output_na.mp4 -i cameraVoip_13_4.flv -i cameraVoip_15_7.flv -i cameraVoip_17_9.flv \ -i cameraVoip_17_11.flv -i cameraVoip_20_13.flv \ -filter_complex "[1:a]adelay=0:all=1[a1]; \ [2:a]adelay=192000:all=1[a2]; \ [3:a]adelay=1240000:all=1[a3]; \ [4:a]adelay=1725000:all=1[a4]; \ [5:a]adelay=1818000:all=1[a5]; \ anullsrc=r=48000:cl=stereo,atrim=duration=total_video_length[silence]; \ [a1][a2][a3][a4][a5][silence]amix=inputs=6:duration=first[aout]" \ -map 0:v:0 -map "[aout]" -c:v copy -c:a aac -b:a 192k -y output_final.mp4
Этот подход обеспечивает наличие звука на всех временных отрезках видео, включая паузы.
Заключение: Внимание к деталям при работе с временными метками и пробелами в аудио имеет решающее значение. Пусть это руководство поможет вам достичь желаемого результата, создавая профессиональные мультимедийные файлы с правильной смесительно-звуковой дорожкой.