使用WindowsAPI获取录音音频

严禁转载

介绍使用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;        //波形声音的格式,单声道双声道使用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

使用WindowsAPI获取录音音频

时间: 2024-08-03 13:26:57

使用WindowsAPI获取录音音频的相关文章

使用WindowsAPI播放PCM音频

这一篇文章同上一篇<使用WindowsAPI获取录音音频>原理具有相似之处,不再详细介绍函数与结构体的参数 1. waveOutGetNumDevs 2. waveOutGetDevCaps 3. waveOutOpen 回调函数 void CALLBACK PlayCallback(HWAVEOUT hwaveout, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2); 4. waveOutPrepareHeader 5

Java 获取amr音频格式的音频长度

import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class GetAmrDuration { /** * 得到amr的时长 * * @param file * @return * @throws IOException */ public static int getAmrDuration(File file) throws IOException { long du

H5录音音频可视化-实时波形频谱绘制、频率直方图

这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面这张就是测试Gif截图,看起来还算过得去,测试地址 上面这些波形.频率的计算和显示都是由纯js代码编写的,并未用到浏览器专有特性,因此可以方便的移植到其他语言实现,比如移植到Android.IOS原生实现. FrequencyHistogramView音频可视化频率直方图显示 此功能源码:frequ

[转]python使用ctypes模块调用windowsapi获取系统版本

#coding: utf-8 import win32ui import win32gui import win32con import win32api #https://mail.python.org/pipermail/python-win32/2009-April/009078.html ''' ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON) ico_y = win32api.GetSystemMetrics(win32con.

AudioRecord类获取录音音量分贝数

转自:http://www.jb51.net/article/64806.htm public class AudioRecordDemo {   private static final String TAG = "AudioRecord";   static final int SAMPLE_RATE_IN_HZ = 8000;   static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_

php实例-正则获取网站音频地址的实例(Listen to this 1)

主要用到了:file_get_contents();preg_match_all(); 这2个函数 查看地址:http://git.oschina.net/xiaoz6/phpExample

使用WindowsAPI实现播放PCM音频的方法

这篇文章主要介绍了使用WindowsAPI实现播放PCM音频的方法,很实用的一个功能,需要的朋友可以参考下 本文介绍了使用WindowsAPI实现播放PCM音频的方法,同前面一篇使用WindowsAPI获取录音音频的方法原理具有相似之处,这里就不再详细介绍具体的函数与结构体的参数,相同的部分加以省略,只介绍主要的功能部分代码.如下所示: 1. waveOutGetNumDevs 2. waveOutGetDevCaps 3. waveOutOpen 回调函数: ? 1 void CALLBACK

微信小程序开发之录音机 音频播放 动画 (真机可用)

趁着周末用微信小程序做了个简易录音机.跟大家分享,欢迎批评! 老规矩,先几张图. 1.为了进来看得清楚.刚开始没有加载音频列表.代码往前挪一挪即可. 2.按住 录音按钮的时候会出现麦克风.中间的麦克风是个帧动画. 其实就是用js控制图片显示隐藏.没啥好说的.这里值得说一说的是录音.微信的录音API后,如果录音时间太短,会录音失败.所以fail的时候还是需要处理一下.录音时间的限制和微信语音是一样的.60秒. 3.我在录音完成后才加载列表. 下图就是从微信存储的文件里获取到的列表信息.有储存路径,

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音