1. 设置采集音频格式

    1. WAVEFORMATEX waveform; //采集音频的格式,结构体
    2. waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM
    3. waveform.nSamplesPerSec = 8000;//采样率,16000次/秒
    4. waveform.wBitsPerSample = 16;//采样比特,16bits/次
    5. waveform.nChannels = 1;//采样声道数,2声道
    6. waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据
    7. waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数
    8. waveform.cbSize = 0;//一般为0
  2. 提前准备好的录音数据缓存
    1. m_pRecoderBuf = new unsigned char[20 * 1024];
    2. m_recoderNum = 20;
    3. m_recoderBufLen = 20 * 1024;
    4. m_pWaveHdr  = new WAVEHDR[20];
    5. memset(m_pRecoderBuf, 0, 20 * 1024);
    6. memset(m_pWaveHdr, 0, sizeof(WAVEHDR) * 20);
  3. 打开录音设备
    1. MMRESULT mmres = waveInOpen(&m_hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)WaveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION );
    2. if(mmres != MMSYSERR_NOERROR)
    3. {
    4. // failed, try again.
    5. return;
    6. }

    WAVE_MAPPER表示系统会自己寻找合适的录音设备。

  4. 准备数据空间
    1. for (int i = 0; i < m_recoderNum; ++i)
    2. {
    3. m_pWaveHdr[i].lpData = (char*)m_pRecoderBuf + i * 1024;
    4. m_pWaveHdr[i].dwBufferLength = 1024;
    5. mmres = waveInPrepareHeader(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
    6. mmres = waveInAddBuffer(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
    7. }
  5. 开始录音并打开写文件
    1. mmres = waveInStart(m_hWaveIn);
    2. SYSTEMTIME systemtime;
    3. GetLocalTime(&systemtime);
    4. char filename[256];
    5. sprintf_s(filename, 256, "%d-%d-%d_%d_%d_%d.wav", systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinute, systemtime.wSecond);
    6. m_pWavFile = wav_write_open(filename, 8000, 16, 1);
  6. 要提前定义好数据接收回调函数,因为我们用的是CALLBACK_FUNCTION
    1. static BOOL CALLBACK WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
    2. BOOL   WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2);

    函数里的处理是:

    1. BOOL CAudioFileConvertDlg::WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
    2. {
    3. CAudioFileConvertDlg* pPlayer = (CAudioFileConvertDlg*)dwInstance;
    4. return pPlayer->WaveInProcImpl(hwo, uMsg, dwParam1, dwParam2);
    5. }
    6. BOOL CAudioFileConvertDlg::WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
    7. {
    8. // 忽略打开和关闭设备时的处理
    9. if(uMsg == WIM_DATA)
    10. {
    11. LPWAVEHDR pHdr = (LPWAVEHDR) dwParam1;
    12. MMRESULT mmres = waveInUnprepareHeader (m_hWaveIn, pHdr, sizeof(WAVEHDR));
    13. //处理数据
    14. if (NULL != m_pWavFile)
    15. {
    16. wav_write_data(m_pWavFile, (unsigned char *)(pHdr->lpData), pHdr->dwBytesRecorded);
    17. }
    18. //重新准备数据
    19. mmres = waveInPrepareHeader(m_hWaveIn, pHdr, sizeof(WAVEHDR));
    20. mmres = waveInAddBuffer(m_hWaveIn, pHdr, sizeof(WAVEHDR));
    21. }
    22. return TRUE;
    23. }
  7. 关闭录音并关闭wav写文件
    1. MMRESULT mmres = waveInStop(m_hWaveIn);
    2. mmres = waveInClose(m_hWaveIn);
    3. wav_write_close(m_pWavFile);
    4. if (NULL != m_pRecoderBuf)
    5. {
    6. delete []m_pRecoderBuf;
    7. m_pRecoderBuf = NULL;
    8. }
    9. if (NULL != m_pWaveHdr)
    10. {
    11. delete []m_pWaveHdr;
    12. m_pWaveHdr = NULL;
    13. }

Windows WaveIn 录音的更多相关文章

  1. Windows 10 录音上的一个问题

    最近升级到了Windows 10,结果在开发程序时发现,无论采用什么方法,都无法正常录制单声道的声音,虽然有迂回的方法解决问题,

  2. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  3. Windows录音API学习笔记

    Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD      wMid; 用于波形 ...

  4. Windows录音API学习笔记--转

    Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD      wMid; 用于波形 ...

  5. 2018-2019-2 20165312《网络攻防技术》Exp4 恶意代码分析

    2018-2019-2 20165312<网络攻防技术>Exp4 恶意代码分析 知识点总结 1.有关schtasks schtacks的作用:安排命令和程序定期运行或在指定时间内运行.从计 ...

  6. windows 录音程序(二)

    (二)录音流程 Waveform APIs,流程如下: a.打开录音设备waveInOpen; b.准备wave数据头waveInPrepareHeader; c.准备数据块waveInAddBuff ...

  7. windows phone 7 通过麦克风录音,并且播放

    原文:windows phone 7 通过麦克风录音,并且播放 //模拟XNA的框架(凡是在wp7中应用xna的都必须先模拟此类) public class XNAAsyncDispatcher : ...

  8. Windows基础-实时录音程序(WaveXXX)

    写在前面 一开始是打算用这个老接口做讯飞语音识别的程序,在转移到UWP时发现,这玩意在Windows Runtime中屏蔽(弃用)了,将来会更新使用WASAPI的程序 WaveRecorder类代码下 ...

  9. windows 录音程序(一)

    (一)概述 1.依赖条件:winmm.lib 2.步骤: (1)打开设备 -----  waveInOpen(打开一个音频输入设备): (2)开始录音 ----- waveInStart开始录音: ( ...

随机推荐

  1. Informatica 常用组件Lookup之二 已连接和未连接的查找

    可以配置一个已连接的查找转换,以从映射管道中直接接收输入:您也可以配置一个未连接的查找转换,以从其它转换的表达式结果中接收输入. 已连接的查找 未连接的查找 直接从管道接收输入值. 从其它转换的 :L ...

  2. window安装Scrapy———解决报错问题

    系统是WIN10 64位Python是3.5.2今天安装pip install Scrapy  来安装发现报错Microsoft Visual C++ 14.0 is required 检查发现电脑中 ...

  3. Android中Dialog对话框的调用及监听

    Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter, ...

  4. vim学习笔记(2)——vim配置

    记录vim的配置,随时更新 MacVim 安装: homebrew,安装位置:/usr/local/Cellar brew linkapps macvim--将macvim.app加入到Applica ...

  5. PHP实战 新闻管理系统 使用到了bootstrap框架

    刚刚接触 PHP 仿照视频 写了个新闻管理系统 当中也使用到了bootstrap框架 写下来整理一下思路. 这是个非常easy的系统.首先是建立数据库表. mysql>create databa ...

  6. matlab使用常犯的错误

    总是在最后关掉的时候忘了保存工作空间 save... 我用的版本R2013a 每次要setpath...!!!!!!!!!!

  7. Nuget出现错误怎么办?

        Go to the packages folder in the Windows Explorer and delete it. Open Visual Studio and Go to To ...

  8. OAuth 2.0 RFC 框架 中文

    Internet Engineering Task Force (IETF) D. Hardt, Ed.Request for Comments: 6749 MicrosoftObsoletes: 5 ...

  9. [Algorithm] Trie data structure

    For example we have an array of words: [car, done, try, cat, trie, do] What is the best data structu ...

  10. [jQuery] Custom event trigger

    $(document).ready(function(){ // Get Weather $('button').on('show.weather', function() { var results ...