为什么 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 的一个实例并使用它。
其次,record
和stop
是插槽。将它们连接到 GUI 中相应按钮的 clicked
信号,例如:
auto *audioRecorder = new QAudioRecorder(this);
...
connect(btnRecord, &QPushButton::clicked, audioRecorder, &QAudioRecorder::record);
connect(btnStop, &QPushButton::clicked, audioRecorder, &QAudioRecorder::stop);
注意:有关更多信息,请查看 documentation.
中的示例
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 的一个实例并使用它。
其次,record
和stop
是插槽。将它们连接到 GUI 中相应按钮的 clicked
信号,例如:
auto *audioRecorder = new QAudioRecorder(this);
...
connect(btnRecord, &QPushButton::clicked, audioRecorder, &QAudioRecorder::record);
connect(btnStop, &QPushButton::clicked, audioRecorder, &QAudioRecorder::stop);
注意:有关更多信息,请查看 documentation.
中的示例