QT 实现录音功能(注意事项)

百度能找到很多的案例,把录制音频出来,但是会出现几个问题

 (1)、如何读取

 (2)、录制的声音不对

 (3)、录制的声音有很大的杂音

现在我们来解决这个问题:

 1、如何读取,大家不用写代码那么麻烦给大家分享一个工具cooleditprolvse

   https://pan.baidu.com/s/1uDABRO9lVIka8pHWMt8p4w

2、如何录制电脑系统的声音,注意不是麦克风


3、录制的声音有很大的杂音

代码中的设置需要匹配当前 录音设备的配置(开发中替换成自动获取)

    format.setSampleRate(48000);
    format.setChannelCount(2);
    format.setSampleSize(16);
   //这个需要完全匹配 ,不然读取不出来,或者杂音很大



附加源代码一份:


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
    //read();
}

void MainWindow::init()
{
    outputFile.setFileName("test.raw");
    outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
    QAudioFormat format;

    format.setSampleRate(48000);
    format.setChannelCount(2);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
    if (!info.isFormatSupported(format))
    {
       qWarning()<<"default format not supported try to use nearest";
       format = info.nearestFormat(format);
    }
    audio = new QAudioInput(info, format, this);
    QTimer::singleShot(10000, this, SLOT(stopRecording()));
    audio->start(&outputFile);

     qDebug() <<"record begin!";
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::read()
{
    outputFile.setFileName("test.raw");
    outputFile.open(QIODevice::ReadOnly);
    QAudioFormat format;

    format.setSampleRate(48000);
    format.setChannelCount(2);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::UnSignedInt);
    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (!info.isFormatSupported(format))
    {
     qWarning()<<"raw audio format not supported by backend, cannot play audio.";
     return;
    }

    outAudio = new QAudioOutput(format, this);
    connect(outAudio,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
    outAudio->start(&outputFile);
    qDebug() <<"play begin!";
}

void MainWindow::stopRecording()
{
    audio->stop();
    outputFile.close();
    delete audio;
    qDebug() <<"record end!";
}

void MainWindow::finishedPlaying(QAudio::State state)
{
    if(state == QAudio::IdleState)
    {
         outAudio->stop();
         outputFile.close();
         delete outAudio;
    }
    qDebug() << "play end!";
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QtGui>
#include <QAudioInput>
#include <QAudioOutput>
#include <iostream>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    void init();
    ~MainWindow();
    void read();

private slots:
    void stopRecording();
    void finishedPlaying(QAudio::State state);

private:
    Ui::MainWindow *ui;
    QFile outputFile;   // class member.
    QAudioInput* audio; // class member.
    QAudioOutput *outAudio;
};

#endif // MAINWINDOW_H


猜你喜欢

转载自blog.csdn.net/qq_15821883/article/details/80170080