打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何获取麦克风实时输入音量,并转换为百分比
首先你可以利用Wave系统API对输入到声卡的声音数据进行采集;
然后再对采集到的声音数据进行大小分析并转换为分贝,然后显示到进度条里面。
你可以先根据这两个研究下,网上应该可以找到点资料。

能否给个网址或代码
关注
zgszft
zgszft
本版等级:

#15 得分:70 回复于: 2012-02-25 17:38:28
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
int DeviceManager::getAudioInputVolumn( const std::string &deviceName )
{
    MMRESULT          rc;     // 多媒体函数返回结果变量
    HMIXER            hMixer; // 混合器设备句柄
    MIXERLINE         mxl;    // 音频线路标准状态信息结构体
    MIXERLINECONTROLS mxlc;   // 音频线路控制器集合信息结构体
    MIXERCONTROL      mxc;    // 单个音频线路控制器信息结构体
    //枚举所有声卡驱动,这个枚举很重要。很多代码调用mixOpen时只是用了第一个设备,即
    //mixerOpen(&hMixer, 0 , 0 ,0 ),但是我在这个设备下调用mixerGetLineInfo出问题了,
    //可能还是跟声卡驱动有关。
    forint deviceID =0 ; true ; deviceID++ )
    {
        // 打开混合器设备
        rc = mixerOpen(&hMixer, // 返回的设备句柄
            deviceID,       // 单声卡的设备ID为零
            0,       // 不使用回调机制
            0,       // 回调函数参数
            MIXER_OBJECTF_MIXER);      // MIXER_OBJECTF_MIXER宏的值,表示任选有效设备ID
        if( MMSYSERR_NOERROR!=rc )
        {
            //跳出循环
            break;
        }
        // 打开混合器设备无错的话,则
        // MIXERLINE 结构体变量清零
        ZeroMemory(&mxl, sizeof(MIXERLINE));
        mxl.cbStruct = sizeof(MIXERLINE); // 微软用此办法判断版本
        // 指出需要获取的通道,声卡的音频输出用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
        mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
        // 取得混合器设备的指定线路信息
        rc = mixerGetLineInfo((HMIXEROBJ)hMixer,
            &mxl,
            // 取得MIXERLINE::dwComponentType指定类型的第一个音频线路信息
            MIXER_OBJECTF_HMIXER|MIXER_GETLINEINFOF_COMPONENTTYPE);
        if( rc!=MMSYSERR_NOERROR )
        {
            //无法获取声音输入线路,尝试其他声卡
            continue;
        }
        // 取得混合器设备的指定线路信息成功的话,则
        // 将连接数保存 
        DWORD   dwConnections   =   mxl.cConnections; 
        // 准备获取麦克风设备的ID 
        DWORD   dwLineID = -1; 
        forDWORD i=0 ; i<dwConnections; i++ )
        
            // 枚举每一个设备,当Source的ID等于当前的迭代记数 
            mxl.dwSource = i;
            // 根据SourceID获得连接的信息 
            rc = mixerGetLineInfo(   (HMIXEROBJ)hMixer,   &mxl, 
                MIXER_OBJECTF_HMIXER   |   MIXER_GETLINEINFOF_SOURCE   ); 
            // 判断函数执行错误 
            if( MMSYSERR_NOERROR==rc )
            
                // 如果当前设备类型是麦克风,则跳出循环。 
                if( mxl.dwComponentType==MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
                
                    dwLineID = mxl.dwLineID; 
                    break
                }
            }
        }
        // 如果没有找到,返回失败。 
        if( dwLineID==-1 )
        
            //尝试其他声卡
            continue;
        }
        // MIXERCONTROL 结构体变量清零
        ZeroMemory(&mxc, sizeof(MIXERCONTROL));
        mxc.cbStruct = sizeof(mxc); // 微软用此办法判断版本
        // MIXERLINECONTROLS 结构体变量清零
        ZeroMemory(&mxlc, sizeof(MIXERLINECONTROLS));
        mxlc.cbStruct = sizeof(mxlc); // 微软用此办法判断版本
        mxlc.dwLineID = dwLineID; // 上面取得的声卡音频输入线路标识
        // 控制类型为控制音量
        mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
        mxlc.cControls = 1;          // 使用 MIXERCONTROL 结构体变量个数
        mxlc.pamxctrl = &mxc;        // MIXERCONTROL 结构体变量指针
        mxlc.cbmxctrl = sizeof(mxc); // MIXERCONTROL 结构体变量字节大小
        // 取得控制器信息
        rc = mixerGetLineControls((HMIXEROBJ)hMixer,
            &mxlc,
            MIXER_GETLINECONTROLSF_ONEBYTYPE);
        // 取得控制器信息成功的话,则
        if (MMSYSERR_NOERROR == rc)
        {
            // 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum.
            MIXERCONTROLDETAILS        mxcd;      // 控制器的状态信息
            MIXERCONTROLDETAILS_SIGNED volStruct; // 音量结构体变量(就一个成员量)
            // MIXERCONTROLDETAILS 结构体变量清零
            ZeroMemory(&mxcd, sizeof(mxcd));
            mxcd.cbStruct = sizeof(mxcd);       // 微软用此办法判断版本
            mxcd.dwControlID = mxc.dwControlID; // 上面取得的控制器标识
            mxcd.paDetails = &volStruct;        // 音量结构体变量指针
            mxcd.cbDetails = sizeof(volStruct); // 音量结构体变量字节大小
            mxcd.cChannels = 1;                 // 取得或设置全部通道
            //  获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum. 
            // 获得音量值
            rc = mixerGetControlDetails((HMIXEROBJ)hMixer,
                &mxcd,
                MIXER_GETCONTROLDETAILSF_VALUE);
            if (MMSYSERR_NOERROR == rc)
            {
                long step = ( mxc.Bounds.lMaximum - mxc.Bounds.lMinimum ) /100;
                int index = ( volStruct.lValue - mxc.Bounds.lMinimum) /step ;
                printf("音量:%X", volStruct.lValue);
                return index;
            }
        }
    }
    return -1;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
音量调节函数 VC
调节系统音量的类(VB原创)
Linux音频驱动构架及音频设备简单测试方法 .
同步带3M5M 8M 14M 2GT XL MXL S2M S3M S5M H L同步轮带
Arch Linux安装xfce和slim | 龍昌博客
PX4从放弃到精通(十一):混控及PWM输出
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服