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 displayErrorMessage();
private:
Ui::Widget *ui;
///
QMediaRecorder *audioRecorder = nullptr;
QMediaCaptureSession captureSession;
};
#endif // WIDGET_H
#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>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
audioRecorder = new QMediaRecorder(this);
captureSession.setRecorder(audioRecorder);
captureSession.setAudioInput(new QAudioInput(this));
qDebug()<<audioRecorder->recorderState();
if (audioRecorder->recorderState() == QMediaRecorder::StoppedState)
{
captureSession.audioInput()->setDevice(QMediaDevices::defaultAudioInput());
qDebug()<<QMediaDevices::defaultAudioInput().description();
QMediaFormat format;
format.setFileFormat(QMediaFormat::AAC);
format.setAudioCodec(QMediaFormat::AudioCodec::AAC);
audioRecorder->setMediaFormat(format);
audioRecorder->setAudioSampleRate(44100);
audioRecorder->setAudioBitRate(0);
audioRecorder->setAudioChannelCount(2);
audioRecorder->setQuality(QMediaRecorder::HighQuality);
audioRecorder->setEncodingMode(QMediaRecorder::ConstantQualityEncoding);
audioRecorder->setOutputLocation(QUrl::fromLocalFile(QDir::currentPath() + "/output.aac"));
audioRecorder->record();
qDebug()<<audioRecorder->recorderState();
qDebug()<<audioRecorder->outputLocation();
}
connect(audioRecorder, &QMediaRecorder::durationChanged, this, &Widget::updateProgress);
connect(audioRecorder, &QMediaRecorder::errorChanged, this, &Widget::displayErrorMessage);
}
Widget::~Widget()
{
delete ui;
}
void Widget::stopRecording()
{
audioRecorder->stop();
}
void Widget::updateProgress(qint64 duration)
{
qDebug()<<duration;
}
void Widget::displayErrorMessage()
{
qDebug()<<audioRecorder->errorString();
}
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/ffmpeg/audio_input/build$ ls
main.o moc_predefs.h moc_widget.o test.txt widget.o
Makefile moc_widget.cpp testqt ui_widget.h
xz@xiaqiu:~/study/csdn/ffmpeg/audio_input/build$ ./testqt
QMediaRecorder::StoppedState
"内置音频 模拟立体声"
QMediaRecorder::RecordingState
QUrl("file:///home/xz/study/csdn/ffmpeg/audio_input/build/output.aac")
96
196
296
396
496
596
696
796
896
996
1096
1196
xz@xiaqiu:~/study/csdn/ffmpeg/audio_input/build$ ls
main.o moc_predefs.h moc_widget.o testqt ui_widget.h
Makefile moc_widget.cpp output.aac test.txt widget.o
xz@xiaqiu:~/study/csdn/ffmpeg/audio_input/build$
xz@xiaqiu:~/study/csdn/ffmpeg/audio_input/build$ ffplay output.aac
注意:记得调用stop