Windows WaveIn 录音
- 设置采集音频格式
- WAVEFORMATEX waveform; //采集音频的格式,结构体
- waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM
- waveform.nSamplesPerSec = 8000;//采样率,16000次/秒
- waveform.wBitsPerSample = 16;//采样比特,16bits/次
- waveform.nChannels = 1;//采样声道数,2声道
- waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据
- waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数
- waveform.cbSize = 0;//一般为0
- 提前准备好的录音数据缓存
- m_pRecoderBuf = new unsigned char[20 * 1024];
- m_recoderNum = 20;
- m_recoderBufLen = 20 * 1024;
- m_pWaveHdr = new WAVEHDR[20];
- memset(m_pRecoderBuf, 0, 20 * 1024);
- memset(m_pWaveHdr, 0, sizeof(WAVEHDR) * 20);
- 打开录音设备
- MMRESULT mmres = waveInOpen(&m_hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)WaveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION );
- if(mmres != MMSYSERR_NOERROR)
- {
- // failed, try again.
- return;
- }
WAVE_MAPPER表示系统会自己寻找合适的录音设备。
- 准备数据空间
- for (int i = 0; i < m_recoderNum; ++i)
- {
- m_pWaveHdr[i].lpData = (char*)m_pRecoderBuf + i * 1024;
- m_pWaveHdr[i].dwBufferLength = 1024;
- mmres = waveInPrepareHeader(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
- mmres = waveInAddBuffer(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
- }
- 开始录音并打开写文件
- mmres = waveInStart(m_hWaveIn);
- SYSTEMTIME systemtime;
- GetLocalTime(&systemtime);
- char filename[256];
- sprintf_s(filename, 256, "%d-%d-%d_%d_%d_%d.wav", systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinute, systemtime.wSecond);
- m_pWavFile = wav_write_open(filename, 8000, 16, 1);
- 要提前定义好数据接收回调函数,因为我们用的是CALLBACK_FUNCTION
- static BOOL CALLBACK WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
- BOOL WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
函数里的处理是:
- BOOL CAudioFileConvertDlg::WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
- {
- CAudioFileConvertDlg* pPlayer = (CAudioFileConvertDlg*)dwInstance;
- return pPlayer->WaveInProcImpl(hwo, uMsg, dwParam1, dwParam2);
- }
- BOOL CAudioFileConvertDlg::WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
- {
- // 忽略打开和关闭设备时的处理
- if(uMsg == WIM_DATA)
- {
- LPWAVEHDR pHdr = (LPWAVEHDR) dwParam1;
- MMRESULT mmres = waveInUnprepareHeader (m_hWaveIn, pHdr, sizeof(WAVEHDR));
- //处理数据
- if (NULL != m_pWavFile)
- {
- wav_write_data(m_pWavFile, (unsigned char *)(pHdr->lpData), pHdr->dwBytesRecorded);
- }
- //重新准备数据
- mmres = waveInPrepareHeader(m_hWaveIn, pHdr, sizeof(WAVEHDR));
- mmres = waveInAddBuffer(m_hWaveIn, pHdr, sizeof(WAVEHDR));
- }
- return TRUE;
- }
- 关闭录音并关闭wav写文件
- MMRESULT mmres = waveInStop(m_hWaveIn);
- mmres = waveInClose(m_hWaveIn);
- wav_write_close(m_pWavFile);
- if (NULL != m_pRecoderBuf)
- {
- delete []m_pRecoderBuf;
- m_pRecoderBuf = NULL;
- }
- if (NULL != m_pWaveHdr)
- {
- delete []m_pWaveHdr;
- m_pWaveHdr = NULL;
- }
Windows WaveIn 录音的更多相关文章
- Windows 10 录音上的一个问题
最近升级到了Windows 10,结果在开发程序时发现,无论采用什么方法,都无法正常录制单声道的声音,虽然有迂回的方法解决问题,
- Windows录音API学习笔记(转)
源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...
- Windows录音API学习笔记
Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD wMid; 用于波形 ...
- Windows录音API学习笔记--转
Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD wMid; 用于波形 ...
- 2018-2019-2 20165312《网络攻防技术》Exp4 恶意代码分析
2018-2019-2 20165312<网络攻防技术>Exp4 恶意代码分析 知识点总结 1.有关schtasks schtacks的作用:安排命令和程序定期运行或在指定时间内运行.从计 ...
- windows 录音程序(二)
(二)录音流程 Waveform APIs,流程如下: a.打开录音设备waveInOpen; b.准备wave数据头waveInPrepareHeader; c.准备数据块waveInAddBuff ...
- windows phone 7 通过麦克风录音,并且播放
原文:windows phone 7 通过麦克风录音,并且播放 //模拟XNA的框架(凡是在wp7中应用xna的都必须先模拟此类) public class XNAAsyncDispatcher : ...
- Windows基础-实时录音程序(WaveXXX)
写在前面 一开始是打算用这个老接口做讯飞语音识别的程序,在转移到UWP时发现,这玩意在Windows Runtime中屏蔽(弃用)了,将来会更新使用WASAPI的程序 WaveRecorder类代码下 ...
- windows 录音程序(一)
(一)概述 1.依赖条件:winmm.lib 2.步骤: (1)打开设备 ----- waveInOpen(打开一个音频输入设备): (2)开始录音 ----- waveInStart开始录音: ( ...
随机推荐
- fpga状态机详解
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作 状态机的分类:Moore型状态机和Mealy型状态机 Moore型:状态机的变化只与当前的状态有关 Mealy型:状态机的变化不仅与当前的状 ...
- Android视频播放-SurfaceView和Mediaplayer
好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流 ...
- python 斐波拉契数列数列
'''斐波拉契数列'''def Fibonacci(n): first, next = 0, 1 i = 0; while i < n: print next first, next = nex ...
- 《Linux信息安全实用教程》学习笔记
在GRUB中设置密码 vi /etc/grub.conf 增加: password 或者: password --md5 (MD5值) 使用yyd用户能以root用户执行所有命令 vi /etc/ ...
- php实现支付宝授权登录
第一步: 登录到蚂蚁金服开放平台https://open.alipay.com/platform/home.htm,前提是有商户号.创建应用之后,然后到开发者中心开通对应功能.如图: 第二步: 到应用 ...
- 5. How to set up a Activity
1. Create a new xml in "layout" folder "splah.xml" <?xml version="1.0&qu ...
- 大型开放式网络课程MOOC的一点体会
2012年,美国的顶尖大学陆续设立网络学习平台,在网上提供免费课程,Coursera.Udacity.edX三大课程提供商的兴起.给很多其它学生提供了系统学习的可能.这就是大型开放式网 ...
- Discuz常见小问题-如何使用QQ登陆
在首页中找到超链接 往下翻找到QQ互联,注意如果是内网无法开通(需要网站上传之后)
- Excel中R1C1引用样式
在Excel处理中,经常需要修改某行某列的值.默认情况下Excel中的列号是字母,每次都要去数,因为对字母的位置不熟悉,特别是又有合并单元格的时候,很容易数错.能不能把列也显示成数字,我坚信Offic ...
- Cass环境下光标无显示
先安装CAD2004,十字光标正常显示:再安装CASS7.0,光标就不显示了.现在不清楚是CAD的问题,还是CASS的问题,多半是后者.重新配置了CASS环境也不行. 于是,打开CAD选项,显示,窗口 ...