FFMPEG 或 FFPLAY,实时捕捉 FFT 信号作为浮点数

问题描述

从创建动画的角度来看,希望使用 ffplay 实时提取波形数据的 FFT 快照。

这正是我想要捕捉的,但这个演示在浏览器中使用 JavaScript。 (Source own post)

const audio = document.getElementById('music');
audio.load();
audio.play();

const ctx = new AudioContext();
const audioSrc = ctx.createMediaElementSource(audio);
const analyser = ctx.createAnalyser();

audioSrc.connect(analyser);
analyser.connect(ctx.destination);

analyser.fftSize = 256;
const bufferLength = analyser.frequencyBinCount;
const frequencyData = new Uint8Array(bufferLength);

setInterval(() => {
   analyser.getByteFrequencyData(frequencyData);
   console.log(frequencyData);
},1000);
<audio id="music" src="http://strm112.1.fm/reggae_mobile_mp3" crossorigin="use-URL-credentials" controls="true"></audio>


我围绕 https://trac.ffmpeg.org/wiki/Waveform 上发布的方法尝试了许多变体。

enter image description here

问题是 FFT 的输出格式是 PCM (Pulse Code Modulation),而不是实时的。


一般来说,是否有一种简单的方法可以在播放声音时检索这些数据?

ffplay -fft file.mp3 > fft.json

使用 C,同样的东西:Apply FFT on pcm data and convert to a spectrogram

FFMPEG waveform filter documentation

解决方法

或者使用 sox 作为替代,如下所示:

play https://radios.vpn.sapo.pt/CV/radio4.mp3 -n stat -freq

安装:

sudo apt install sox libsox-fmt-mp3

enter image description here