为什么 QAudioRecorder 没有通过构造函数进行录音?

Why is QAudioRecorder not recording through the constructor?

header

#ifndef AUDIORECORD_H
#define AUDIORECORD_H

#include <QMediaRecorder>
#include <QAudioRecorder>
#include <QUrl>

class AudioRecorder : public QAudioRecorder
{
    Q_OBJECT

public:
    AudioRecorder(QObject * parent);
    ~AudioRecorder(){}

};

#endif // AUDIORECORD_H

来源

#include "audiorecord.h"
#include<iostream>
using namespace std;
AudioRecorder::AudioRecorder(QObject * parent = 0)
{
    this->setOutputLocation(QUrl::fromLocalFile("test.mp3"));

    int x = 0;
    while ( x > 10000)
    {
        this->record();
        x++;
    }

    this->stop();

    std::cout<<"\ndsffsdf\n";
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "audiorecord.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QObject p;
    AudioRecorder obj(&p);
    
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

这不会产生任何错误,但也不会记录。我不期待任何质量或完整的录音。

我只是想看看这个录音机是如何工作的。

test.mp3 没有被保存。
我至少可以添加或减去什么才能让它记录一些东西并保存?

原因

如果我告诉你 10 000 遍会怎样:去买牛奶,同时紧紧握住你的手,然后在我放开你之前说:啊,算了?你能买到牛奶吗?

你正在对你的代码做同样的事情:

int x = 0;
while ( x > 10000)
{
    this->record();
    x++;
}

this->stop();

您调用了 10 000 次 QAudioRecorder::record,但您没有让 Qt 进入事件循环并实际执行您的命令。然后就在 Qt 进入事件循环之前,你说:stop.

解决方案

首先,你不需要subclassQAudioRecorder,因为你没有给它添加任何新的功能。只需创建 class 的一个实例并使用它。

其次,recordstop是插槽。将它们连接到 GUI 中相应按钮的 clicked 信号,例如:

auto *audioRecorder = new QAudioRecorder(this);

...

connect(btnRecord, &QPushButton::clicked, audioRecorder, &QAudioRecorder::record);
connect(btnStop, &QPushButton::clicked, audioRecorder, &QAudioRecorder::stop);

注意:有关更多信息,请查看 documentation.

中的示例