Добавление нескольких отложенных аудиофайлов к одному видео с помощью ffmpeg

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

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

  1. adelay: Фильтр, который добавляет задержку (в миллисекундах) к аудиопотоку. Это позволяет синхронизировать аудио с нужными временными метками видео.

  2. amix: Этот фильтр позволяет смешивать несколько аудиодорожек. Параметр inputs указывает количество входов, duration определяет длительность выходного аудиопотока.

  3. anullsrc: Используется для генерации "тихой" аудиодорожки, которая может заполнять пробелы между разными аудиотреками.

  4. 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 для изменения временных меток аудио.

Применение

  1. Добавление тишины с помощью anullsrc:

    Чтобы заполнить беззвучные промежутки, можно использовать anullsrc. Это создаст необходимую "тихую" дорожку, которая будет приводить размер аудиофайла к нужным временным рамкам:

    anullsrc=r=48000:cl=stereo,atrim=duration=total_video_length
  2. Корректировка временных меток с asetpts:

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

    [a]asetpts=PTS-STARTPTS
  3. Новая команда:

    На основе указанных шагов, переработанная команда 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

Этот подход обеспечивает наличие звука на всех временных отрезках видео, включая паузы.

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

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

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