Генерация видео с аудиосигналом с помощью FFmpeg
С помощью 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. Thec
parameter is the colour in hex format and thes
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 qtrle
, argb
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 -i input.flac -filter_complex \
"[0:a]ahistogram,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Дополнительные параметры и примеры см. в документации по гистограмме.
Фаза
Преобразование входного аудио в видеовыход с отображением фазы звука.
ffmpeg -i input.wav -filter_complex \
"[0:a]aphasemeter=s=1280x720:mpc=cyan,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Дополнительные параметры и примеры см. в документации по афазометру.
Вектор
Преобразуйте входной аудиосигнал в видеовыход, представляя область вектора аудио.
ffmpeg -i input.mp3 -filter_complex \
"[0:a]avectorscope=s=1280x720,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Дополнительные параметры и примеры см. в документации по вектороскопу.
Шкала тонов
Преобразуйте входной аудиосигнал в видеовыход, представляющий частотный спектр с музыкальной шкалой тонов.
ffmpeg -i input.mp4 -filter_complex \
"[0:a]showcqt,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Дополнительные параметры и примеры см. в документации showcqt.
Спектр мощности
Преобразуйте входной аудиосигнал в видеовыход, представляющий спектр мощности звука. Амплитуда звука находится на оси Y, а частота — на оси X.
ffmpeg -i input.mp4 -filter_complex \
"[0:a]showfreqs=mode=line:fscale=log,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Спектр звуковых частот
Преобразуйте входной звук в видеовыход, представляющий спектр звуковых частот.
ffmpeg -i input.oga -filter_complex \
"[0:a]showspectrum=s=1280x720,format=yuv420p[v]" \
-map "[v]" -map 0:a output.mp4
Волна сэмплов
Преобразуйте входной аудиосигнал в видеовыход, представляющий волны сэмплов.
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 -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