如何将录音保存到* .wav?

时间:2018-09-27 11:14:57

标签: qt wav

我试图更改代码以将录音保存到wav文件。以后我必须将其导入MATLAB。 其工作方式类似于。* pcm或。* wav。但是我想和外部播放器(例如VLC播放器)一起播放。

QAudioFormat format;
Conf values;
format.setSampleRate(values.getSampRate());
format.setChannelCount(values.getChannel());
format.setSampleSize(values.getSampSize());
format.setCodec(values.getCodec());
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);

在配置文件中,我有配置:

samp_rate=88200
channel=1
samp_size=24
codec=Audio/PCM
byte_order=QAudioFormat::LittleEndian
sample_type=QAudioFormat::SignedInt

保存文件的外观:

m_audio->startrecording(fn+".pcm");

我将pcm更改为wav-文件将被记录,但是我无法使用VLC打开文件(只能通过手动输入采样率ByteOrder导入到Audacity)。是因为RAW数据吗?怎样才能像录音文件一样保存我的录音,包括样本大小,采样率...?

Audio.cpp

// ************************************************************************************************
// Audio-Class
// ************************************************************************************************

#include "Audio.h"
#include "Conf.h"
#include "Measure.h"

// ************************************************************************************************

Audio::Audio(Conf *conf)
{
    m_conf = conf;
    AudioRecord();
}

// ************************************************************************************************
//Initialization and signal-slot connection

void Audio::AudioRecord()
{

QAudioFormat format;
Conf values;
format.setSampleRate(values.getSampRate());
format.setChannelCount(values.getChannel());
format.setSampleSize(values.getSampSize());
format.setCodec(values.getCodec());
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);

QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format))
{
    qWarning() << "Default format not supported";
    format = info.nearestFormat(format);
}

m_audio = new QAudioInput(format, this);
connect(m_audio, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));

}

// ************************************************************************************************
//Start recording method

void Audio::startrecording(QString rec_file_path)
{
    m_file.setFileName(rec_file_path);
    m_file.open(QIODevice::WriteOnly);
    m_audio->start(&m_file);
}

// ************************************************************************************************
//Stop recording

void Audio::stoprecording()
{
    m_audio->stop();
    m_file.close();
}

// ************************************************************************************************
//Recording DEBUG output

void Audio::handleStateChanged(QAudio::State newState)
{
    switch (newState)
    {
        case QAudio::StoppedState:
            if (m_audio->error() != QAudio::NoError)
            {
                qDebug() << "Error!!";
            } else
            {
                qDebug() << "Finished recording";
            }
            break;

        case QAudio::ActiveState:
            qDebug() << "Started recording";
            break;

        default:

            break;
    }
}

// ************************************************************************************************

Audio.h

// ************************************************************************************************
// Audio-HEADER-file
// ************************************************************************************************

#ifndef AUDIO_H
#define AUDIO_H

// ************************************************************************************************
// Includes

#include <QDebug>
#include <QObject>
#include "Conf.h"
#include <QAudioInput>
#include <QDateTime>
#include <QTimer>


// ************************************************************************************************
// Define

#define SAVE_AUDIO_PATH "/home/nikitajarocky/workspace/QT/UART_PC/IO/"

// ************************************************************************************************
// Class variables and methods

class Audio : public QObject
{
    Q_OBJECT
public:
    explicit Audio(Conf *conf);
    void start(QString file_name);
    void stop();
    void startrecording(QString);
    void stoprecording();

signals:

public slots:
    void handleStateChanged(QAudio::State);
    void AudioRecord();

private:
    Conf *m_conf;
    Conf *m_samp_rate;    
    QAudioInput *m_audio;
    QFile m_file;
};

// ************************************************************************************************

#endif // AUDIO_H

1 个答案:

答案 0 :(得分:0)

更简单的方法是使用QAudioRecorder,它可以处理标题的编写,还可以处理音频捕获。

如果您的目标只是录制,它可以使您免于重大更改。

请参见示例:

audio.h:

#ifndef AUDIO_H
#define AUDIO_H

#include <QtCore>
#include <QtMultimedia>

class Audio : public QObject
{
    Q_OBJECT
public:
    explicit Audio(QObject *parent = nullptr);
    ~Audio();

public slots:
    QStringList audioInputs();
    bool record(const QString &path, const QString &audio_input = QString());
    void stop();

private:
    QAudioRecorder *m_recorder;
};

#endif // AUDIO_H

audio.cpp:

#include "audio.h"

Audio::Audio(QObject *parent) : QObject(parent)
{
    m_recorder = new QAudioRecorder(this);
}

Audio::~Audio()
{
    stop();
}

QStringList Audio::audioInputs()
{
    return m_recorder->audioInputs();
}

bool Audio::record(const QString &path, const QString &audio_input)
{
    QAudioEncoderSettings audio_settings;
    audio_settings.setCodec("audio/pcm");
    audio_settings.setChannelCount(1);
    audio_settings.setSampleRate(44100);

    m_recorder->setEncodingSettings(audio_settings);
    m_recorder->setOutputLocation(path);
    m_recorder->setAudioInput(audio_input);

    m_recorder->record();

    if (m_recorder->state() == QAudioRecorder::RecordingState)
    {
        qDebug() << "Recording...";
        return true;
    }
    else
    {
        qDebug() << qPrintable(m_recorder->errorString());
        return false;
    }
}

void Audio::stop()
{
    if (m_recorder->state() == QAudioRecorder::RecordingState)
    {
        m_recorder->stop();
        qDebug() << "Recording stopped";
    }
    else
    {
        qDebug() << "Nothing to stop";
    }
}

用法示例(记录5秒):

#include <QtCore>
#include "audio.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Audio audio;
    audio.record("file.wav");
    QTimer::singleShot(5 * 1000, &audio, &Audio::stop);

    return a.exec();
}