如何在Qt上运行AudioOutput示例代码?

时间:2013-09-07 03:27:45

标签: c++ qt audio

我正在尝试运行此处列出的示例:http://qt-project.org/doc/qt-5.1/qtmultimedia/qaudiooutput.html#details我是C ++和Qt的新手,所以我无法弄清楚它们的含义。这就是我试图实现它的方式:

#include <QtWidgets>
#include <iostream>
#include <stdio.h>  
#include <stdlib.h>
#include <fstream>
#include <string>
#include <QObject>
#include <QAudioOutput>

int main() {
    QFile sourceFile;   // class member.
    QAudioOutput* audio; // class member.
    {
        sourceFile.setFileName("C:\\Documents\\ParadigmE3-shortened.wav");
        sourceFile.open(QIODevice::ReadOnly);

        QAudioFormat format;
        // Set up the format, eg.
        format.setSampleRate(8000);
        format.setChannelCount(1);
        format.setSampleSize(8);
        format.setCodec("audio/pcm");
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::UnSignedInt);

        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        if (!info.isFormatSupported(format)) {
            qWarning() << "Raw audio format not supported by backend, cannot play audio.";
            return;
        }

        audio = new QAudioOutput(format, this);
        connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
        audio->start(&sourceFile);
    }

}

它与描述中的代码相同,只是在int main()函数中。

对于靠近函数末尾的行,我得到两个“在非成员函数中无效使用'this'”错误和一个“没有值的return语句”错误。我确定我做错了。我尝试使用代码创建一个单独的函数并从main()调用它,但这导致调用新函数时出错。

1 个答案:

答案 0 :(得分:1)

这是因为原始类在一个类方法中,this字引用了相关的类。

在这里你复制了main函数中的代码,this失去了意义。

您可以使用智能指针或仅使用QAudioOutput的堆栈对象,将this替换为0。但是,您在连接时会遇到同样的问题。

如果您有QCoreApplication,可以使用QCoreApplication将this替换为父级。但是,您仍然会遇到插槽名称的问题,因为它似乎也没有在任何地方定义。

这是一个稍微偏离主题的内容,但在此处包含整个QtWidgets是没有意义的。即使在这种情况下并不重要,这也会减慢编译的速度。

QFile和QDebug也不包括在内。许多标准包含也是不必要的。你有一个“回归”;一个名为main的函数中的语句,您需要返回一个整数。那也不会编译。

这是你可以在一个非常简单的案例中得到的代码。虽然它是一个示例的切碎版本,但它可以帮助你理解错误:

#include <QAudioOutput>
#include <QFile>
#include <QDebug>
#include <QCoreApplication>

class AudioOutputTest : public QObject
{
    Q_OBJECT
    public Q_SLOTS:
        void handleStateChanged(QAudio::State state) {
            qWarning() << "state = " << state;
            qApp->exit();
        }
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile sourceFile;
    QAudioOutput* audio;

    sourceFile.setFileName("ParadigmE3-shortened.wav");
    sourceFile.open(QIODevice::ReadOnly);

    QAudioFormat format;
    // Set up the format, eg.
    format.setSampleRate(8000);
    format.setChannelCount(1);
    format.setSampleSize(8);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);

    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (!info.isFormatSupported(format)) {
        qWarning() << "Raw audio format not supported by backend, cannot play audio.";
        return 1;
    }

    audio = new QAudioOutput(format, &a);
    AudioOutputTest audioOutputTest;
    QObject::connect(audio, SIGNAL(stateChanged(QAudio::State)), &audioOutputTest, SLOT(handleStateChanged(QAudio::State)));
    audio->start(&sourceFile);

    return a.exec();
}

我使用以下命令编译它:

g++ -I/usr/include/qt/QtMultimedia -I/usr/include/qt -I/usr/include/qt/QtCore -fPIC -lQt5Core -lQt5Multimedia qtaudio.cpp

总结:如果您想坚持这个例子,我建议将该代码放在一个类中。这对你来说是最简单的。

Here您可以找到另一个关于其正确和建议用法的QAudioOutput示例。