【发布时间】:2018-09-27 11:14:57
【问题描述】:
我试图更改我的代码以将录音保存到 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 打开它(只需手动输入采样率、字节顺序导入 Audacity)。是因为原始数据吗?如何保存我的录音,如包含样本大小、采样率的 wav 文件...?
音频.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;
}
}
// ************************************************************************************************
音频.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
【问题讨论】:
-
需要写入原始数据的header(通常为44字节长)才能将其转为
wav格式。为此,我使用基于 Internet 上的代码的类。使用很简单,使用文件名和格式调用构造函数,将原始音频数据提供给它,然后调用关闭函数或让析构函数来完成!看这里(忽略AudioOutput类)stackoverflow.com/a/50112936/2014561 -
非常感谢 Antonio,我尝试更改我的代码!
-
您好,我可以在 MATLAB 中将 pcm 转换为 wav 吗?我该怎么做?
-
我不使用 MATLAB,所以我不知道转换是如何工作的。但是你能从原始数据创建一个
.wav文件并用 VLC 媒体播放器播放吗?将.wav文件导入 MATLAB 时是否遇到问题?请提供更多信息! ;) -
您好 Antonio,我尝试将您的代码集成到我的 (QT) 中,但出现很多错误。我的 AudioRecord.cpp 看起来是这样的:(另外看上面!)