O que você quer é alguma indicação do volume da amostra. Para sinais digitais, isso pode ser medido através do nível RMS. Você pode usar o astats
filter no ffmpeg com a injeção de metadados para obter esse nível de RMS por amostra:
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 -
Aqui, metadata=1
e reset=1
ativam a geração de metadados e o ametadata
filtro imprime esses valores ( mode=print
). A saída é gravada em stats.txt
enquanto nenhuma codificação real é executada ( -f null -
). O log é assim:
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
Você pode filtrar as linhas com base na chave lavfi.astats.Overall.RMS_level
e usar esses valores dB para visualização:
grep "lavfi.astats.Overall.RMS_level=" stats.txt | sed 's/lavfi.astats.Overall.RMS_level=//g' > stats_clean.txt
O mínimo é menos infinito, e o máximo é 0 - então você tem que redimensionar apropriadamente esses valores você mesmo. Você pode ter que filtrar esses valores com base em algum filtro de média móvel para obter uma visualização adequada.
PS: Com música, não há single frequência de áudio. O áudio que você está ouvindo é composto de diferentes frequências, que chamamos de espectro . Parece com isso, onde você vê a intensidade de certa frequência ao longo do tempo:
Ofiltroastats
doffmpegsópodeproduzirinformaçõesnodomíniodotempo,nãonodomíniodafrequência(comomostraaimagemacima).Sevocêquisergerarumespectrocomoffmpeg,poderáfazê-locomoshowspectrum
filter .