資源簡(jiǎn)介
利用C++實(shí)現(xiàn)音頻錄音功能,定義音頻頭的數(shù)據(jù)格式,通道數(shù)為2,通道字節(jié)數(shù)16為錄的聲音更為清晰,無雜音。

代碼片段和文件信息
#include?“SoundRecord.h“
#include?
CSoundRecord::CSoundRecord(void):m_bPlay(false)
?m_Time(0)
?m_hOPFile(nullptr)
{
m_hWaveIn=NULL;
ZeroMemory(&m_stWFEXsizeof(WAVEFORMATEX));
ZeroMemory(m_stWHDRMAX_BUFFERS*sizeof(WAVEHDR));
}
CSoundRecord::~CSoundRecord(void)
{
}
bool?CSoundRecord::initDevice()
{
MMRESULT?mRes=0;
int?nT1=0;
//填充數(shù)據(jù)頭結(jié)構(gòu)體
m_stWFEX.nSamplesPerSec?=??m_samplefreq;
m_stWFEX.nAvgBytesPerSec?=? ?m_samplefreq?*?m_channels?*?m_channelbits?/?8;//每秒所需字節(jié)數(shù)
m_stWFEX.nBlockAlign?=? ?m_channels?*?m_channelbits?/?8;//一個(gè)采樣的字節(jié)數(shù)
m_stWFEX.nChannels?=?m_channels;?//1為單通道,2為雙通道
m_stWFEX.wFormatTag?=??0x0001;//編碼方式
m_stWFEX.wBitsPerSample?=? m_channelbits;//16位,即設(shè)置PCM的方式為16位立體聲(雙通道)
m_stWFEX.cbSize?=?sizeof(WAVEFORMATEX);
mRes=waveInOpen(&m_hWaveInWAVE_MAPPER&m_stWFEX(DWORD_PTR)waveInProc(DWORD_PTR)thisCALLBACK_FUNCTION);
if(mRes!=MMSYSERR_NOERROR)
{
std::cout?<“打開音頻設(shè)備失敗....“?< return?false;
}
//新建存儲(chǔ)文件
//設(shè)置保存的音頻文件名稱
SYSTEMTIME?sysTime;?
GetLocalTime(?&sysTime?);?
char?fileName[512];
memset(fileName0512);
sprintf_s(fileName“%d_%d_%d_%d_%d_%d.wav“sysTime.wYearsysTime.wMonthsysTime.wDaysysTime.wHoursysTime.wMinutesysTime.wSecond);
ZeroMemory(&m_stmmIFsizeof(MMIOINFO));
//轉(zhuǎn)換?stringTolpwstr
m_FileName?=?fileName;
std::wstring?widstr;???
widstr?=?std::wstring(m_FileName.begin()?m_FileName.end());??
LPWSTR?ff?=?(LPWSTR)widstr.c_str();
m_hOPFile=mmioOpen(ff&m_stmmIFMMIO_WRITE?|?MMIO_CREATE);
if(m_hOPFile==NULL)
{
std::cout?<?“創(chuàng)建文件失敗...“?< return?false;
}
ZeroMemory(&m_stckOutRIFFsizeof(MMCKINFO));
m_stckOutRIFF.fccType?=?mmioFOURCC(‘W‘?‘A‘?‘V‘?‘E‘);?
mRes=mmioCreateChunk(m_hOPFile?&m_stckOutRIFF?MMIO_CREATERIFF);
if(mRes!=MMSYSERR_NOERROR)
{
?std::cout?<“創(chuàng)建RIFF-WAVE數(shù)據(jù)塊失敗“?< }
ZeroMemory(&m_stckOutsizeof(MMCKINFO));
m_stckOut.ckid?=?mmioFOURCC(‘f‘?‘m‘?‘t‘?‘?‘);
m_stckOut.cksize?=?sizeof(m_stWFEX);
mRes=mmioCreateChunk(m_hOPFile?&m_stckOut?0);
if(mRes!=MMSYSERR_NOERROR)
{
std::cout?<“創(chuàng)建fmt數(shù)據(jù)塊失敗“?< }
nT1=mmioWrite(m_hOPFile?(HPSTR)?&m_stWFEX?sizeof(m_stWFEX));
if(nT1!=sizeof(m_stWFEX))
{
std::cout?<“寫音頻數(shù)據(jù)格式失敗“?< }
mRes=mmioAscend(m_hOPFile?&m_stckOut?0);
if(mRes!=MMSYSERR_NOERROR)
{
std::cout?<“升序排列數(shù)據(jù)“?< }
m_stckOut.ckid?=?mmioFOURCC(‘d‘?‘a(chǎn)‘?‘t‘?‘a(chǎn)‘);
mRes=mmioCreateChunk(m_hOPFile?&m_stckOut?0);
if(mRes!=MMSYSERR_NOERROR)
{
std::cout?<“創(chuàng)建data數(shù)據(jù)塊失敗“?< }
}
void?CSoundRecord::closeDevice()
{
MMRESULT?mRes=0;
if(m_hWaveIn)
{
unPrepareBuffers();
mRes=waveInClose(m_hWaveIn);
}
if(m_hOPFile)
{
mRes=mmioAscend(m_hOPFile?&m_stckOut?0);
if(mRes!=MMSYSERR_NOERROR)
{
std::cout?<“重定向音頻頭數(shù)據(jù)失敗“?< return?;
}
mRes=mmioAscend(m_hOPFile?&m_stckOutRIFF?0);
if(mRes!=MMSY
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????6499??2018-08-30?15:49??sound\SoundRecord.cpp
?????文件???????1011??2018-08-30?15:51??sound\SoundRecord.h
?????目錄??????????0??2018-08-30?15:53??sound
-----------?---------??----------?-----??----
?????????????????7510????????????????????3
評(píng)論
共有 條評(píng)論