提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、官方文档分析
- 二、实现步骤
- 1. 捕获原始音频数字信号
- 2. 读取音频数据
- 3. 计算FFT
- 4. 项目源码目录
- 5. 实际效果
- 总结
前言
网上的很多音乐播放器频谱实现,大多用第三方库实现。本文描述的是不使用第三方库实现音乐频谱的动态显示,采用多线程绘制超流畅。一、官方文档分析
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的音乐播放器频谱实现,附上完整源码下载链接:音乐频谱源码下载