C++和Win32实现录音器功能
来源:互联网 发布:java 最简单的小游戏 编辑:程序博客网 时间:2024/04/30 06:33
最近在学习的过程中要求写一个录音器的小demo,在网上找了好多资料发现都写得不完整,或者是简单地对函数的介绍,或者使用的MFC,或者只有部分代码片段。这对初学者造成了很大的学习困难和困惑。近日我想把我写的一个录音器程序贴到网上,希望更多地读者能够看到,学到。避免我曾经的困难疑惑。
WORD wFormatTag; //波形声音的格式,单声道双声道使用WAVE_FORMAT_PCM.当包含在WAVEFORMATEXTENSIBLE结构中时,使用WAVE_FORMAT_EXTENSIBLE. WORD nChannels; //声道数量 DWORDnSamplesPerSec; //采样率.wFormatTag为WAVE_FORMAT_PCM时,有8.0kHz,11.025kHz,22.05kHz,和44.1kHz. DWORDnAvgBytesPerSec; //每秒的采样字节数.通过nSamplesPerSec* nChannels * wBitsPerSample / 8计算 WORD nBlockAlign; //每次采样的字节数.通过nChannels* wBitsPerSample / 8计算 WORD wBitsPerSample; //采样位数.wFormatTag为WAVE_FORMAT_PCM时,为8或者16 WORD cbSize; //wFormatTag为WAVE_FORMAT_PCM时,忽略此参数
HWAVEIN hwi, //回调此函数的设备句柄 UINT uMsg, //波形声音输入信息,标识关闭(WIM_CLOSE)、缓冲区满(WIM_DATA)、打开(WIM_OPEN). DWORDdwInstance, //用户在waveInOpen指定的数据 DWORD dwParam1, //(LPWAVEHDR)dwParam1,用户指定的缓冲区 DWORD dwParam2 //(LPWAVEHDR)dwParam2,用户指定的缓冲区
LPSTR lpData; //指向波形格式的缓冲区 DWORD dwBufferLength; //缓冲区的大小 DWORD dwBytesRecorded; //当前存储了多少数据 DWORD dwUser; //用户数据 DWORD dwFlags; //为缓冲区提供的信息,在waveInPrepareHeader函数中使用WHDR_PREPARED DWORD dwLoops; //输出时使用,标识播放次数 struct wavehdr_tag *lpNext; //reserved DWORD reserved; //reserved
HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh
HWAVEIN hwi //设备句柄
HWAVEIN hwi //设备句柄
一. 首先需要包含以下引用对象
#include "windows.h"
#include "mmsystem.h"
#pragma comment(lib, "winmm.lib")
二. 音频获取需要调用7个函数
1. waveInGetNumDevs:返回系统中就绪的波形声音输入设备的数量
UINT waveInGetNumDevs(VOID);
2. waveInGetDevCaps:检查指定波形输入设备的特性
MMRESULTwaveInGetDevCaps(
UINTuDeviceID, //uDeviceID音频输入设备标识,也可以为一个打开的音频输入设备的句柄.// 个人认为如果上一步获得了多个设备,可以用索引标识每一个设备.
LPWAVEINCAPSpwic, //pwic对WAVEINCAPS结构体的一个指针,包含设备的音频特性.
UINT cbwic );//cbwicWAVEINCAPS结构体的大小,使用sizeof即可.
//MMRESULT 函数执行的结果
// MMSYSERR_NOERROR 表示执行成功
// MMSYSERR_BADDEVICEID 索引越界
// MMSYSERR_NODRIVER 没有就绪的设备
// MMSYSERR_NOMEM 不能分配或者锁定内存
介绍WAVEINCAPS结构体的含义:
typedef struct {
WORD wMid;
//音频设备制造商定义的驱动程序标识
WORD wPid;
//音频输入设备的产品标识
MMVERSION vDriverVersion;
//驱动程序版本号
CHAR szPname[MAXPNAMELEN];
//制造商名称
DWORD dwFormats;
//支持的格式,参见MSDN
WORD wChannels;
//支持的声道数
WORD wReserved1;
//保留参数
} WAVEINCAPS;
3. waveInOpen:打开指定的音频输入设备,进行录音
MMRESULT waveInOpen(
LPHWAVEIN phwi,
//接收打开的音频输入设备标识的HWAVEIN结构的指针
UINT uDeviceID,
//指定一个需要打开的设备标识.可以使用WAVE_MAPPER选择一个按指定录音格式录音的设备
LPWAVEFORMATEX pwfx,
//一个所需的格式进行录音的WAVEFORMATEX结构的指针
DWORD dwCallback,
//指向一个回调函数、事件句柄、窗口句柄、线程标识,对录音事件进行处理.
DWORD dwCallbackInstance,
//传给回调机制的参数
DWORD fdwOpen );
//打开设备的方法标识,指定回调的类型.参见CSDN
介绍WAVEFORMATEX结构体的含义:
typedef struct{
}WAVEFORMATEX;
介绍dwCallback回调函数格式:
void CALLBACK waveInProc(
);
4.waveInPrepareHeader:为音频输入设备准备一个缓冲区
MMRESULT waveInPrepareHeader(
HWAVEIN hwi,
//音频输入设备句柄
LPWAVEHDR pwh,
//指向WAVEHDR结构的指针,标识准备的缓冲区
UINT cbwh );
//WAVEHDR结构的大小,使用sizeof即可
介绍WAVEHDR结构:
typedef struct {
} WAVEHDR;
5. waveInAddBuffer:将缓冲区发送给设备,若缓冲区填满,则不起作用。(参数同上)
MMRESULT waveInAddBuffer(
);
6. waveInStart:开始进行录制
MMRESULT waveInStart(
);
7. waveInClose:关闭设备
MMRESULT waveInClose(
);
三. 完整的代码
由于所写字符串超过了新浪博客的最长字符,所以只能把代码转接到其他地方,这里有代码已经写好的代码:http://blog.sina.com.cn/s/blog_149e9d2ec0102wyyw.html
阅读全文
0 0
- C++和Win32实现录音器功能
- 纯win32实现录音器并播放功能
- c语言实现录音功能
- Android简易录音器——实现录音和播放功能
- 使用J2ME实现拍照和录音功能
- java实现录音功能
- iOS实现录音功能
- android实现录音功能
- unity实现录音功能
- 安卓仿微信录音功能实现
- qt实现录音功能
- ios录音功能实现
- 安卓仿微信录音功能实现
- Smobiler实现录音和录音播放、调用通讯录功能(开发日志九)
- ios录音功能的实现
- iOS 录音功能的实现
- ios录音功能的实现
- MediaRecorder实现手机录音功能
- 数据结构之二叉查找树
- java开发 第三方支付 接口
- 补6月22日
- 【神经网络与深度学习】Win10+VS2015 caffe环境搭建(极其详细)
- 控制系统分析和校正要点
- C++和Win32实现录音器功能
- Codeforces 5C Longest Regular Bracket Sequence 题解
- hdu5583_Kingdom of Black and White_思维
- Python: import numpy 报错
- 自制miniwol程序
- android app自动更新
- 解决页面刷新密码变没的问题
- 【神经网络与深度学习】【CUDA开发】服务器(多GPU)caffe安装和编译
- 6月23日