Как мне ограничить значение звуковой частоты в ffmpeg?

0

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

Мем Стрим
источник

Ответы:

3

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

slhck
источник
Спасибо за ответ! Ты хоть представляешь, как бы я на самом деле сделал сдерживающий бит? Может быть, изображение круга накачки по амплитуде или что-то?
Мем Стрим
Для меня «ограничение» означает просто масштабирование (возможно, логарифмически?) Значений dBFS от [-∞, 0]до [0, 100]. Практическая реализация этого зависит от того, что вы используете для фактического отображения визуализации (программа на C? Python?), И какой тип визуализации вы выбрали (например, простая панель «фейдер»?). Не могу привести более конкретный пример.
Slhck
нет, я хочу визуализацию в реальном видео. Нет ли команды ffmpeg для «сопоставления» значения dBFS с шириной, например, -i image.png или -i video.mov?
Мем Стрим
Это не было так ясно из вашего вопроса. Вы можете использовать showvolumeфильтр и экспортировать его, но это не так настраиваемо. ffmpeg -i input.mp4 -filter_complex showvolume output.mp4например.
slhck