最近刚写好一段声纹识别代码,想写一个MFC界面来做一个语音采集,搭建一个人机交互的声纹识别界面,于是开始玩一玩MFC的语音采集,保存文件,播放。
网上搜相关内容,发现https://blog.youkuaiyun.com/shufac/article/details/20649303该博客较为完善,本文代码参考该博客,对其中细节进行补充。
步骤一:新建工程
我使用的软件是VS2012,新建MFC工程-->基于对话框-->完成,放置3个Button
ID分别为 IDC_RECORD_START,IDC_RECORD_STOP, IDC_RECORD_PLAY
并给这三个按钮分别添加消息处理函数:OnRecordStart(),OnRecordStop(),OnRecordPlay()。
步骤二:添加头文件
在MFCApplication1Dlg.cpp中添加头文件
//声音相关
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")
添加一些宏定义以及全局变量,后面程序会用到
HWAVEIN hWaveIn;//波形音频数据格式Wave_audio数据格式
WAVEFORMATEX waveform;
HWAVEOUT hWaveOut;//打开回放设备函数
WAVEHDR *pWaveHdr1;
WAVEHDR *pWaveHdr2;
#define BUFFER_SIZE (44100*16*2/8*5) // 录制声音长度
#define FRAGMENT_SIZE 1024*4 // 缓存区大小
#define FRAGMENT_NUM 4 // 缓存区个数
//static unsigned char pSaveBuffer[BUFFER_SIZE] = {0};
PBYTE pBuffer1;
PBYTE pBuffer2;
PBYTE pSaveBuffer;
PBYTE pNewBuffer;
int dwDataLength=FRAGMENT_SIZE;
bool bEnding;
步骤三:在初始化函数OnInitDialog()中分配内存
在OnInitDialog()中加入以下代码:
//allocate memory for wave header
pWaveHdr1=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
pWaveHdr2=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
//allocate memory for save buffer
pSaveBuffer = reinterpret_cast<PBYTE>(malloc(1));
步骤四:完善消息处理函数
完善OnBnClickedRecordStart(),OnBnClickedRecordStop(),OnBnClickedRecordPlay()代码如下:
void CMFCApplication1Dlg::OnBnClickedRecordStart()
{
// TODO: 在此添加控件通知处理程序代码
//allocate buffer memory
pBuffer1=(PBYTE)malloc(dwDataLength);
pBuffer2=(PBYTE)malloc(dwDataLength);
if (!pBuffer1 || !pBuffer2) {
if (pBuffer1) free(pBuffer1);
if (pBuffer2) free(pBuffer2);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("Memory erro!"));
return;
}
//open waveform audo for input
waveform.wFormatTag