資源簡介
整個程序實現了一個錄音機功能,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?:?“?<}
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
評論
共有 條評論