QAudioBuffer在不同的计算机上提供同一首歌的不同数据

时间:2016-10-31 12:28:24

标签: qt

我正在为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个数据点写入文件,以便绘制它们。

这就是我所拥有的

Comparison of plotted data

我认为不同之处在于基本系统对mp3的处理,这反过来又是Qt使用的。我认为是gstreamer。 Centos使用更旧的版本。右边的图对应我的笔记本电脑,而左边的图对应我的工作电脑。

有关如何解决此问题的任何想法?或者我只是无法正确访问原始音频数据?

更新: 即使这不是修复或类似的东西,另一个通道(data [i] .right)中的数据确实有更多适当的数据。我现在正在使用正确的channnel。

0 个答案:

没有答案