То, что вы хотите, является некоторым показателем громкости образца. Для цифровых сигналов это может быть измерено через уровень 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: с музыкой нет единой звуковой частоты. Аудио, которое вы слышите, состоит из разных частот, которые мы называем спектром . Это выглядит так, где вы видите интенсивность определенной частоты с течением времени:
astats
Фильтр ffmpeg может выводить информацию только во временной области, а не в частотной области (как показано на рисунке выше). Если вы хотите сгенерировать спектр с помощью ffmpeg, вы можете сделать это с помощью showspectrum
фильтра .
[-∞, 0]
до[0, 100]
. Практическая реализация этого зависит от того, что вы используете для фактического отображения визуализации (программа на C? Python?), И какой тип визуализации вы выбрали (например, простая панель «фейдер»?). Не могу привести более конкретный пример.showvolume
фильтр и экспортировать его, но это не так настраиваемо.ffmpeg -i input.mp4 -filter_complex showvolume output.mp4
например.