我正在为PC创建一个音乐播放器。我想想象一下这首歌的FFT。我创建了一个缓冲1024点数据的整个类来进行FFT并显示它(这是由另一个类处理的)。我的程序是在我的笔记本电脑中开发的,它使用的是Debian Testing x64。我的工作电脑使用Centos 7 x64。当我在我的工作PC上编译我的程序(都使用Qt 5.7.0)时,FFT可视化是垃圾。窥探我的代码,我发现QAudioPuffer从QAudioProbe提供的样本类型已经签名(在我的工作PC中),而它在我的笔记本电脑中浮动。以下是每当QAudioProbe发出数据已被缓冲时调用的代码:
void SpectrumController::setAudioBuffer(QAudioBuffer buffer){
// Used to momentarily stop the process.
if (!enableBuffering) return;
// Only process stereo frames
if (buffer.format().channelCount() != 2) return;
if (buffer.format().sampleType() == QAudioFormat::SignedInt){
//qWarning() << "Signed";
QAudioBuffer::S16S *data = buffer.data<QAudioBuffer::S16S>();
bufferData(data,buffer.frameCount());
}
else if (buffer.format().sampleType() == QAudioFormat::UnSignedInt){
//qWarning() << "Unsigned";
QAudioBuffer::S16U *data = buffer.data<QAudioBuffer::S16U>();
bufferData(data,buffer.frameCount());
}
else if(buffer.format().sampleType() == QAudioFormat::Float){
//qWarning() << "Float";
QAudioBuffer::S32F *data = buffer.data<QAudioBuffer::S32F>();
bufferData(data,buffer.frameCount());
}
}
template<typename T>
void SpectrumController::bufferData(T *data, qint32 N){
for (qint32 i = 0; i < N; i++){
//if (qAbs(data[i].left) > largest){largest = qAbs(data[i].left); qDebug() << "Largest" << largest;}
//currentBuffer << ((qreal)data[i].left/(largest));
//qWarning() << "Added data" << currentBuffer.last();
currentBuffer << data[i].left;
if (datcounter < 100000){
*writer << data[i].left;
*writer << "\n";
datcounter++;
}
else if (writeFile->isOpen()){
qWarning() << "Closed file";
writeFile->close();
}
if (currentBuffer.size() == FFT_SIZE){
dataBuffer << currentBuffer;
currentBuffer.clear();
if (!isRunning) run();
}
我最终做的是将我的笔记本电脑和工作PC收集的前100,000个数据点写入文件,以便绘制它们。
这就是我所拥有的
我认为不同之处在于基本系统对mp3的处理,这反过来又是Qt使用的。我认为是gstreamer。 Centos使用更旧的版本。右边的图对应我的笔记本电脑,而左边的图对应我的工作电脑。
有关如何解决此问题的任何想法?或者我只是无法正确访问原始音频数据?
更新: 即使这不是修复或类似的东西,另一个通道(data [i] .right)中的数据确实有更多适当的数据。我现在正在使用正确的channnel。