windows下使用waveOut播放音频pcm

article/2025/11/9 11:34:03

目录

一、前言

二、waveOut主要API介绍

三、waveOut播放PCM音频框架

《Windows平台使用waveOut播放PCM数据代码实现》链接:

https://edu.csdn.net/learn/38258/606147?spm=1003.2001.3001.4157

一、前言

       在<windows下directShow音视频采集>一篇文章中就介绍了windows下通过directShow音视频采集的流程。windows下directShow不仅可以对音进行采也可以对音频进行播放,但是directShow使用过程较为复杂,所以本文将介绍windows下使用WAVE播放音频的过程。在微软的官方SDK文档说明中就对WAVE播放音频的API做了详细的介绍,连接为<wave播放音频的API介绍>。

二、waveOut主要API介绍

1、waveOutOpen()

        waveOutOpen函数的详细定义如下,该函数用于打开用于播放音频的输出设备。

MMRESULT waveOutOpen(LPHWAVEOUT      phwo,UINT            uDeviceID,LPCWAVEFORMATEX pwfx,DWORD_PTR       dwCallback,DWORD_PTR       dwInstance,DWORD           fdwOpen
);

     参数是phwo是存放wave音频输出设备的句柄的指针;

     参数uDeviceID是wave设备标识ID,当参数为WAVE_MAPPER时候标识可以播放给定格式的音频数据。

    参数pwfx用于设置要播放的音频数据格式。其结构体类型WAVEFORMATEX定义如下。

typedef struct tWAVEFORMATEX
{WORD        wFormatTag;         /* format type */WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */DWORD       nSamplesPerSec;     /* sample rate */DWORD       nAvgBytesPerSec;    /* for buffer estimation */WORD        nBlockAlign;        /* block size of data */WORD        wBitsPerSample;     /* number of bits per sample of mono data */WORD        cbSize;             /* the count in bytes of the size of *//* extra information (after cbSize) */
} WAVEFORMATEX;

      参数dwCallback用于指定回调的机制;当前支持的回调机制包含如下;

指向回调函数的指针A pointer to a callback function
窗口的句柄A handle to a window
线程标识符A thread identifier
事件的句柄A handle to an event
值为 NULLNULL

     参数dwInstance用于传递给回调机制的用户实例数据。

     参数fdwOpen用于打开设备的标志。其值如下(部分)

Value含义
CALLBACK_EVENTdwCallback 参数是事件句柄。
CALLBACK_FUNCTIONdwCallback 参数是回调过程地址。
CALLBACK_NULL无回调机制。 这是默认设置。
CALLBACK_THREADdwCallback 参数是线程标识符。
CALLBACK_WINDOWdwCallback 参数是窗口句柄。

2、waveOutPrepareHeader()

      waveOutPrepareHeader函数的定义如下,该函数用于准备wave音频数据块以供播放。

MMRESULT waveOutPrepareHeader(HWAVEOUT  hwo,LPWAVEHDR pwh,UINT      cbwh
);

      参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。

      参数pwh指向要发送的音频数据。其结构体定义如下。

/* wave data block header */
typedef struct wavehdr_tag {LPSTR       lpData;                 /* pointer to locked data buffer */DWORD       dwBufferLength;         /* length of data buffer */DWORD       dwBytesRecorded;        /* used for input only */DWORD_PTR   dwUser;                 /* for client's use */DWORD       dwFlags;                /* assorted flags (see defines) */DWORD       dwLoops;                /* loop control counter */struct wavehdr_tag FAR *lpNext;     /* reserved for driver */DWORD_PTR   reserved;               /* reserved for driver */
} WAVEHDR;

       参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。

3、waveOutWrite()

       waveOutWrite函数的定义如下,该函数用于发送一个数据给音频播放设备。

MMRESULT waveOutWrite(HWAVEOUT  hwo,LPWAVEHDR pwh,UINT      cbwh
);

    参数hwo为wave音频输出设备的句柄,即waveOutOpen的第一个参数值。

    参数pwh指向要发送的音频数据。

    参数cbwh为WAVEHDR 结构的大小,通常取值为sizeof(WAVEHDR)。

  4、除了上诉三个API,在使用wave播放PCM音频还会用到CreateEvent、CloseHandle和WaitForSingleObject函数。CreateEvent用于创建事件。CloseHandle用于关闭事件。WaitForSingleObject用于观察线程信号状态,当线程信号状态为事件则返回;其定义如下

WaitForSingleObject(_In_ HANDLE hHandle,_In_ DWORD dwMilliseconds);

      参数hHandle为CreateEvent创建事件的句柄;

      参数dwMilliseconds为超时等待的参数。

5、waveOutClose(_In_ HWAVEOUT hwo)

     该函数用于关闭已经打开的wave音频播放设备。

     参数hwo为wave音频输出设备的句柄;

三、waveOut播放PCM音频框架


http://chatgpt.dhexx.cn/article/BREhtMws.shtml

相关文章

双缓冲方法实现waveOut的连续无卡顿播放以及即收即放

1. waveOut基本使用方法 waveOut是一套历史悠久的Windows音频API&#xff0c;虽然古老&#xff0c;但至今仍运行良好&#xff0c;且支持老旧系统&#xff08;原生支持Windows XP&#xff09;。 waveOut虽然不像DirectSound那样自带混音功能&#xff0c;但也可以通过同时开多个…

清华牛逼!

如果让你用尽可能多的词语形容一名女子的美貌&#xff0c;你会怎么说&#xff1f; “这女孩太美了&#xff0c;闭月羞花、沉鱼落雁不足以形容起美貌。那身段令貂婵蒙羞&#xff0c;那脸蛋令月亮失色。那眼睛&#xff0c;那鼻子&#xff0c;那小嘴&#xff0c;那胸脯&#xff0c…

博士申请 | 上海交通大学叶南阳老师招收计算机视觉/机器学习方向博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 上海交通大学 上海交通大学约翰霍普克罗夫特计算机科学中心于 2017 年 1 月正式成立&#x…

硬核实力!西安交大人工智能学科到底有多强?

人工智能 是时下最火的科技词汇之一 人工智能 作为引领未来的战略性技术 正默默改变着人类的生产生活 西安交大人工智能研究是国内高校的先驱 拥有强大的学术实力 科研成绩斐然 斩获国内外多项荣誉 今天 跟着小编一起走进交大人工智能 漫步科学殿堂 西安交通大学人工智能学科发…

清华大学交叉信息研究院姚班修改培养模式:姚班、智班、量信班全合并

机器之心报道 编辑&#xff1a;杜伟、泽南 拓宽优秀学生的选择方向。 清华大学交叉信息研究院宣布了优化本科培养模式的新计划&#xff1a; 为进一步拓宽学生基础学养&#xff0c;并优化专业方向选择&#xff0c;特调整本科生培养模式&#xff0c;具体要点如下&#xff1a; 1、…

我的2020推免之路:清叉、TBSI、贵系、中山、国防科大、自动化所

我的2020推免之路&#xff1a;清叉、TBSI、贵系、中山、国防科大、自动化所 一.前言二.个人情况三.夏令营清华大学交叉信息学院&#xff08;6.13~6.14&#xff09;清华-伯克利深圳学院&#xff08;7.2~7.9&#xff09;清华大学计算机系&#xff08;7.8~7.9&#xff09;中山大学…

清北浙交大比拼,南大强势上榜,AI到底哪家强?

作者 | 阿司匹林 编者注&#xff1a;近日&#xff0c;上海交通大学和武书连编制的两份比较有影响力的大学排行榜先后发布。这两份榜单的最终排名虽然存在一定的差异&#xff0c;但是都将清华大学、北京大学、浙江大学、上海交通大学、以及复旦大学排在了前五&#xff08;先后顺…

2022 ACM杰出会员揭榜:清华黄隆波、刘世霞,北大郝丹、刘譞哲等23位华人学者入选!...

来源&#xff1a;新智元 2022年度ACM杰出会员&#xff08;Distinguished Member&#xff09;名单公布&#xff01; 本次评选设有三个奖项&#xff0c;分别表彰在计算机领域做出的教育贡献、工程贡献和科学贡献。 今年共有67名会员入选。其中有23位是华人&#xff08;中国大陆6人…

科研实习 | 清华大学交叉信息研究院弋力老师课题组招收科研实习生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 清华大学 弋力博士于2021年7月加入清华大学交叉信息研究院任助理教授&#xff0c;博士生导师…

数说CS | 北大叉院推免生源大起底!

写在前面 北京大学前沿交叉学科研究院是怎样的一个存在&#xff1f;研究方向与其他学院有什么不同&#xff1f;学术氛围如何&#xff1f; 今天&#xff0c;岛主将会带领各位一同了解北大叉院&#xff0c;从学院介绍、培养特色、优营生源分析等板块为大家深入剖析&#xff01;…

北理工通报方岱宁院士处理结果

点击进入—>3D视觉工坊学习交流群 12月7日&#xff0c;北京理工大学发布《情况通报》&#xff0c;通报“教师方岱宁相关视频事件”处理结果。 据通报&#xff0c;经查核&#xff0c;视频内容是方岱宁今年7月初在线参加学术会议时发生的事情&#xff0c;因其行为失范&#xf…

2020cs线上保研之路 清华北大交大复旦自动化所计算所

2020计算机线上保研 清华北大交大复旦自动化所计算所 无聊在飞机上编辑的这几个月来的经历吧。我真的感觉好累&#xff0c;巨累。该死的疫情。 今年保研&#xff0c;往届的学长学姐的去路都没有什么参考性了&#xff0c;一个原因在于cs内卷更严重了&#xff0c;另一个因为疫情…

直播预告 | 清华叉院助理教授赵行、在读博士生孙桥:自动驾驶中的行为交互

本期为TechBeat人工智能社区第421期线上Talk&#xff0c;响应大家希望实时交流的需求&#xff0c;本次Talk是&#xff01;直&#xff01;播&#xff01; 北京时间7月13日(周三)20:00&#xff0c;我们很开心邀请到老朋友——清华叉院助理教授赵行老师和他的学生孙桥&#xff0c;…

清华大学交叉信息研究院招收计算机图形学、机器学习方向博士

来源&#xff1a;机器之心 课题组简介杜韬博士于 2022 年秋季加入清华大学交叉信息研究院担任助理教授&#xff0c;领导课题组开展计算机图形学和机器学习相关方向的研究。课题组常年招收博士生、科研助理、实习生、访问学生、助理研究员等&#xff0c;部分职位工作地点可选北京…

生源985占比100%,北大叉院这个专业本校学生也心仪~

1、院校介绍 北京大学前沿交叉学科研究院下的大数据研究中心是中国交叉学科的先锋&#xff0c;主要学科为数据科学&#xff0c;现设数据挖掘方法、大数据软件技术、大数据安全技术、健康医疗大数据以及交通大数据等9个研究方向。 北大叉院大数据研究中心科研实力强大&#xf…

【2019保研经验】清华贵系、清华软院、北大叉院、中科院自动化所等

2019年9月29日23点00分&#xff0c;我收到了清华大学计算机科学与技术系的待录取通知&#xff0c;也意味着我几个月的保研工作彻底结束&#xff0c;并且取得了我所能取得的最好成绩。如今&#xff0c;全部的保研工作已全部结束&#xff0c;我也是时候要摆脱懒惰的借口&#xff…

清华数据女神评选结果:第一竟然是叉院大神...?

在刚刚过去的3月7日女生节&#xff0c;清华学大数据的男生们发起了一个数据女神评选活动&#xff0c;希望在大家的参与下评选出数据女神&#xff0c;送上女生节的礼物。 今天是公布评选结果的时刻&#xff1a; 恭喜来自交叉信息研究院的陈立杰和来自美术学院的张玉萍同学成为我…

清华叉院弋力:从谷歌研究科学家到清华任教,我想看远一点

原来他们是这样走过来的&#xff01; 【AI红人荟】——这里是TechBeat人工智能社区为优秀的AI工作者开设的人物专访栏目。从膜拜“红人”到成为“红人”&#xff0c;TechBeat与你一起&#xff0c;在AI进阶之路上&#xff0c;升级打怪、完美通关~ 本篇人物——来自清华交叉信息研…

青源LIVE第29期|清华叉院高阳:使用1/500数据掌控Atari游戏-EfficientZero算法详解

当前强化学习已在许多应用中取得了巨大成功。但样本效率仍是强化学习中一个重大挑战&#xff0c;重要的方法需要数百万&#xff08;甚至数十亿&#xff09;的环境步骤来训练。虽然&#xff0c;当前在基于图像的样本高效RL算法方面取得了重大进展&#xff1b;但是&#xff0c;在…

修改windows系统的host文件

修改windows系统的host文件 最近要使用一款免费软件&#xff0c;所以用到修改该文件这一项。 遇到的问题 真正的修改是要对这个文件赋予高的权限&#xff0c;路径里面查找到该文件&#xff0c;C:\WINDOWS\system32\drivers\etc&#xff0c;点击host文件&#xff0c;点击属性…