Windows下录音功能WareIn实现(含死锁破解、检测外部输入设备更改和重启录音服
来源:http://www.tudoupe.com时间:2022-05-24
WareIn安装了Windows记录功能(锁开锁、探测外部输入设备改造和重新启动记录服务)。
- 使用WareIn 步骤
- 设置 WAVEFORMATEX 声音收藏格式。
- 获取设备句柄
- 准备进入队列。
- 开始录音
- 当缓存被填充时,系统激活回声功能。
- 停止录音
- 防止系统死锁
- 在记录的数据来源(麦克风或媒体播放器)之间选择 。
- Focus: 所需的输入设备转换和自动重新启动录音功能
- 该问题出现的广泛性
- 解决办法
使用WareIn 步骤
Warein组是微软为录音设备操作提供的API的集合。如果你想播放声音,请使用WareOut。
设置 WAVEFORMATEX 声音收藏格式。
nSamplesPerSec:样本频率为8,00赫兹、11025赫兹、22050赫兹和41100赫兹。
witsPerSample: 更改基于 wformatTag 指定类型的取样率大小, 或设定为 WAVE_ FORMAT_ PCM 的 8 整数次数 。
n通道: 音频频道的数量。 可能是一两个, 但通常是两个, 表示大约两个频道 。
cSize:额外空间,通常没有必要,设为零。
wformatTag: 波形音频格式一般设置为 WAVE_ FORMAT_PCM 。
nBlockAllign: 区块对齐大小以字节为单位(nChannels*wBitsPerSample)/8 。
nAvgBytesPerSec:平均每秒以字节表示的平均数据传输率。
获取设备句柄
hWaveIn:hWaveIn是在函数正常运行后指定的。
WAVE_MAPER: 搜索可用的设备系统 。
此论点是我们第一步的目标。 WaveForm: 引用含有音频流信息的对象 。
MicroCallBack: 当创建录音信息时, 信息会按照与此参数相对应的值处理, 包括关闭录音、 填充缓冲区、 打开设备 。
(DWORD) 此: 第四参数的参数列表 。
CALBACK_元件: 设备打开标记 。对应第四个参数,当第四个参数被指定为函数时,如果是函数,第六个参数是 Calbak_Function;如果是一个事件,第六个参数是 Calbak_Function。如果事件是一个窗体控点( 第五个参数设置为 0 ), 则呼叫 CalBACK_ seven 。Calbak_WINDOW 设定为 0, 将保持为零 。Calbak_ NULL; 如果有线索, 有线索 。这篇文章是CALBACK的报导内容之一。
注:在启动此函数之前,必须有一个记录设备(台式计算机必须插入,才能识别)。
准备进入队列。
开始录音
当缓存被填充时,系统激活回声功能。
当 buff 被放入最大值 BUF_MAX_SIZE 的队列时, 系统会引用回声函数( 即我们正在WIM_ DATA中执行业务, 原因是在wareInOpen 中建立了返回功能 ) 。
停止录音
Waveinstop、WaveInReset和最后的WaveInClose是调用序列。
防止系统死锁
Warein的死锁引发了一个问题:他拍完电影后说:这波必须叫做"重置"此函数的技巧是将队列中的剩余字条(如果字条最可能不满)传送到WIM_DATA, 用于回声函数 。如果WIM_DATA在WavIn Addbuffer中实施,则无法使用WIM_DATA。我会把这个布布 重新排成队列。从而产生死锁,无法正常停止录音。
解决方案: 使用原子- is- stop 来防止回声功能持续到 wadIn AddBuffer 步骤 。
这篇文章是全球之声在线特稿的一部分。在录制结束前 开始清理程序结果,最有可能发生的最后一件事情没有与BUF_MAX_SIZE会面,被迫返回。如果有严格的数据要求,buff 块的大小可用于评估这一阶段 。将这一块舍弃。
由于我业务的内容是将音频输入Fulleate转换,提交数据的数量有严格的标准,因此我放弃了BUF_MAX_SIZE的尺寸,以避免FFT转换崩溃。
在记录的数据来源(麦克风或媒体播放器)之间选择 。
使用现代OS系统声音设置接口,输入装置通常装有麦克风和立体混音器。
当麦克风被打开,立体声被关闭时,录音通过麦克风进行。
当麦克风被关掉 立体声被打开时 录音由系统媒体播放器录制
麦克风和系统媒体播放器一旦启用即可收集声音。
当两个功能都关闭时, WavInOpen 函数失败 。
Focus: 所需的输入设备转换和自动重新启动录音功能
这是今天谈话的主题, 也碰巧是一个微软的问题。
技术点产生的真实案例:在实施音频收集服务后,客户必须更换系统语音设置的输入装置。
对应设备损失。
技术影响:装置处理器是在成功执行WaveInOpen功能后收到的。当强制禁用设备用,不是空的,不是空的,不是空的,不是空的,不是空的,不是空的。但是却无效。如果微软的API仍在使用例如,在回声函数中,WavIn AddBuffer,会意外阻塞,一直没有返回值,最后,整个方案陷入停顿。必须重启才能解决。似乎是微软虫
该问题出现的广泛性
我故意从一个百万级的平台上下载物品 在剧团的旗帜下, 例如“集合K-PC”和“酷狗音乐”。当程序在磁带上被发现时如果您要求人工输入设备更改,当您回到变化前状态时,它就会卡住。目前无法点击录音。这是第一次再次打开一个视频。退出软件也已重新开放。只有在正确使用时,才能使用录音能力。
对比输入设备,包括音乐、风暴声和其他媒体播放器。在播放的过程中,从外部禁用输出设备的扬声器 。发现所有软件都被卡住了,不能再玩了。当然,残疾后通常不玩游戏。接下来,重新启用扬声器,发现任何软件都无法继续运行。我只能把程序关掉并重开才可以播放。
因此,在使用中的音频设备停用以及随后激活另一个闲置装置之后,录音/播放功能的正常运行似乎是平台甚至微软尚未审议的大量问题。
解决办法
我之前考虑过与 Add Buffer, 我如何发现无阻波( 因为设备是打开的)?我的回声函数只使用 API wavIn AddBuffer 系统。事实证明,互联网上绝对没有信息。甚至强制性禁止使用投入设备也不是问题。我想我是第一个体验这个问题的人
没有开放的 API 。 下一步的考虑是如何检测这些外部强制变化。 此时此刻, 思想移动, 并且由于在设备失效后执行 WaleIn 类的 API 方法会有问题, 我将使用错误作为强制开关的信号 。
于是,即使每次成功执行WaveIn Addbuffer音频文件后都不可能使用它,也不可能使用它。在信号中添加事件 。同时,外部再写一个类,调用这个音频文件,WaitSingleObject 用于等待音频文件中的事件成为信号 。如果等待超时,我相信它已经被一个输入装置所取代, 我相信它已经被一个输入装置所取代。于是清理内存,删除音频文件对象,更新音频文件的对象,再次执行录音。这样,在切换输入设备后,这是一个自动音频重新启动。
部分代码如下:
WareIn课程和粗心死亡锁的可能性以及外部转换使用中的输入设备所产生的技术挑战就是这样。
相关新闻
- 2022-08-04 WPF的由来
- 2022-08-04 Win11勒索软件防护怎么打开?Win11安
- 2022-08-04 Windows系统jdk的配置
- 2022-08-04 Windows10 OneNote怎么重新登录?如何重
- 2022-08-04 超好用的 Windows 效率工具推荐
- 2022-08-04 Windows如何在CMD或PowerShell中配置代理
- 2022-08-04 powershell和cmd对比
- 2022-08-04 【QT】Windows下QT下载安装
- 2022-08-04 windows下 C++ 实现类属性的get和set方
- 2022-08-04 Win11快速助手在哪里?Win11打开快速
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
