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. Objective-C:ARC自动释放对象内存

    ARC是cocoa系统帮你完成对象内存释放的引用计数机制 .h文件 // Person.h // 01-ARC // // Created by ma c on 15/8/13. // Copyrig ...

  2. Android Studio体验(二)--创建项目和Genymotion试用

    上周日已经体验了一把Android Studio顺便没事点了点其他功能,不过还是从自己创建项目开始说吧,首先我们要熟悉Android Studio中的Project 和 Module 两个概念.And ...

  3. Binary Tree Postorder Traversal leetcode java

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  4. javascript制作公式编辑器,函数编辑器和图形绘制

    自己是电子信息方向的,因此总是需要处理大量的电路实验.电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了. ...

  5. windows CMD命令查看局域网内所有主机名及IP

    COLOR 0A CLS @ECHOOff Title查询局域网内在线电脑IP :send @ECHO off&setlocal enabledelayedexpansion ECHO 正在获 ...

  6. SharePoint 2013网站突然不能登录了。

    SharePoint 2013网站突然不能登录了,访问的时候,总是报错: The list has not shared with you.   原因: 原来我不知道什么时候把web applicat ...

  7. Endv 博客简介

    Endv 博客简介 此博客收集了 C++.Android.C#.java.php 等优秀的开源项目, 同时也对 Windows.Linux.CentOS 等系列操作系统的开发环境.办公环境的配置写了一 ...

  8. Windows 抓取本地环路包

    1.cmd,ipconfig查看自己的ip地址. 2.执行命令:route add 10.36.65.89 mask 255.255.255.255 10.36.65.1 metric 1,其中10. ...

  9. C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程

    双击执行一个EXE程序,会有两个进程,程序关闭之后,貌似只能关闭你的程序,附加的vshost.exe仍然存在   在调试页面,改成release,同时取消最后一项启用承载进程   在生成页面,将高级选 ...

  10. 翻译记忆软件-塔多思TRADOS经典教程_1

    窗体顶端 网络上关于TRADOS使用的文章很多,但大多数内容涉及的内容都过于广泛,刚准备上手的同行们看了总会觉得不知所云,无从下手.笔者自己也在自学阶段遇到不少麻烦.经过长期的使用和琢磨,终于写了短文 ...