资源简介
整个程序实现了一个录音机功能,QAudioInput生成的raw文件不能直接用播放器播放,这里将生成的.raw文件转成wav格式的音频文件。这样既可用QAudioOutput来播放,又可以用播放器来播放,详情见 http://blog.csdn.net/goforwardtostep/article/details/52776240
代码片段和文件信息
#include “myaudioinput.h“
#include
#include
#include
#define RAW_RECORD_FILENAME “F:/audio/test.raw“ // 录音文件名;
#define WAV_RECORD_FILENAME “F:/audio/test.wav“ // 录音文件转wav格式文件名;
const qint64 TIME_TRANSFORM = 1000 * 1000; // 微妙转秒;
MyAudioInput::MyAudioInput(QWidget *parent)
: QWidget(parent)
m_isRecord(false)
m_isPlay(false)
m_RecordTimerId(0)
m_RecordTime(0)
{
ui.setupUi(this);
// 录音,播放 等按钮 信号槽;
connect(ui.pButtonRecord SIGNAL(clicked()) this SLOT(onstartRecord()));
connect(ui.pButtonstopRecord SIGNAL(clicked()) this SLOT(onstopRecording()));
connect(ui.pButtonPlay SIGNAL(clicked()) this SLOT(onPlay()));
connect(ui.pButtonstopPlay SIGNAL(clicked()) this SLOT(onstopPlay()));
// 输出当前设备支持的音频编码格式;
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
qDebug()<< “AudioDevice supportedCodecs : “ << info.supportedCodecs();
}
MyAudioInput::~MyAudioInput()
{
}
void MyAudioInput::onstartRecord()
{
// 如果正在播放则停止播放;
if (m_isPlay)
{
onstopPlay();
}
// 如果当前没有开始录音则允许录音;
if (!m_isRecord)
{
// 判断本地设备是否支持该格式
QAudioDeviceInfo audioDeviceInfo = QAudioDeviceInfo::defaultInputDevice();
// 判断本地是否有录音设备;
if (!audioDeviceInfo.isNull())
{
m_isRecord = true;
destinationFile.setFileName(RAW_RECORD_FILENAME);
destinationFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
// 设置音频文件格式;
QAudioFormat format;
// 设置采样频率;
format.setSampleRate(8000);
// 设置通道数;
format.setChannelCount(1);
// 设置每次采样得到的样本数据位值;
format.setSampleSize(16);
// 设置编码方法;
format.setCodec(“audio/pcm“);
// 设置采样字节存储顺序;
format.setByteOrder(QAudioFormat::LittleEndian);
// 设置采样类型;
format.setSampleType(QAudioFormat::UnSignedInt);
// 判断当前设备设置是否支持该音频格式;
if (!audioDeviceInfo.isFormatSupported(format))
{
qDebug() << “Default format not supported trying to use the nearest.“;
format = audioDeviceInfo.nearestFormat(format);
}
// 开始录音;
m_audioInput = new QAudioInput(format this);
m_audioInput->start(&destinationFile);
// 开启时钟,用于更新当前录音时间;
if (m_RecordTimerId == 0)
{
m_RecordTimerId = startTimer(100);
}
}
else
{
// 没有录音设备;
QMessageBox::information(NULL tr(“Record“) tr(“Current No Record Device“));
}
}
else
{
// 当前正在录音;
QMessageBox::information(NULL tr(“Record“) tr(“Current is Recording“));
}
}
void MyAudioInput::onstopRecording()
{
// 当前正在录音时,停止录音;
if (m_isRecord)
{
// 关闭时钟,并初始化数据;
killTimer(m_RecordTimerId);
m_RecordTime = 0;
m_RecordTimerId = 0;
m_isRecord = false;
ui.labelTime->setText(QString(“Idle : %1/S“).arg(m_RecordTime));
if (m_audioInput != NULL)
{
m_audioInput->stop();
destinationFile.close();
delete m_audioInput;
m_audioInput = NULL;
}
// 将生成的.raw文件转成.wav格式文件;
if (addWavHeader(RAW_RECORD_FILENAME WAV_RECORD_FILENAM
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7150 2016-10-10 19:52 RecordAudio\myaudioinput.cpp
文件 1311 2016-10-10 19:53 RecordAudio\myaudioinput.h
文件 1860 2016-10-10 19:36 RecordAudio\myaudioinput.ui
目录 0 2016-10-10 19:53 RecordAudio
----------- --------- ---------- ----- ----
10321 4
相关资源
- QToolButton 的扩展、多样化
- QT5.12.2/QT5.12.5 QWebEngineView Ubuntu下编译
- qt串口通信,实现发送和接收
- QT窗口界面模拟生产者消费者
- rtapi_w32.dll 库文件
- QT数字时钟,简单程序,适合练习
- Qt魔方还原lesson5-opencv识别颜色
- Qt魔方还原lesson4-魔方完全还原
- Qt 多线程使用 QTcpSocket及QTimer
- QT开发的视频采集并定时上传到服务器
- tiny4412上实现QT控制LED
- 简单的Shell编辑器Qt5
- 用qt写的学生成绩管理系统
- 用qt写的签到程序
- QT_GZIP整合后的源码
- QT5 QSerialPort 串口收发
- Qt拼图游戏源码
- QT之扫雷游戏
- QT的QTreeWidget有checkbox时轻松选中
- 制作含qt的图形文件系统完整过程
- DS18B20测温及QT界面实现
- 基于QT4的列车时刻表查询系统
- QT编写的串口设备调试工具终极版
- Qt编写守护进程
- qt写的一个动感界面
- qt5串口程序
- QT获取天气程序
- myElectronicDictionary.rar
- Delaunay三角剖分
- vicsek模型的Qt实现
评论
共有 条评论