Если бы я хотел создать свой собственный аудио-визуализатор, например, создать изображение чего-то расширяющегося и сжимающегося в такт аудио, как бы я это сделал? Есть ли способ получить звуковую частоту в ffmpeg и ограничить ее каким-либо другим значением? Благодарю.

1 ответ1

3

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

По Aquegg - собственная работа, общественное достояние, https://commons.wikimedia.org/w/index.php?curid=5544473

Фильтр astats ffmpeg может выводить информацию только во временной области, а не в частотной (как показано на рисунке выше). Если вы хотите сгенерировать спектр с помощью ffmpeg, вы можете сделать это с помощью фильтра showspectrum .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .