Антон Малявский Антон Малявский

Генерация видео с аудиосигналом с помощью FFmpeg

22 января 2025 г.

С помощью FFmpeg можно генерировать видео с аудиосигналом. Это может быть полезно, например для создания видео на основе подкаста или музыки.

Установка FFmpeg  Ссылка на этот раздел

Чтобы следовать этому руководству и генерировать формы сигналов, вам нужно будет установить FFmpeg на вашем компьютере. Сначала запустите команду ниже, чтобы проверить, установлена ли она уже.

ffmpeg --version

Если нет, посетите официальную страницу загрузки FFmpeg , выберите подходящую версию для вашей операционной системы и следуйте инструкциям по установке.

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

FFmpeg можно установить в MacOS с помощью менеджера пакетов, например Homebrew.

Команда создания формы волны FFmpeg  Ссылка на этот раздел

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Вы должны увидеть вывод команды, так как FFmpeg обрабатывает аудиофайл и генерирует видеофайл с именем output.mp4. Вот полученное видео с формой волны:

Как работают фильтр-комплекс и фильтр шоу-волны  Ссылка на этот раздел

Команда имеет несколько параметров, которые вместе создают сигнал. Самая важная часть — это параметр -filter_complex и значение showwaves=size=854x480:colors=white. Параметр FFmpeg -filter_complex позволяет применять к медиафайлу несколько фильтров.

В этом случае мы используем фильтр showwaves для генерации сигнала. Фильтр showwaves имеет несколько параметров, позволяющих настроить форму сигнала, например размер, цвет и стиль. В этом примере мы устанавливаем размер 854x480 пикселей и цвет белый.

Фильтр compand используется для сжатия и расширения сигнала для заполнения видеокадра. Параметр format=yuv420p используется для установки формата пикселей yuv420p, совместимого с большинством видеоплееров.

[0:a] — это входной аудиопоток, а [vout] — выходной видеопоток.

Разбивка оставшихся параметров  Ссылка на этот раздел

Команда имеет несколько других параметров, которые стоит упомянуть:

  • -i input.mp3 сообщает FFmpeg аудиофайл, который мы хотим использовать для создания формы волны.
  • -r 25 устанавливает частоту кадров на уровне 25 кадров в секунду (fps) для выходного видео.
  • -map "[vout]" сопоставляет выходной видеопоток с выходным файлом.
  • -map 0:a сопоставляет входной аудиопоток с выходным файлом.
  • -c:v libx264 указывает видеокодек, который будет использоваться для выходного файла. В этом случае мы используем кодек H.264 (mp4).
  • -c:a copy копирует аудиопоток из входного файла в выходной файл без его перекодирования.
  • output.mp4 указывает имя выходного видеофайла.

Как стилизировать внешний вид формы волны  Ссылка на этот раздел

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

Параметр рисования  Ссылка на этот раздел

Опцию рисования можно установить на full или scale, и она управляет тем, как рисуются выборки в форме волны. Значением по умолчанию является scale, который масштабирует пиксели для каждого нарисованного образца. full вариант рисует каждую выборку напрямую. При использовании full сигнала форма сигнала выглядит более жирной и ее легче увидеть.

Вот и же команда, но с использованием параметра draw, установленного в draw:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Параметр режима  Ссылка на этот раздел

Параметр режима управляет стилем сигнала. Значением по умолчанию является point, которая рисует отдельные точки выборки, не соединяя их линиями. Другие доступные режимы включают line, cline и p2p.

Опираясь на нашу предыдущую команду, вот пример с использованием line режима:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=line,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Использование режима cline:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=cline,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

И, наконец, использование режима p2p:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=p2p,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Параметр масштаба  Ссылка на этот раздел

Параметр масштаба регулирует амплитуду сигнала, что влияет на пики и минимумы сигнала. Значение по умолчанию — lin для линейного. Другие доступные значения включают log (логарифмический), sqrt (квадратный корень) и cbrt (кубический корень).

Продолжая с последней команды, вот пример с использованием log шкалы:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=p2p:scale=log,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Использование шкалы sqrt:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=p2p:scale=sqrt,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

И используя шкалу cbrt:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=white:draw=full:mode=p2p:scale=cbrt,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Параметр цветов  Ссылка на этот раздел

До сих пор все наши сигналы были белыми. Вы можете установить любой цвет сигнала, который вам нравится. Вы можете использовать встроенные названия цветов FFmpeg, например white, red или blue. Доступные названия цветов перечислены в справочнике цветов FFmpeg.

Вы также можете использовать стиль HTML и шестнадцатикратные цвета, например 0x25d3d0 или #25d3d0. В зависимости от вашей версии FFmpeg вы также можете добавить прозрачность к цвету, используя @, за которым следует значение от 0 до 1. Например, [email protected] устанавливает непрозрачность цвета на 30%. Или добавив параметр альфа в конец шестнадцатеричного кода, например 0x25d3d0CC.

Вот пример с использованием акцентного цвета Shotstack #25d3d0:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=#25d3d0:draw=full:mode=line,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Несколько цветов  Ссылка на этот раздел

Вы также можете использовать несколько цветов, разделив их вертикальной чертой | символ. Например, colors=blue|yellow создает сигнал с синими и желтыми цветами.

Несколько цветов сигналов лучше работают с разными типами аудио, например, с музыкальными файлами. Вот пример использования акцентного цвета Shotstack, дополнительного фиолетового цвета #7925d3 и музыкального файла:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=#25d3d0|#7925d3:draw=full:mode=line,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Параметр размера  Ссылка на этот раздел

Вы можете настроить размер формы волны с помощью параметра size. Это также определит выходной размер видео, если вы не используете другие параметры FFmpeg для обрезки и изменения размера  видео.

Наше оригинальное видео было 854x480 пикселей. Вот пример создания небольшого квадратного видео с размером 400 пикселей на 400 пикселей:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=400x400:colors=#25d3d0:draw=full:mode=line,format=yuv420p[vout]" -map "[vout]" -map 0:a -c:v libx264 -c:a copy output.mp4

Цвет фона  Ссылка на этот раздел

Все видео в форме волны на данный момент имеют черный фон. Можно изменить цвет фона с помощью следующей команды:

ffmpeg -i input.mp3 -f lavfi -i color=c=#7925d3:s=854x480 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=#25d3d0:draw=full:mode=line[vout];[1:v][vout]overlay=format=auto:shortest=1,format=yuv420p[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy output.mp4 

В этом примере мы добавили следующее:

  • -f lavfi -i color=c=#7925d3:s=854x480 use a single filter and the creates a solid colour background. The c parameter is the colour in hex format and the s parameter is the size of the video. The size of the solid colour should match the size of the waveform video.
  • [1:v][vout]overlay=format=auto:shortest=1,format=yuv420p[v] overlays the waveform output on the background colour using the overlay filter . The [1:v][vout] and [v] notation controls how the filters are chained together.
  • The shortest=1 parameter ensures the output video is the same length as the shortest input stream, i.e. the waveform video (the background colour would play forever if not set to the shortest input stream).

Вот как выглядит финальное видео:

Прозрачные фоны  Ссылка на этот раздел

В реальном сценарии обычно накладывается форма волны поверх изображения или другого видео. Для этого вам нужно создать видео с прозрачным фоном. Это невозможно с кодеком H.264, который мы использовали.

Instead you need to use the QuickTime Animation codec -c:v qtrleargb pixel format, and save the video as a .mov file. The QuickTime Animation codec supports alpha transparent backgrounds.

Вот пример команды для создания видео в форме волны с прозрачным фоном:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=#25d3d0:draw=full:mode=line,format=argb[vout]" -map "[vout]" -map 0:a -c:v qtrle -c:a copy output.mov

The output video will be a .mov file with a transparent background. You can overlay this video on top of other videos or images in your video editing software.

Удаление звука  Ссылка на этот раздел

Также возможно, что вы захотите отделить аудио и не включать его в видео в форме волны. Для этого вы можете просто удалить из команды параметры -map 0:a -c:a copy. Вот пример:

ffmpeg -i input.mp3 -r 25 -filter_complex "[0:a]compand,showwaves=size=854x480:colors=#25d3d0:draw=full:mode=line,format=argb[vout]" -map "[vout]" -map 0:a -c:v qtrle output.mov

Необычные примеры  Ссылка на этот раздел

Гистограмма громкости  Ссылка на этот раздел

Преобразование входного аудио в видеовыход с отображением гистограммы громкости.

Видео с гистограммой громкости, сгенерированное с помощью FFmpeg

ffmpeg -i input.flac -filter_complex \
"[0:a]ahistogram,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Дополнительные параметры и примеры см. в документации по гистограмме.

Фаза  Ссылка на этот раздел

Преобразование входного аудио в видеовыход с отображением фазы звука.

Видео со фазой, сгенерированное с помощью FFmpeg

ffmpeg -i input.wav -filter_complex \
"[0:a]aphasemeter=s=1280x720:mpc=cyan,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Дополнительные параметры и примеры см. в документации по афазометру.

Вектор  Ссылка на этот раздел

Преобразуйте входной аудиосигнал в видеовыход, представляя область вектора аудио.

Видео со вектором, сгенерированное с помощью FFmpeg

ffmpeg -i input.mp3 -filter_complex \
"[0:a]avectorscope=s=1280x720,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Дополнительные параметры и примеры см. в документации по вектороскопу.

Шкала тонов  Ссылка на этот раздел

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

Видео со шкаклой тонов, сгенерированное с помощью FFmpeg

ffmpeg -i input.mp4 -filter_complex \
"[0:a]showcqt,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Дополнительные параметры и примеры см. в документации showcqt.

Спектр мощности  Ссылка на этот раздел

Преобразуйте входной аудиосигнал в видеовыход, представляющий спектр мощности звука. Амплитуда звука находится на оси Y, а частота — на оси X.

Видео со спектром мощности, сгенерированное с помощью FFmpeg

ffmpeg -i input.mp4 -filter_complex \
"[0:a]showfreqs=mode=line:fscale=log,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Спектр звуковых частот  Ссылка на этот раздел

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

Видео со спектром звуковых частот, сгенерированное с помощью FFmpeg

ffmpeg -i input.oga -filter_complex \
"[0:a]showspectrum=s=1280x720,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Волна сэмплов  Ссылка на этот раздел

Преобразуйте входной аудиосигнал в видеовыход, представляющий волны сэмплов.

Видео с волной сэмплов, сгенерированное с помощью FFmpeg

ffmpeg -i input.m4a -filter_complex \
"[0:a]showwaves=s=1280x720:mode=line:rate=25,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4

Входная громкость  Ссылка на этот раздел

Преобразование входной громкости звука в видеовыход.

Видео со входной громкостью, сгенерированное с помощью FFmpeg

ffmpeg -i input.mka -filter_complex \
"[0:a]showvolume=f=1:b=4:w=720:h=68,format=yuv420p[vid]" \
-map "[vid]" -map 0:a output.mp4

Источники  Ссылка на этот раздел

Понравилось? Подпишитесь на меня!
RSS ТелеграмМастодонт