首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么获取麦克风实时输入音量,并转换为百分比

2012-03-09 
如何获取麦克风实时输入音量,并转换为百分比如何获取麦克风实时接受到的声音的音量,并转换为百分比最好能

如何获取麦克风实时输入音量,并转换为百分比
如何获取麦克风实时接受到的声音的音量,并转换为百分比
最好能给出代码,谢谢了!

[解决办法]
首先你可以利用Wave系统API对输入到声卡的声音数据进行采集;
然后再对采集到的声音数据进行大小分析并转换为分贝,然后显示到进度条里面。
你可以先根据这两个研究下,网上应该可以找到点资料。
[解决办法]

C/C++ code
int DeviceManager::getAudioInputVolumn( const std::string &deviceName ){    MMRESULT          rc;     // 多媒体函数返回结果变量    HMIXER            hMixer; // 混合器设备句柄    MIXERLINE         mxl;    // 音频线路标准状态信息结构体    MIXERLINECONTROLS mxlc;   // 音频线路控制器集合信息结构体    MIXERCONTROL      mxc;    // 单个音频线路控制器信息结构体    //枚举所有声卡驱动,这个枚举很重要。很多代码调用mixOpen时只是用了第一个设备,即    //mixerOpen(&hMixer, 0 , 0 ,0 ),但是我在这个设备下调用mixerGetLineInfo出问题了,    //可能还是跟声卡驱动有关。    for( int 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;         for( DWORD 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;} 


[解决办法]
简单处理音频输入数据的类

热点排行