精易论坛

标题: 音量控制模块,可实时获取设备音量电平峰值 [打印本页]

作者: tsqdhh    时间: 2019-8-27 14:41
标题: 音量控制模块,可实时获取设备音量电平峰值
本帖最后由 tsqdhh 于 2019-8-27 16:48 编辑

参考了微软 核心音频API(endpointvolume.h,mmdeviceapi.h)https://docs.microsoft.com/en-us/windows/win32/api/_coreaudio/
参考了Jie_soft的com对象调用IAudioEndpointVolume接口示例


增加 对音频计 IAudioMeterInformation接口的调用
可实现类似系统音量控制及显示


系统音频设备类.rar (21.91 KB, 下载次数: 346)


补充内容 (2019-9-18 01:07):
14楼补充一个 取左右声道实时音量示例

QQ图片20190827143220.png (42.98 KB, 下载次数: 8)

QQ图片20190827143220.png

作者: 网络注册网员    时间: 2019-8-27 16:08
好强大这个
作者: zytlj    时间: 2019-8-28 11:19
好强大,谢谢楼主分享。
作者: bye亲    时间: 2019-8-31 19:30
好强大这个
作者: 晓凡尘    时间: 2019-9-4 13:15
易语言,感觉硬件类的很少,感谢楼主分享
作者: mengshneg    时间: 2019-9-8 12:14
好强大,谢谢分享
作者: mengshneg    时间: 2019-9-8 14:04
好强大,谢谢分享
作者: mengshneg    时间: 2019-9-8 21:16
回复走一波,精币到手
作者: mengshneg    时间: 2019-9-8 21:17
感觉硬件类的很少,感谢楼主分享
作者: v5b9pp    时间: 2019-9-9 18:46
这个东西好啊,关于这个方面的模块是真的很少
作者: tenliq    时间: 2019-9-10 02:40
怎么获取指定进程的音量峰值?
作者: tsqdhh    时间: 2019-9-10 11:26
tenliq 发表于 2019-9-10 02:40
怎么获取指定进程的音量峰值?

这可能得用到其他几个接口了
比如枚举音频会话接口:
IAudioSessionEnumerator



作者: 473621    时间: 2019-9-12 17:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: tsqdhh    时间: 2019-9-18 01:07
补充一个示例
取左右声道实时音量示例.e (8.74 KB, 下载次数: 178)

作者: zhaoyun    时间: 2019-10-3 03:13
感谢楼主分享,保存以后研究
作者: 骑猪走天下    时间: 2019-10-3 07:12
可实现类似系统音量控制及显示
作者: 骑猪走天下    时间: 2019-10-3 07:12
可实现类似系统音量控制及显示
作者: なす随风ぬね    时间: 2019-10-10 07:10
好东西,先收下也得评个好
作者: 李泽勇2    时间: 2019-10-14 08:24
楼主威武,牛
作者: 初学者11    时间: 2019-11-21 21:34
楼主威武,牛 楼主威武,牛 楼主威武,牛
作者: diudiulala    时间: 2020-1-2 21:47
非常好,帮了很大的忙
作者: zhangmp    时间: 2020-3-29 01:31
感谢楼主,不过能讲下怎么释放内存吗?无论是用循环还是时钟,采样率高的话程序占用内存疯涨,有什么办法解决啊??
作者: 小黑很白    时间: 2020-4-6 10:50
好活,当赏
作者: alanglin    时间: 2020-6-25 22:27
好东西,谢谢分享
作者: maozaiba    时间: 2020-6-26 13:45
不错,但内存会一直增长
作者: gofly001    时间: 2020-8-20 12:28
可以实时监视音量的么
作者: namosamghata    时间: 2020-10-3 05:22
怎么获取指定进程的音量峰值?

作者: 饭饭儿    时间: 2020-12-18 11:12
楼主威武,牛高手高高手
作者: 一碗面    时间: 2021-5-13 23:29
又GET到了
作者: 一碗面    时间: 2021-5-18 10:49

非常好,帮了很大的忙
作者: tsaltedfishking    时间: 2021-5-30 15:39
非常感谢
作者: lolpiop    时间: 2021-7-1 09:10
666666666666666666
作者: hejba    时间: 2021-7-3 16:26
有没有是监控具体的某段声音的
作者: 颜戏星    时间: 2022-6-7 20:45
66666666666666666666
作者: 颜戏星    时间: 2022-6-7 20:46
666666666666666666666666666666666666
作者: 醉清风o    时间: 2023-2-24 17:25
学习学习
作者: a446489393    时间: 2023-7-22 16:37
下载看看,现在正好需要。
作者: 天使与恶魔    时间: 2023-8-8 17:46
6666666666666
作者: nihaibugouge    时间: 2023-8-30 18:37
要的要的
作者: 小窗润轻风    时间: 2023-8-30 18:49
声音里学问也很大
作者: ab4157    时间: 2023-11-12 01:23
全靠你们这些大神了
作者: ab4157    时间: 2023-11-12 01:23
谢谢;楼主贡献
作者: 红葡萄    时间: 2023-11-19 10:10
不错很好
作者: 南絮    时间: 2023-11-23 08:38
感谢感谢
作者: 4891311a    时间: 2023-12-21 15:42

作者: 4891311a    时间: 2023-12-21 15:43

作者: 4891311a    时间: 2023-12-21 15:44

作者: 4891311a    时间: 2023-12-21 15:44
声音里学问也很大
作者: 4891311a    时间: 2023-12-26 23:51

作者: 4891311a    时间: 2023-12-26 23:51

作者: ctry78985    时间: 2024-1-22 11:29
回复走一波,精币到手
作者: 1300886755    时间: 2024-1-27 17:05
感谢分享
作者: 雨纷飞    时间: 2024-4-7 01:35
有bug:  pIID_IAudioMeterInformation创建了com对象没有释放,所以导致每次GetPeakValue来获取音频峰值,都会有一点内存泄露.时间久了吃了我31G内存....
作者: wxy123456    时间: 2024-4-12 11:55
雨纷飞 发表于 2024-4-7 01:35
有bug:  pIID_IAudioMeterInformation创建了com对象没有释放,所以导致每次GetPeakValue来获取音频峰值,都会 ...

确实有内存泄漏,导致程序卡死的情况。
作者: wxy123456    时间: 2024-4-12 11:57
zhangmp 发表于 2020-3-29 01:31
感谢楼主,不过能讲下怎么释放内存吗?无论是用循环还是时钟,采样率高的话程序占用内存疯涨,有什么办法解 ...

时钟周期必须设置的大点,我设置5秒,程序暂时没有卡死。
如果设置成几百毫秒,程序必卡死。
作者: 雨纷飞    时间: 2024-4-13 02:31
wxy123456 发表于 2024-4-12 11:57
时钟周期必须设置的大点,我设置5秒,程序暂时没有卡死。
如果设置成几百毫秒,程序必卡死。 ...

我是用来实现动态音量均衡(又叫响度均衡)的,用来检测系统正在播放的音频是否音量过大,如果过大就降低音量,以实现不同媒体的音量差不多都一样,避免打开一个游戏或电影时声音大吓一跳(高端点的声卡其驱动附带软件都有这功能,我新换的神舟笔记本显然不高端),所以自己写了实现。

要实现这个功能,需要每秒采样音量至少100次。你设置5秒的办法对我来说没有实用价值哦 。

附上解决内存泄漏的修正代码:
每个类增加以下子程序:
.版本 2

.子程序 Release2, 整数型
.参数 this_, 整数型
.局部变量 index, 整数型

index = 2
置入代码 (#COM调用)
返回 (0)

然后在类实现里,在返回前增加上:
.版本 2

    ' '''这里缺Release,导致泄露
    Release2 (pMeterInfo)  ' 补上释放,不同的类要释放不同的对象

这样返回前就会释放。不同的com对象,基本都是方法2为Release ,所以不同的对象都调用方法2就都能释放掉。把所有类都加上调用完毕返回前释放,问题就解决了。

作者: 雨纷飞    时间: 2024-4-13 02:38
模块源码的修正源码在附件,通过以上方法修正过后就解决了内存泄漏。不过楼主的这个类库,并没有写完,比如想调整某个进程的音频流的音量,是没有实现的。缺少以下内容:
IAudioSessionManager2
IAudioSessionEnumerator
IAudioSessionControl2
ISimpleAudioVolume

我懒得写因为我通过py实现了,没再继续用易语言了。大家如果有兴趣可以依照楼主写的IAudioEndpointVolume等com的易语言类实现,来完善以上几个com的实现,完善后就是完整的微软Core Audio APIs了

系统音频设备类_修复内存泄漏.e

56.97 KB, 下载次数: 38, 下载积分: 精币 -2 枚


作者: wxy123456    时间: 2024-4-21 20:38
雨纷飞 发表于 2024-4-13 02:38
模块源码的修正源码在附件,通过以上方法修正过后就解决了内存泄漏。不过楼主的这个类库,并没有写完,比如 ...

高手,这样就不用担心BUG卡死
作者: 1389739946    时间: 2024-5-2 10:20
爱死你了!!!
作者: chinasulu    时间: 2024-7-3 01:20
音频设备.
作者: chinasulu    时间: 2024-7-3 01:20

作者: sugyli    时间: 2024-9-23 14:12
支持下  感谢分享
作者: sugyli    时间: 2024-9-26 11:49
里面的 INDEX=1   2 之类的看不明白啊
作者: jinxiu9527    时间: 2024-11-7 01:45

作者: tsqdhh    时间: 2024-11-23 19:37
sugyli 发表于 2024-9-26 11:49
里面的 INDEX=1   2 之类的看不明白啊

调用对应索引方法,也就 是方法1、方法2     https://learn.microsoft.com/zh-cn/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdevice
作者: mnf8888    时间: 2024-12-31 08:52
好东东,顶一下
作者: mnf8888    时间: 2024-12-31 08:52
谢谢楼主的东东
作者: lhjjx    时间: 2025-3-25 04:07
回复走一波,精币到手
作者: cdqpx    时间: 2025-4-2 13:33
学习了,感谢分享
作者: 天使酱油娃    时间: 2025-4-13 11:02
感谢楼主的无私分享
作者: 天使酱油娃    时间: 2025-4-13 11:40
感谢大佬的分享
作者: emugba    时间: 14 小时前
谢谢分享~~~~~~~~~~~~~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4