MFC利用麦克风录音、保存语音文件、播放wav

最近刚写好一段声纹识别代码,想写一个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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值