当前位置: 首页 > news >正文

Windows波形音频MMEAPI简介

Windows波形音频MMEAPI简介

使用MMEAPI时需要导入头文件:#include<mmeapi.h>

mmeapi.h文件的主要内容

mmeapi.h 文件是 Windows 多媒体 API 的一部分,主要用于处理波形音频(Waveform Audio)的输入和输出。以下是该文件的主要内容和功能:

  1. 错误返回值
    定义了一些波形音频操作的错误返回值,例如:
  • WAVERR_BADFORMAT:不支持的波形格式。
  • WAVERR_STILLPLAYING:仍有音频在播放。
    • WAVERR_UNPREPARED:音频头未准备好。
    • WAVERR_SYNC:设备是同步的。
  1. 数据类型
    定义了一些与波形音频相关的数据类型,例如:
    • HWAVE、HWAVEIN、HWAVEOUT:波形音频设备的句柄。
    • WAVECALLBACK:波形音频回调函数类型。

  2. 回调消息
    定义了一些波形音频设备的回调消息,例如:
    • WOM_OPEN、WOM_CLOSE、WOM_DONE:波形输出设备的回调消息。
    • WIM_OPEN、WIM_CLOSE、WIM_DATA:波形输入设备的回调消息。

  3. 设备 ID
    定义了波形设备映射器的设备 ID:
    • WAVE_MAPPER:用于波形设备映射器的设备 ID。

  4. 标志
    定义了一些用于 waveOutOpen 和 waveInOpen 函数的标志,例如:
    • WAVE_FORMAT_QUERY:查询格式。
    • WAVE_ALLOWSYNC:允许同步。
    • WAVE_MAPPED、WAVE_FORMAT_DIRECT 等。

  5. 数据块头
    定义了波形数据块头的结构体 WAVEHDR,包括以下字段:
    • lpData:指向数据缓冲区的指针。
    • dwBufferLength:数据缓冲区的长度。
    • dwBytesRecorded:仅用于输入。
    • dwUser:供客户端使用。
    • dwFlags:各种标志。
    • dwLoops:循环控制计数器。
    • lpNext、reserved:保留给驱动程序使用。

  6. 设备能力结构
    定义了波形输出设备和输入设备的能力结构体,例如:
    • WAVEOUTCAPS、WAVEINCAPS:描述设备的能力,包括制造商 ID、产品 ID、驱动程序版本、支持的格式、通道数等。

  7. 标志字段
    定义了一些用于 WAVEHDR 和设备能力结构体的标志字段,例如:
    WHDR_DONEWHDR_PREPAREDWHDR_BEGINLOOPWHDR_ENDLOOPWHDR_INQUEUE:用于 WAVEHDR 的标志。
    WAVECAPS_PITCHWAVECAPS_PLAYBACKRATEWAVECAPS_VOLUMEWAVECAPS_LRVOLUMEWAVECAPS_SYNCWAVECAPS_SAMPLEACCURATE:用于设备能力结构体的标志。

使用 waveOutOpen 函数打开一个波形音频输出设备

以下是一个简单的示例,展示如何使用 waveOutOpen 函数打开一个波形音频输出设备:

#include <windows.h>
#include <mmeapi.h>void OpenWaveOutDevice() {HWAVEOUT hWaveOut;WAVEFORMATEX wfx;// 设置波形格式wfx.nSamplesPerSec = 44100; // 采样率wfx.wBitsPerSample = 16;    // 每个样本的位数wfx.nChannels = 2;          // 通道数(立体声)wfx.cbSize = 0;             // 额外信息的大小wfx.wFormatTag = WAVE_FORMAT_PCM; // PCM 格式wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) / 8;wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;// 打开波形音频输出设备if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) {// 处理错误}
}

使用 waveInOpen 函数打开一个波形音频输入设备

要使用 waveInOpen 函数打开一个波形音频输入设备,你需要按照以下步骤进行操作:

  1. 定义波形音频格式:使用 WAVEFORMATEX 结构体定义音频格式。
  2. 调用 waveInOpen 函数:传递设备句柄、设备 ID、音频格式、回调函数等参数。
    以下是一个示例,展示如何使用 waveInOpen 函数打开一个波形音频输入设备:
#include <windows.h>
#include <mmeapi.h>
#include <iostream>// 回调函数,用于处理音频输入事件
void CALLBACK WaveInProc(HWAVEIN hwi,UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2
) {switch (uMsg) {case WIM_OPEN:std::cout << "Wave input device opened." << std::endl;break;case WIM_CLOSE:std::cout << "Wave input device closed." << std::endl;break;case WIM_DATA:std::cout << "Wave input data received." << std::endl;break;}
}int main() {HWAVEIN hWaveIn;WAVEFORMATEX wfx;// 设置波形格式wfx.nSamplesPerSec = 44100; // 采样率wfx.wBitsPerSample = 16;    // 每个样本的位数wfx.nChannels = 2;          // 通道数(立体声)wfx.cbSize = 0;             // 额外信息的大小wfx.wFormatTag = WAVE_FORMAT_PCM; // PCM 格式wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) / 8;wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;// 打开波形音频输入设备MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)WaveInProc, 0, CALLBACK_FUNCTION);if (result != MMSYSERR_NOERROR) {std::cerr << "Failed to open wave input device." << std::endl;return 1;}std::cout << "Wave input device opened successfully." << std::endl;// 关闭波形音频输入设备waveInClose(hWaveIn);return 0;
}

WAVE_FORMAT常量解析:

#define WAVE_FORMAT_1M08      0x00000001       /* 11.025 kHz, Mono,   8-bit */
#define WAVE_FORMAT_1S08      0x00000002       /* 11.025 kHz, Stereo, 8-bit */
#define WAVE_FORMAT_1M16      0x00000004       /* 11.025 kHz, Mono,   16-bit */
#define WAVE_FORMAT_1S16      0x00000008       /* 11.025 kHz, Stereo, 16-bit */
#define WAVE_FORMAT_2M08      0x00000010       /* 22.05  kHz, Mono,   8-bit */
#define WAVE_FORMAT_2S08      0x00000020       /* 22.05  kHz, Stereo, 8-bit */
#define WAVE_FORMAT_2M16      0x00000040       /* 22.05  kHz, Mono,   16-bit */
#define WAVE_FORMAT_2S16      0x00000080       /* 22.05  kHz, Stereo, 16-bit */
#define WAVE_FORMAT_4M08      0x00000100       /* 44.1   kHz, Mono,   8-bit */
#define WAVE_FORMAT_4S08      0x00000200       /* 44.1   kHz, Stereo, 8-bit */
#define WAVE_FORMAT_4M16      0x00000400       /* 44.1   kHz, Mono,   16-bit */
#define WAVE_FORMAT_4S16      0x00000800       /* 44.1   kHz, Stereo, 16-bit */#define WAVE_FORMAT_44M08     0x00000100       /* 44.1   kHz, Mono,   8-bit */
#define WAVE_FORMAT_44S08     0x00000200       /* 44.1   kHz, Stereo, 8-bit */
#define WAVE_FORMAT_44M16     0x00000400       /* 44.1   kHz, Mono,   16-bit */
#define WAVE_FORMAT_44S16     0x00000800       /* 44.1   kHz, Stereo, 16-bit */
#define WAVE_FORMAT_48M08     0x00001000       /* 48     kHz, Mono,   8-bit */
#define WAVE_FORMAT_48S08     0x00002000       /* 48     kHz, Stereo, 8-bit */
#define WAVE_FORMAT_48M16     0x00004000       /* 48     kHz, Mono,   16-bit */
#define WAVE_FORMAT_48S16     0x00008000       /* 48     kHz, Stereo, 16-bit */
#define WAVE_FORMAT_96M08     0x00010000       /* 96     kHz, Mono,   8-bit */
#define WAVE_FORMAT_96S08     0x00020000       /* 96     kHz, Stereo, 8-bit */
#define WAVE_FORMAT_96M16     0x00040000       /* 96     kHz, Mono,   16-bit */
#define WAVE_FORMAT_96S16     0x00080000       /* 96     kHz, Stereo, 16-bit */
  • WAVE_FORMAT_ 后跟采样率(如 1 表示 11.025 kHz,2 表示 22.05 kHz,4 表示 44.1 kHz,48 表示 48 kHz,96 表示 96 kHz)。
  • M 表示单声道(Mono),S 表示立体声(Stereo)。
  • 数字 08 表示 8 位深度,16 表示 16 位深度。
    例如,WAVE_FORMAT_44S16 表示 44.1 kHz 采样率、立体声、16 位深度的音频格式。

相关文章:

Windows波形音频MMEAPI简介

Windows波形音频MMEAPI简介 使用MMEAPI时需要导入头文件&#xff1a;#include<mmeapi.h> mmeapi.h文件的主要内容 mmeapi.h 文件是 Windows 多媒体 API 的一部分&#xff0c;主要用于处理波形音频&#xff08;Waveform Audio&#xff09;的输入和输出。以下是该文件的…...

sklearn聚类算法用于图片压缩与图片颜色直方图分类

上期文章:机器学习之SKlearn(scikit-learn)的K-means聚类算法 我们分享了sklearn的基本知识与基本的聚类算法,这里主要是机器学习的算法思想,前期文章我们也分享过人工智能的深度学习,二者有如何区别,可以先参考如下几个实例来看看机器学习是如何操作的 不同K值下的聚…...

Llama 3.1要来啦?!测试性能战胜GPT-4o

哎呀&#xff0c;Meta声称将于今晚发布的Llama 3.1&#xff0c;数小时前就在Hugging Face上泄露出来了&#xff1f;泄露的人很有可能是Meta员工&#xff1f; 还是先来看泄露出来的llama3.1吧。新的Llama 3.1模型包括8B、70B、405B三个版本。 而经过网友测试&#xff0c;该base…...

C++使用opencv处理图像阴影部分

1. 直方图均衡化 直方图均衡化是一种增强图像对比度的方法&#xff0c;可以通过均衡化图像的灰度级分布来改善图像中阴影部分的亮度。 #include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取图像Mat image imread("input_image.jpg", IMREA…...

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类&#xff0c;可以将多个对象封装到一个对象&#xff08;bean&#xff09;中。特点是可序列化&#xff0c;提供无参构造器&#xff0c;提供getter方法和setter方法访问对象的属性。名称中…...

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试&#xff08;6&#xff09;主从简单测试 mysql -u etc -p 1234aA~1 参考&#xff1a; centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库&#xff1a;主从复制与读写分离 https://blog.csd…...

信息安全工程师题

防火墙安全策略有两种类型&#xff1a;白名单策略、黑名单策略白名单策略&#xff1a;只允许符合安全规则的包通过防火墙&#xff0c;其他通信包禁止黑名单策略&#xff1a;禁止与安全规则相冲突的包通过防火墙&#xff0c;其他通信包允许实现网络地址转换的方式主要有静态NAT、…...

springcloud rocketmq 新增的消费者组从哪里开始消费

如果新建一个新的消费者组&#xff0c;是否会消费历史消息&#xff0c;导致重复消费&#xff1f; 直接在 console 界面新增消费者组&#xff0c;但是没有办法绑定订阅关系&#xff0c;没有找到入口&#xff0c;在 控制台项目源码 rocketmq-externals 也没有找到可以确定订阅关系…...

Redis-缓存

什么是缓存&#xff1f; 缓存就像自行车和越野车的避震器&#xff0c;降低硬着陆造成的损害 缓存就是系统的避震器&#xff0c;,防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数…...

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…...

[C++][STL源码剖析] 详解AVL树的实现

目录 1.概念 2.实现 2.1 初始化 2.2 插入 2.2.1 旋转&#xff08;重点&#xff09; 左单旋 右单旋 双旋 2.❗ 双旋后&#xff0c;对平衡因子的处理 2.3 判断测试 完整代码&#xff1a; 拓展&#xff1a;删除 1.概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但…...

Kubernetes存储 - Node本地存储卷

官方文档 Kubernetes管理的Node本地存储目前有三种&#xff0c;分别是EmptyDir,HostPath,Local&#xff0c;EmptyDir是一种与Pod同生命周期的Node临时存储&#xff1b;HostPath是Node的目录&#xff1b;Local是基于持久卷(PV)管理的Node目录。接下来详细说明这几种类型如何以存…...

Cocos Creator2D游戏开发-(2)Cocos 常见名词

场景&#xff08;Scene): 它一个容器&#xff0c;容纳游戏中的各个元素&#xff0c;如精灵&#xff0c;标签&#xff0c;节点对象。它负责着游戏的运行逻辑&#xff0c;以帧为单位渲染这些内容。就是你理解到的那个场景; 个人理解就是一个画面, 一个游戏不同的关卡,会有不同的…...

【不同设备间的数据库连接】被连接设备如何开权限给申请连接的设备

为了方便叙述&#xff0c;简称申请连接数据库的设备为a&#xff0c;被连接的为b 1.确保在同一局域网下&#xff0c;检查a的ip 如果你设置的动态ip&#xff0c;那么每重启一次这个ip都会变。两种选择&#xff0c;每次都给b同步一下你的最新ip&#xff0c;或者a设置成静态ip。具…...

Whisper离线部署问题处理

Whisper是OpenAI开发一款开源语音识别模型&#xff0c;可以帮我们低成本的拥有语音识别的能力。具体的安装部署方法&#xff0c;我在这里就不详细说了&#xff0c;网上有很多相关文章&#xff1a; 使用OpenAI的Whisper 模型进行语音识别 (baidu.com) 我这里主要想说的是&…...

【Hive SQL】数据探查-数据抽样

文章目录 数据随机抽样1、随机数排序抽样&#xff08;rand()&#xff09;2、数据块抽样&#xff08;tablesample()&#xff09;3、分桶抽样 数据随机抽样 在大规模数据量的数据分析及建模任务中&#xff0c;往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源&#xff0c…...

微信答题小程序产品研发-需求分析与原型设计

欲知应候何时节&#xff0c;六月初迎大暑风。 我前面说过&#xff0c;我决意仿一款答题小程序&#xff0c;所以我做了大量的调研。 题库软件产品开发不仅仅是写代码这一环&#xff0c;它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 需求分析…...

基础模板Mybatis-plus+Springboot+Mysql开发配置文件

1.pom.xml <dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>// mybatisplus功能<dependency&g…...

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…...

LeetCode707 设计链表

前言 题目&#xff1a; 707. 设计链表 文档&#xff1a; 代码随想录——设计链表 编程语言&#xff1a; C 解题状态&#xff1a; 代码功底不够&#xff0c;只能写个大概 思路 主要考察对链表结构的熟悉程度&#xff0c;对链表的增删改查&#xff0c;比较考验代码功底以及对链表…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...