Как сохранить записи в * .wav? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь изменить свой код, чтобы сохранить записи в wav-файлы.Позже я должен импортировать это в MATLAB.Это работает, чтобы сохранить как. * PCM или. * WAV.Но я хочу воспроизвести его на внешнем проигрывателе (например, VLC Player).

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 (просто импортировать в Audacity с ручным вводом частоты дискретизации, ByteOrder).Это из-за RAW-данных?Как можно сохранить мою запись, как WAV-файл включен размер выборки, частота дискретизации ...?

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 голосов
/ 22 октября 2018

Гораздо более простой подход - использовать 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();
}
...