没有QMainWindow就无法录制音频

时间:2013-11-27 17:20:24

标签: c++ windows qt audio-recording qtmultimedia

我在使用QAudioRecorder而不使用QMainWindow时遇到问题。它将创建一个0字节的文件,在此处运行此脚本后,大多数常见媒体播放器无法播放该文件:

int main(int argc, char *argv[]){
    QAudioRecorder q;
    q.setAudioInput(q.audioInputs()[0]);
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));
    q.record();
    Sleep(10000);
}

虽然这有效:

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

QAudioRecorder q;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    std::cout << "DEFAULT: " << q.defaultAudioInput().toStdString() << std::endl;
    std::cout << "List: " << q.audioInputs().join(',').toStdString() << std::endl;
    std::cout << "STATUS 0: " << q.status() << std::endl;
    std::cout << "Location: " << QUrl::fromLocalFile("simon.amr").path().toStdString() << std::endl;
    q.setAudioInput(q.audioInputs()[0]);
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));
    q.record();

    std::cout << "STATUS 1: " << q.status() << std::endl;
}

MainWindow::~MainWindow()
{
    std::cout << "STATUS 2: " << q.status() << std::endl;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow recorder;
    recorder.show();

    return app.exec();
}

如何在没有QAudioRecorder的情况下使用QMainWindow?我做错了吗?

2 个答案:

答案 0 :(得分:2)

QAudioRecorder的内部状态通过信号和插槽进行管理。这需要一个运行事件循环;

QCoreApplication应该用于控制台应用程序。

QApplication应该用于GUI应用程序。

在上面的示例中,MainWindow甚至不是必需的,它是发现魔法的app.exec()。

答案 1 :(得分:0)

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

    QAudioRecorder q; 
    q.setAudioInput(q.audioInputs()[0]);    
    q.setOutputLocation(QUrl::fromLocalFile("simon.amr"));    
    q.record();

    return app.exec();
}

你需要一个qt事件循环。 Sleep不提供QCoreApplication提供的事件和信号处理。

请读一读,否则你不会在Qt中走得太远,因为这是一个Qt核心机制。

祝你的项目好运!