WINDOWS下对音频的处理过程

音频采集-windows采集-----04-----obs源码wasapi模块分析 WASAPISource类支持采集扬声器和麦克风。Input,其中:● Input:代表采集麦克风。● DeviceOutput:采集电脑的扬声器。● ProcessOutput:暂未研究。可以先忽略。在下面分析obs的WASAPISource类时,我们以采集扬声器即SourceType=DeviceOutput,并且以线程采集为例进行讲解。 阅读详情

WINDOWS下对音频的处理,大致可分为两部分,即音频的输入、输出,和ACM压缩处理。

  一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个WAV文件,但那显然不是我们需要做的。必须能够直接对音频数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以waveIn和waveOut开头的一组API就是干这个的。

  先说输入吧。常用的相关API为waveInOpen(打开一个音频输入设备)、waveInPrepareHeader(为一个即将在waveInAddBuffer中调用的输入缓冲区准备头部)、waveInAddBuffer(添加一个输入用的数据缓冲区)、 waveInStart(开始录音)、waveInClose(关闭音频输入设备)等几个,以及需要在waveInOpen中指定的一个回调函数或者线程,其作用是在一个数据缓冲区被录满后被调用,以对这些数据进行处理,和其他一些相关的操作。

  首先你得确定一下需要用什么回调方式,即在某个时间片的音频数据被录完后,Windows将通过这个回调来激活对这些数据的处理过程,一般用到的无非是FUNCTION、THREAD和EVENT这几类,而比较方便简单的就是FUNCTION和THREAD了。FUNCTION方式是指Windows会调用你这个函数,而THREAD则是由 Windows来激活你所指定的线程。这些都在waveInOpen中指定。其函数原型为:

MMRESULT waveInOpen( LPHWAVEIN phwi,
UINT uDeviceID,
LPWAVEFORMATEX pwfx,
DWORD dwCallback,
DWORD dwCallbackInstance,
DWORD fdwOpen
);

  其中:phwi是返回的句柄存放地址,uDeviceID是要打开的音频设备ID号,一般都指定为WAVE_MAPPER。 dwCallback则为指定的回调函数或线程等的地址,fdwOpen指定回调方式,dwCallbackInstance为需要向回调 函数或线程送入的用户参数。至于那个pwfx,则比较关键,它指定了要以什么音频格式打开音频输入设备, 它是一个结构WAVEFORMATEX:
typedef struct { WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
  机器上的WIN9X安装时选择了音频压缩,可以在wFormatTag中指定一些压缩的音频格式,如G723.1,TURE DSP,等之类。不过一般都是选用WAVEFORMAT_PCM格式,即未压缩的音频格式,至于压缩,可以在录完后调用下面将要谈到的ACM单独进行。
  nChannels为声道数,1或者2。nSamplesPerSec为每秒采样数,8000、11025、22050、44100为几个标准值,其他的非标准值我倒没试过行不行。nAvgBytesPerSec为每秒平均的字节数,在PCM方式中就等于nChannels*nSamplesPerSec*wBitsPerSample/8,但对于其它的压缩的音频格式,由于很多压缩方式是按时间片进行的,如G723.1,就是以30ms为一个压缩单位,这样,nAvgBytesPerSec只是一个大概的数字,并不准确,程序中的计算是不应该以这个量为准的。这一点在下面的压缩音频输出和ACM音频压缩中非常重要。nBlockAlign是一个比较特殊的值,表示对音频处理时的最小处理单位,对于PCM非压缩,它就是wBitsPerSample*nChannels/8,而对于非压缩格式,则表示压缩/解压处理的最小单位了,如G723.1,就是30ms的数据大小(20bytes或者24bytes)。wBitsPerSample就是每采样值的位数,8或者16。 cbSize则是表示该WAVEFORMATEX的结构在标准的头部之后还有多少字节数,对于很多非PCM的音频格式,有一些自己的定义格式参数,这些就紧跟在标准的WAVEFORMATEX后面,其大小就由cbSize指定。对于PCM格式而言,为0,或者忽略不检查。

  这样,指定了这些参数后,你应该就能够打开音频输入设备了。下面要做的事情就是准备几个用做录音的缓冲区。常准备多个缓冲区,并在回调中循环使用。另外,还得考虑好录得的音频数据放哪儿,比如一个临时文件,就得准备好文件的句柄。对于缓冲区,得使用waveInPerpareHeader准备一下头部,这个API比较简单,如果你是循环使用缓冲区,对每个缓冲区也只需要调用一次waveInPrepareHeader。

  一切准备好之后,就可以调用waveInAddBuffer和waveInStart开始录音了,只要你一调用这个waveInStart,录音就开始了,即使这个缓冲区录满之后你没有加入新的缓冲区进去,录音也不会停,只是这中间的语音数据全都丢了。当通过 waveInAddBuffer送入的缓冲区被录满后,Windows就会通过你在waveInOpen中指定的方式进行回调,在回调中把录好的语音数据取出来,并且,如果还想继续录音的话,得将下一个缓冲区添加进去。考虑到这个处理是有时间延迟的,而且音频对时间很敏感,一般都要先预加入若干个缓冲区,比如,一共定义了8个缓冲区,而为了保险起见,最好保证任一时刻至少有3个缓冲区可被录音使用,那么在开始录音时,则先加入4个缓冲区,然后在回调中,如果当前录好的缓冲区第n个,则对第(n+4)%8调用waveInAddBuffer,这时,还有第(n+1)%8,(n+2)%8, (n+3)%8这三个缓冲区可用,即基本上就可以保证所录得音频中不会有断开的间隔。

  想结束录音时,最好在waveInClose之前调用一下waveInReset,这样可以清掉尚在等待录音的缓冲区,同时在回调中还必须注意一下送入参数中的消息种类。

  音频输出部分相对简单一点。对应的API有waveOutOpen、waveOutPrepareHeader、waveOutWrite以及waveOutClose。如果希望直接输出压缩格式的音频的话,必须注意waveOutOpen中指定的音频格式参数。你必须很清楚这类格式的具体参数及其含义。不过,你可以通过下面说到的ACM(Audio Compress Manager)得到你需要的音频格式的具体参数,这个格式参数可以直接用于waveOutOpen。如同音频的输入,waveOutPrepareHeader也是必需的。waveOutWrite 则是填入输出缓冲区,为了避免间断,也应该保证某一时刻缓冲区队列中数目足够。

 

  如果安装WIN98时在附件中选择了音频压缩,那么机器上的ACM就可用了。ACM为Audio Compress Manager。 WIN98提供了一些常用的音频压缩算法程序包,供用户调用。可以通过ACM获得本机上所有的音频压缩驱动及其所支持的音频格式。不过,似乎不是每种ACM格式都能被调用来进行压缩,不过ACM中的压缩驱动大多都是针对语音频段,如果用来压缩频带较宽的音频,如音乐,则效果很差

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/vavale/articles/306481.aspx

音频文件的写入 音频文件读取与存储的话,目前有librosa,scipy.io.wavfile,soundfile,essentia其中前两者是一样的程序,sf的读取与写入只能是wav/ogg/flac的,最后一个库win安装失败,这个问题我给官方提过,服务器没有问题,我似乎记得win也安装成功过,现在看来需要运气(环境配置问题)。 可以采用librosa读取文件,然后scale到16bit数据,直接用sf写入... 阅读详情

相关推荐

Windows 7音频服务故障的全面修复指南

本文还有配套的精品资源,点击获取 简介:音频服务是Windows 7操作系统中管理声音输入输出的关键组件。本文提供了解决“音频服务未运行”问题的详细步骤,包括注册表修复、服务状态检查、驱动程序更新、系统还原和病毒扫描等方法。此外,还包含一个包含四个注册表文件的压缩包,这些文件用于恢复音频服务。用户通过遵循这些步骤,可以解决音频服务故障并恢复正常的音频功能。 1. ...

weixin_35728286的博客 2540

音频前处理基本概念

ES: Echo Suppresion EES: Enhanced Echo Suppresion AEC: Acoustic Echo Cancellation 声学回声消除。在一般的VOIP软件或视频会议系统中,假设我们只有A和B两个人在通话,首先,A的声音传给B,B然后用喇叭放出来,而这时B的MIC呢则会采集到喇叭放出来的声音,然后传回给A,如果这个传输的过程中时延足够大,A就会听到一个和自...

YouthDance 1879

waveInXXX 底层WINDOWS 语音 API实现录音与播放

VC 6 中使用waveInXXX 底层WINDOWS 语音 API实现录音与播放. waveInXXX可实现流控制,应用于 VOIP 的实时压缩

音频缓冲区的设置

设置音频数据捕获(capture)和提交(render)缓冲区的数值问题:    给音频信息的捕获和提交设置缓冲区数值.小一些的缓冲区会减少时钟周期,但是也会增加传输的次数.这些书只需要在不同的系统上测试.解决方案:   音频缓冲区控制(AudioBufferControl)包含于数据源(DataSource)和播放器(Player)中.捕获音频缓冲区数值(Capture Buff

netwarning的专栏 9808

AI 体验走查 - 火山引擎存储的 AI UX 探索之路

火山引擎存储技术团队驱动 AI 自主完成用户体验走查 / 可用性测试的执行与评价,帮助业务改善交互体验。 立项“故事走查”的背景诉求和 AI 机遇 如何搭建“AI 评价”能力,精准识别交互问题 让交互体验故事走查变为技术产品,讲解系统设计,包括流程、User Story 维护、框架和 AI 模型选型、Midscene.js 的集成技巧等

bytedanceospo的博客 2833

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 299

windows音频处理

 WINDOWS下对音频的处理过程WINDOWS下对音频的处理,大致可分为两部分,即音频的输入、输出,和ACM压缩处理。  一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个WAV文件,但那显然不是我们需要做的。必须能够直接对音频数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以waveIn和waveOut开头的一组API就是干这个的。

WhiteCloud的专栏 2791

GD32H7 SPI驱动实战:手把手教你用SPI3连接外部Flash(W25Q128)并实现读写

本文详细介绍了基于GD32H7系列MCU的SPI3接口驱动W25Q128外部Flash的全流程开发指南。从硬件设计、引脚配置到SPI3外设深度配置,再到底层通信函数实现和高级功能优化,提供了完整的解决方案。特别针对高速读取、DMA传输和信号完整性等关键环节进行了优化,确保系统在-40℃~85℃范围内稳定工作。

weixin_28729205的博客 379

MFC WAVE API 函数说明

http://www.cnblogs.com/del/category/123296.html Powered by Zoundry Raven

seven407的专栏 1166

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2924

永磁同步电机功率计算实战:从公式到避坑指南(附Excel计算模板)

本文详细解析永磁同步电机(PMSM)功率计算的实战技巧,涵盖三维参数体系、三相与单相系统差异、动态工况补偿及常见计算陷阱。特别提供Excel计算模板,帮助工程师快速准确完成功率计算,避免工业应用中的常见错误,提升工作效率。

x8y9z0的博客 802

Windows音频编程:Win32 Wave API 的使用

Windows音频编程:Win32 Wave API 的使用 2011-10-27 10:34 //Windows音频编程:Win32 Wave API 的使用 //下面是一个Win32控制台程序的源码,环境VS2008,新建一个空的Win32控制台项目,加入此文件编译即可,功能为录制5秒并回放。注意不要选择Unicode字符集,不然设备名会出现乱码。 //   //  W

星星之火,可以燎原!...... 1792

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

Windows 音频处理过程

WINDOWS下对音频的处理,大致可分为两部分,即音频的输入、输出,和ACM压缩处理。   一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个WAV文件,但那显然不是我们需要做的。必须能够直接对音频数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以waveIn和waveOut开头的一组API就是干这个的。   先说输入吧。常用的相关AP...

weixin_33694620的博客 467

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

yolov8 转华为昇腾om脚本

yolov8 转华为昇腾om脚本

jacke121的专栏 1600

WINDOWS下对音频的处理过程(转)

<br />WINDOWS下对音频的处理过程<br />WINDOWS下对音频的处理,大致可分为两部分,即音频的输入、输出,和ACM压缩处理。<br />  一般情况下在WINDOWS下可以调用诸如sndPlaySound等API(MCI)来播放一个WAV文件,但那显然不是我们需要做的。必须能够直接对音频数据流进行处理。在WINDOWS下,也为之提供了一系列的API,以waveIn和waveOut开头的一组API就是干这个的。<br />  先说输入吧。常用的相关API为waveInOpen(打开一个音频输

jiangyangbo的专栏 647

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于ffprobe的 批量音频信息提取 方法,过滤显示特定内容(附linux、windows下调用脚本)

运行输出效果如下:(过滤条件可以自行再编辑,目前只筛选了声道数量、文件名称路径)

weixin_54656728的博客 425

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Windows下音频捕获

待编辑~

wangqing008的专栏 3886

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Windows音频延迟优化全攻略:告别卡顿,享受流畅音频体验

作为一名游戏玩家或音乐创作者,你是否曾经遇到过这样的困扰:在激烈的游戏对战中,枪声总是比画面慢半拍;在音乐制作时,监听延迟让创作变得困难重重。这些恼人的音频延迟问题不仅影响体验,还可能让你错失关键的时机。今天,我将为你介绍一个专为Windows 10设计的音频延迟优化工具——REAL,它能帮助你轻松解决这些音频同步问题。 ## 音频延迟问题的根源:Windows系统的工作机制 要理解如何解决音

gitblog_00620的博客 834

ReactOS音频子系统:Windows音频架构的兼容实现

ReactOS作为开源Windows兼容操作系统,其音频子系统实现了对Windows音频架构的完整兼容。本文深入解析ReactOS音频架构的核心组件、技术实现原理以及兼容性挑战,为开发者提供全面的技术参考。 ## ReactOS音频架构概览 ReactOS音频子系统采用分层架构设计,完整实现了Windows音频API栈: ```mermaid graph TB A[应用程序层] --...

gitblog_00697的博客 1113

Windows音频延迟终极优化:3步实现毫秒级响应体验

作为一名游戏玩家或音频工作者,你是否曾被Windows系统恼人的音频延迟所困扰?在激烈的游戏对战中,枪声总是比画面慢半拍;在音乐制作时,监听延迟让创作变得异常困难。今天,我们要介绍的REAL项目(Reduce Audio Latency)正是为解决这一问题而生。这款开源工具通过系统级优化,能够将Windows 10的音频延迟从默认的45-60ms降低到10-15ms,带来近乎实时的音频响应体验。

gitblog_00305的博客 944

3个步骤让ViPER4Windows音频增强软件在Windows 10/11上稳定运行

你是否遇到过ViPER4Windows音频增强软件突然失效的情况?系统更新后音效消失,或者软件无法正常启动?这些问题常常困扰着音频爱好者。现在,通过一个专业的修复工具——ViPER4Windows-Patcher,你可以在几分钟内解决这些兼容性问题,让音频效果重新生效。 ## 核心优势:为什么选择这个修复方案 ViPER4Windows-Patcher的设计理念是简单高效。它不需要你具备专业的

gitblog_01188的博客 911
上一篇: DDKReg_GetIsrInfo的简介
下一篇: 傅立叶变换的物理意义
alien75
博客等级 码龄25年 195粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值