-
大小: 4KB文件類(lèi)型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-10
- 語(yǔ)言: 其他
- 標(biāo)簽: Qt??raw轉(zhuǎn)wav??
資源簡(jiǎn)介
整個(gè)程序?qū)崿F(xiàn)了一個(gè)錄音機(jī)功能,QAudioInput生成的raw文件不能直接用播放器播放,這里將生成的.raw文件轉(zhuǎn)成wav格式的音頻文件。這樣既可用QAudioOutput來(lái)播放,又可以用播放器來(lái)播放,詳情見(jiàn) 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“ //?錄音文件轉(zhuǎn)wav格式文件名;
const?qint64?TIME_TRANSFORM?=?1000?*?1000; //?微妙轉(zhuǎn)秒;
MyAudioInput::MyAudioInput(QWidget?*parent)
:?QWidget(parent)
?m_isRecord(false)
?m_isPlay(false)
?m_RecordTimerId(0)
?m_RecordTime(0)
{
ui.setupUi(this);
//?錄音,播放?等按鈕?信號(hào)槽;
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()));
//?輸出當(dāng)前設(shè)備支持的音頻編碼格式;
QAudioDeviceInfo?info(QAudioDeviceInfo::defaultOutputDevice());
qDebug()<“AudioDevice?supportedCodecs?:?“?<}
MyAudioInput::~MyAudioInput()
{
}
void?MyAudioInput::onstartRecord()
{
//?如果正在播放則停止播放;
if?(m_isPlay)
{
onstopPlay();
}
//?如果當(dāng)前沒(méi)有開(kāi)始錄音則允許錄音;
if?(!m_isRecord)
{
//?判斷本地設(shè)備是否支持該格式
QAudioDeviceInfo?audioDeviceInfo?=?QAudioDeviceInfo::defaultInputDevice();
//?判斷本地是否有錄音設(shè)備;
if?(!audioDeviceInfo.isNull())
{
m_isRecord?=?true;
destinationFile.setFileName(RAW_RECORD_FILENAME);
destinationFile.open(QIODevice::WriteOnly?|?QIODevice::Truncate);
//?設(shè)置音頻文件格式;
QAudioFormat?format;
//?設(shè)置采樣頻率;
format.setSampleRate(8000);
//?設(shè)置通道數(shù);
format.setChannelCount(1);
//?設(shè)置每次采樣得到的樣本數(shù)據(jù)位值;
format.setSampleSize(16);
//?設(shè)置編碼方法;
format.setCodec(“audio/pcm“);
//?設(shè)置采樣字節(jié)存儲(chǔ)順序;
format.setByteOrder(QAudioFormat::LittleEndian);
//?設(shè)置采樣類(lèi)型;
format.setSampleType(QAudioFormat::UnSignedInt);
//?判斷當(dāng)前設(shè)備設(shè)置是否支持該音頻格式;
if?(!audioDeviceInfo.isFormatSupported(format))
{
qDebug()?<“Default?format?not?supported?trying?to?use?the?nearest.“;
format?=?audioDeviceInfo.nearestFormat(format);
}
//?開(kāi)始錄音;
m_audioInput?=?new?QAudioInput(format?this);
m_audioInput->start(&destinationFile);
//?開(kāi)啟時(shí)鐘,用于更新當(dāng)前錄音時(shí)間;
if?(m_RecordTimerId?==?0)
{
m_RecordTimerId?=?startTimer(100);
}
}
else
{
//?沒(méi)有錄音設(shè)備;
QMessageBox::information(NULL?tr(“Record“)?tr(“Current?No?Record?Device“));
}
}
else
{
//?當(dāng)前正在錄音;
QMessageBox::information(NULL?tr(“Record“)?tr(“Current?is?Recording“));
}
}
void?MyAudioInput::onstopRecording()
{
//?當(dāng)前正在錄音時(shí),停止錄音;
if?(m_isRecord)
{
//?關(guān)閉時(shí)鐘,并初始化數(shù)據(jù);
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文件轉(zhuǎn)成.wav格式文件;
if?(addWavHeader(RAW_RECORD_FILENAME?WAV_RECORD_FILENAM
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????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
評(píng)論
共有 條評(píng)論