提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
网上的很多音乐播放器频谱实现,大多用第三方库实现。本文描述的是不使用第三方库实现音乐频谱的动态显示,采用多线程绘制超流畅。一、官方文档分析
QAudioProbe 类允许您监视正在播放或录制的音频。
QAudioRecorder *recorder = new QAudioRecorder();
QAudioProbe *probe = new QAudioProbe;
// ... configure the audio recorder (skipped)
connect(probe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer)));
probe->setSource(recorder); // Returns true, hopefully.
recorder->record(); // Now we can do things like calculating levels or performing an FFT
这是QT官方文档给出的资料,我们先来分析下这几句代码。 probe->setSource(recorder); 这句代码的意思设置媒体源为QAudioRecorder ,待 执行 recorder->record();时触发信号SIGNAL(audioBufferProbed(QAudioBuffer)),其中参数QAudioBuffer正是我们需要的带音频格式的音频数字信号。获取到音频信号就可以进行FFT分析。
二、实现步骤
1. 捕获原始音频数字信号
代码如下(示例):
QObject::connect(&m_audioProbe, &QAudioProbe::audioBufferProbed, [=](const QAudioBuffer &audioBuffer)
{
emit signalGetMediaData(audioBuffer);
});
m_audioProbe.setSource(&m_Player); // Returns true, hopefully.
监控正在播放的音乐文件
2. 读取音频数据
代码如下(示例):
void Engine::dealMediaData(const QAudioBuffer &audioBuffer)
{
int byteCount = audioBuffer.byteCount();
m_buffer.append(audioBuffer.constData<char>(), byteCount);
m_dataLength += byteCount;
}
m_buffer是QByteArray类型的对象,将获取到的音频信号以字节拷贝的方式追加到m_buffer中。用于后续计算FFT。
3. 计算FFT
代码如下(示例):
setFormat(audioBuffer.format(), audioBuffer.duration());
const qint64 levelPosition = m_dataLength - m_levelBufferLength;
if (levelPosition >= 0)
calculateLevel(levelPosition, m_levelBufferLength);
if (m_dataLength >= m_spectrumBufferLength) {
const qint64 spectrumPosition = m_dataLength - m_spectrumBufferLength;
calculateSpectrum(spectrumPosition);
}
setFormat 函数的功能是设置音频格式,获取计算音频信号的起始位置和长度。
4. 项目源码目录
5. 实际效果
总结
以上就是基于QT的音乐播放器频谱实现,附上完整源码下载链接:音乐频谱源码下载