Jackie's blog
介绍使用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的更多相关文章
- 日向blog开发记录
一点历史关于,Sonne Blog 2016.03.25springmvc + hibernate框架搭建.2016.04.21日向blog首页.2016.04.24分页实现.2016.04.30登录 ...
- blog (后续更新)
设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...
- tensorflow 一些好的blog链接和tensorflow gpu版本安装
pading :SAME,VALID 区别 http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...
- http://blog.csdn.net/java2000_wl/article/details/8627874
http://blog.csdn.net/java2000_wl/article/details/8627874
- [Android Pro] http://blog.csdn.net/wuyinlei/article/category/5773375
http://blog.csdn.net/wuyinlei/article/category/5773375
- android 蓝牙 http://blog.csdn.net/u012843100/article/details/52384219
http://blog.csdn.net/u012843100/article/details/52384219
- 【三】用Markdown写blog的常用操作
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5
前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...
- 使用Hexo搭建专属Blog
喜欢折腾的自己最开始在博客园有仿写几篇Blog,虽也可以自己改变风格,可是到底不是独立的一块儿地方,要知道独立的才是自己的;有属于自己独立的域名和Blog,真真是一件很爽的存在.在各种大牛的分享下在G ...
随机推荐
- 如何找到我的Python site-packages目录的位置?
来源:广州SEO 我如何找到我的site-packages目录的位置? #1楼 这对我有用: python -m site --user-site #2楼 从“如何安装Django”文档 (尽管这不仅 ...
- 903A. Hungry Student Problem#饥饿的学生(暴力&双层枚举)
题目出处:http://codeforces.com/problemset/problem/903/A 题目大意就是:一个数能否用正整数个另外两个数合成 #include<iostream> ...
- mqtt协议系统设计参考
作者:极寒链接:https://zhuanlan.zhihu.com/p/28525517来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 回顾自己的工作经历最遗憾的是没 ...
- itop4412开发版-安卓系统卸载默认apk使用文档
itop4412开发版的安卓系统默认不是最高权限,可以看见后面最后一个是$符号,如下图 1,所以 想我们需要进入 root 权限,可以看见后面最后一个是#符号,如下图所示.在这个变换中只需 要在超级终 ...
- 关于JDBC、JdbcTemplate使用遇到的坑
1.如果数据源是oracle(mysql结尾是可以使用";"的),sql字符串中结尾处禁止使用分号";",不然会报错:java.sql.SQLException ...
- 吴裕雄--天生自然C语言开发:指针
#include <stdio.h> int main () { int var1; ]; printf("var1 变量的地址: %p\n", &var1 ) ...
- 2017Google开发者大会
2017年12月14日有幸去上海跨国采购中心参加了2017Google开发者大会,这个大会有很多很有意思的展会以及技术分享.主题涵盖 Android.移动网络.Firebase.机器学习.云服务.AR ...
- RAID和LVM
EXT家族支持度最广,但创建文件系统慢修复慢存储容量有限 XFS同样是日志文件系统:容量大,支持大存储高性能,创建/修复文件系统快inode与block都是系统需要用到时,才动态配置产生 基本分区(静 ...
- Resin介绍及其使用配置
Resin介绍及其使用配置一 Resin是一个提供高性能的,支持 Java/PHP 的应用服务器.目前有两个版本:一个是GPL下的开源版本,提供给一些爱好者.开发人员和低流量网站使用:一种是收费的专业 ...
- 03 - CDH 6.3.x 安装
CDH 6.3.x 离线安装 环境 CDH 6.3.1 CentOS 7 官方文档 修改主机名,配置host文件 # 根据个人需要修改主机名称 hostnamectl set-hostname nod ...