widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QAudioSource>
#include <QFile>
#include <QMediaFormat>
#include <QMediaRecorder>
#include <QUrl>
#include <QMediaCaptureSession>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void stopRecording();
void updateProgress(qint64 duration);
void handleStateChanged(QAudio::State newState);
private:
Ui::Widget *ui;
QFile destinationFile; // Class member
QAudioSource* audio; // Class member
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QAudioSource>
#include <QAudioInput>
#include <QAudioFormat>
#include <QAudioDevice>
#include <QMediaDevices>
#include <QFile>
#include <QTimer>
#include <iostream>
#include <QDir>
#include <QFileDialog>
#include <QMediaRecorder>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
destinationFile.setFileName("test.pcm");
destinationFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
QAudioFormat format;
// Set up the desired format, for example:
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleFormat(QAudioFormat::Int16);
format.setChannelConfig(QAudioFormat::ChannelConfigStereo);
QAudioDevice info = QMediaDevices::defaultAudioInput();
if (!info.isFormatSupported(format))
{
qWarning() << "Default format not supported, trying to use the nearest.";
}
audio = new QAudioSource(format, this);
connect(audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
//QTimer::singleShot(3000, this, SLOT(stopRecording()));
audio->start(&destinationFile);
// Records audio for 3000ms
}
Widget::~Widget()
{
delete ui;
}
void Widget::stopRecording()
{
audio->stop();
destinationFile.close();
delete audio;
}
void Widget::handleStateChanged(QAudio::State newState)
{
switch (newState)
{
case QAudio::StoppedState:
if (audio->error() != QAudio::NoError)
{
std::cout << "Error handling" << std::endl;
}
else
{
std::cout << "Finished recording" << std::endl;
}
break;
case QAudio::ActiveState:
std::cout << "Started recording - read from IO device" << std::endl;
break;
default:
// ... other cases as appropriate
break;
}
}
void Widget::updateProgress(qint64 duration)
{
qDebug() << duration;
}
main.cpp
#include "widget.h"
#include <QApplication>
#include <iostream>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widget win;
win.show();
return app.exec();
}
widget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>280</x>
<y>200</y>
<width>89</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>stop</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>pushButton</sender>
<signal>clicked()</signal>
<receiver>Widget</receiver>
<slot>stopRecording()</slot>
<hints>
<hint type="sourcelabel">
<x>339</x>
<y>206</y>
</hint>
<hint type="destinationlabel">
<x>547</x>
<y>206</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>stopRecording()</slot>
</slots>
</ui>
xz@xiaqiu:~/study/csdn/opencv/audio/2/build$ ls
xz@xiaqiu:~/study/csdn/opencv/audio/2/build$ qmake ..
xz@xiaqiu:~/study/csdn/opencv/audio/2/build$ make
xz@xiaqiu:~/study/csdn/opencv/audio/2/build$ ls
main.o moc_predefs.h moc_widget.o testqt widget.o
Makefile moc_widget.cpp test.pcm ui_widget.h
输入ffplay -ar 44100 -ac 2 -f s16le test.pcm
播放音频