Если бы я хотел создать свой собственный аудио-визуализатор, например, создать изображение чего-то расширяющегося и сжимающегося в такт аудио, как бы я это сделал? Есть ли способ получить звуковую частоту в ffmpeg и ограничить ее каким-либо другим значением? Благодарю.
1 ответ
То, что вы хотите, является некоторым показателем громкости образца. Для цифровых сигналов это может быть измерено через среднеквадратичное значение. Вы можете использовать фильтр astats
в ffmpeg с внедрением метаданных, чтобы получить этот уровень RMS для выборки:
ffmpeg -i input.m4a -filter:a "astats=metadata=1:reset=1,ametadata=mode=print:key=lavfi.astats.Overall.RMS_level:file=stats.txt" -f null -
Здесь metadata=1
и reset=1
включить вывод данных метаданных, а ametadata
фильтр печатает эти значения mode=print
Вывод записывается в stats.txt
хотя фактическое кодирование не выполняется (-f null -
). Журнал выглядит так:
frame:0 pts:0 pts_time:0
lavfi.astats.Overall.RMS_level=-77.999541
frame:1 pts:1536 pts_time:0.032
lavfi.astats.Overall.RMS_level=-68.693275
frame:2 pts:3072 pts_time:0.064
lavfi.astats.Overall.RMS_level=-62.974396
frame:3 pts:4608 pts_time:0.096
lavfi.astats.Overall.RMS_level=-61.259331
frame:4 pts:6144 pts_time:0.128
Вы можете отфильтровать строки на основе lavfi.astats.Overall.RMS_level
и использовать эти значения в дБ для визуализации:
grep "lavfi.astats.Overall.RMS_level=" stats.txt | sed 's/lavfi.astats.Overall.RMS_level=//g' > stats_clean.txt
Минимум - это минус бесконечность, а максимум - 0, поэтому вы должны соответствующим образом изменить эти значения самостоятельно. Возможно, вам придется отфильтровать эти значения на основе некоторого фильтра скользящего среднего, чтобы получить правильную визуализацию.
PS: с музыкой нет единой звуковой частоты. Аудио, которое вы слышите, состоит из разных частот, которые мы называем спектром. Это выглядит так, где вы видите интенсивность определенной частоты с течением времени:
Фильтр astats
ffmpeg может выводить информацию только во временной области, а не в частотной (как показано на рисунке выше). Если вы хотите сгенерировать спектр с помощью ffmpeg, вы можете сделать это с помощью фильтра showspectrum
.