介绍使用winmm.h进行音频流的获取

 

首先需要包含以下引用对象

#include <Windows.h>
#include "mmsystem.h"
#pragma comment(lib, "winmm.lib")

音频的获取需要调用7个函数

1. waveInGetNumDevs:返回系统中就绪的波形声音输入设备的数量

UINT waveInGetNumDevs(VOID);

2. waveInGetDevCaps:检查指定波形输入设备的特性

MMRESULT waveInGetDevCaps(
UINT_PTR uDeviceID,
LPWAVEINCAPS pwic,
UINT cbwic
);
//uDeviceID 音频输入设备标识,也可以为一个打开的音频输入设备的句柄.
// 个人认为如果上一步获得了多个设备,可以用索引标识每一个设备.
//
//pwic 对WAVEINCAPS结构体的一个指针,包含设备的音频特性.
//
//cbwic WAVEINCAPS结构体的大小,使用sizeof即可.
//
//MMRESULT 函数执行的结果
// MMSYSERR_NOERROR 表示执行成功
// MMSYSERR_BADDEVICEID 索引越界
// MMSYSERR_NODRIVER 没有就绪的设备
// MMSYSERR_NOMEM 不能分配或者锁定内存

 介绍WAVEINCAPS结构体的含义

typedef struct {
WORD wMid; //音频设备制造商定义的驱动程序标识
WORD wPid; //音频输入设备的产品标识
MMVERSION vDriverVersion; //驱动程序版本号
TCHAR szPname[MAXPNAMELEN];//制造商名称
DWORD dwFormats; //支持的格式,参见MSDN
WORD wChannels; //支持的声道数
WORD wReserved1; //保留参数
} WAVEINCAPS;

3. waveInOpen:打开指定的音频输入设备,进行录音

MMRESULT waveInOpen(
LPHWAVEIN phwi, //接收打开的音频输入设备标识的HWAVEIN结构的指针
UINT_PTR uDeviceID, //指定一个需要打开的设备标识.可以使用WAVE_MAPPER选择一个按指定录音格式录音的设备
LPWAVEFORMATEX pwfx, //一个所需的格式进行录音的WAVEFORMATEX结构的指针
DWORD_PTR dwCallback, //指向一个回调函数、事件句柄、窗口句柄、线程标识,对录音事件进行处理.
DWORD_PTR dwCallbackInstance, //传给回调机制的参数
DWORD fdwOpen //打开设备的方法标识,指定回调的类型.参见CSDN
);

介绍WAVEFORMATEX结构体的含义

typedef struct {
WORD wFormatTag; 大专栏  Jackie's blog //波形声音的格式,单声道双声道使用WAVE_FORMAT_PCM.当包含在WAVEFORMATEXTENSIBLE结构中时,使用WAVE_FORMAT_EXTENSIBLE.
WORD nChannels; //声道数量
DWORD nSamplesPerSec; //采样率.wFormatTag为WAVE_FORMAT_PCM时,有8.0kHz,11.025kHz,22.05kHz,和44.1kHz.
DWORD nAvgBytesPerSec; //每秒的采样字节数.通过nSamplesPerSec * nChannels * wBitsPerSample / 8计算
WORD nBlockAlign; //每次采样的字节数.通过nChannels * wBitsPerSample / 8计算
WORD wBitsPerSample; //采样位数.wFormatTag为WAVE_FORMAT_PCM时,为8或者16
WORD cbSize; //wFormatTag为WAVE_FORMAT_PCM时,忽略此参数
} WAVEFORMATEX;

介绍dwCallback回调函数格式

void CALLBACK waveInProc(
HWAVEIN hwi, //回调此函数的设备句柄
UINT uMsg, //波形声音输入信息,标识关闭(WIM_CLOSE)、缓冲区满(WIM_DATA)、打开(WIM_OPEN).
DWORD_PTR dwInstance, //用户在waveInOpen指定的数据
DWORD_PTR dwParam1, //(LPWAVEHDR)dwParam1,用户指定的缓冲区
DWORD_PTR dwParam2
);

4. waveInPrepareHeader:为音频输入设备准备一个缓冲区

MMRESULT waveInPrepareHeader(
HWAVEIN hwi, //音频输入设备句柄
LPWAVEHDR pwh,//指向WAVEHDR结构的指针,标识准备的缓冲区
UINT cbwh //WAVEHDR结构的大小,使用sizeof即可
);

介绍WAVEHDR结构

typedef struct wavehdr_tag {
LPSTR lpData; //指向波形格式的缓冲区
DWORD dwBufferLength; //缓冲区的大小
DWORD dwBytesRecorded; //当前存储了多少数据
DWORD_PTR dwUser; //用户数据
DWORD dwFlags; //为缓冲区提供的信息,在waveInPrepareHeader函数中使用WHDR_PREPARED
DWORD dwLoops; //输出时使用,标识播放次数
struct wavehdr_tag * lpNext;//reserved
DWORD_PTR reserved; //reserved
} WAVEHDR, *LPWAVEHDR;

5. waveInAddBuffer:将缓冲区发送给设备,若缓冲区填满,则不起作用。(参数同上)

MMRESULT waveInAddBuffer(
HWAVEIN hwi,
LPWAVEHDR pwh,
UINT cbwh
);

6. waveInStart:开始进行录制

MMRESULT waveInStart(
HWAVEIN hwi //设备句柄
);

7. waveInClose:关闭设备

MRESULT waveInClose(
HWAVEIN hwi //设备句柄
);

 如下示例:

http://download.csdn.net/detail/long7782/7771019

 

Jackie's blog的更多相关文章

  1. 日向blog开发记录

    一点历史关于,Sonne Blog 2016.03.25springmvc + hibernate框架搭建.2016.04.21日向blog首页.2016.04.24分页实现.2016.04.30登录 ...

  2. blog (后续更新)

    设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...

  3. tensorflow 一些好的blog链接和tensorflow gpu版本安装

    pading :SAME,VALID 区别  http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...

  4. http://blog.csdn.net/java2000_wl/article/details/8627874

    http://blog.csdn.net/java2000_wl/article/details/8627874

  5. [Android Pro] http://blog.csdn.net/wuyinlei/article/category/5773375

    http://blog.csdn.net/wuyinlei/article/category/5773375

  6. android 蓝牙 http://blog.csdn.net/u012843100/article/details/52384219

    http://blog.csdn.net/u012843100/article/details/52384219

  7. 【三】用Markdown写blog的常用操作

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  8. django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

    前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...

  9. 使用Hexo搭建专属Blog

    喜欢折腾的自己最开始在博客园有仿写几篇Blog,虽也可以自己改变风格,可是到底不是独立的一块儿地方,要知道独立的才是自己的;有属于自己独立的域名和Blog,真真是一件很爽的存在.在各种大牛的分享下在G ...

随机推荐

  1. Matlab高级教程_第四篇:Matlab高级函数_关键词:drawnow,addpoints,animatedline,getpoints

    0. MATLAB真实航母基本的工具,其中的函数/工具不计其数,而且有些函数/工具非常的炫酷.在MATLAB第四篇章把平时工作中用到的些许函数进行使用的讲解 主题1.:drawnow 解释:更新图窗并 ...

  2. Spring集成MyBatis配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  3. 6.windows-oracle实战第六课 --数据管理

    数据库管理员: 每个oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分担不同的管理职责. 对于dba来说,会权限管 ...

  4. Pytorch——BERT 预训练模型及文本分类

    BERT 预训练模型及文本分类 介绍 如果你关注自然语言处理技术的发展,那你一定听说过 BERT,它的诞生对自然语言处理领域具有着里程碑式的意义.本次试验将介绍 BERT 的模型结构,以及将其应用于文 ...

  5. UML-如何迭代

    未完待续...

  6. 缩写: i = i + 1 和 i += 1,可以看做是 i 自加的值 是1。

    i +=  1; 这样有助于记忆: i自加的值等于1

  7. dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性

    dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性 分类: Java2011-06-03 16:14 976人阅读 评论(0) 收藏 举报 xml扩展语言 今天在开发sitemap地 ...

  8. TCP、UDP、HTTP与HTTPS

    TCP.UDP.HTTP与HTTPS都是通信协议,在这里首先先介绍一下什么是通信协议. 什么是通信协议? 通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循 ...

  9. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码

    iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮.... 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨 ...

  10. Learn Git Lesson06 - 分离头指针

    ============== 知识点 分离头指针 HEAD 含义 git diff 分离头指针 (Detached HEAD) 有时候想尝试性修改某些内容(实验),也许并不会真的提交到分支,这时候可以 ...