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

o____os 2012-02-24 06:34:47
如何获取麦克风实时接受到的声音的音量,并转换为百分比
最好能给出代码,谢谢了!
...全文
721 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗平 2012-02-25
  • 打赏
  • 举报
回复
底层一点,使用 wavein 系列函数。

简单一点,可以用 MCI 的 Status 状态指令,获取音频强度。
o____os 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mobailwang 的回复:]

音量为百分比?这是和什么相比的百分比呢?
首先是你要想办法获取到实时输入的音量,那个只可能是某一瞬间的音值,或者是某一段时间的平均值,那么你要知道最大值,才能获得到百分比?那你的最大值是什么呢?
可行的话,你可以将你某一瞬间和某个时间的平均值转化为分贝进行显示。
[/Quote]
就是像windows录音程序一样,在录音时,获取用户发出的实时声音大小,以便将其显示在进度条里
zgl7903 2012-02-25
  • 打赏
  • 举报
回复
凌枫 2012-02-25
  • 打赏
  • 举报
回复
音量为百分比?这是和什么相比的百分比呢?
首先是你要想办法获取到实时输入的音量,那个只可能是某一瞬间的音值,或者是某一段时间的平均值,那么你要知道最大值,才能获得到百分比?那你的最大值是什么呢?
可行的话,你可以将你某一瞬间和某个时间的平均值转化为分贝进行显示。
o____os 2012-02-25
  • 打赏
  • 举报
回复
回复下啊。。。
o____os 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zgszft 的回复:]

C/C++ code
int DeviceManager::getAudioInputVolumn( const std::string &deviceName )
{
MMRESULT rc; // 多媒体函数返回结果变量
HMIXER hMixer; // 混合器设备句柄
MIXERLINE m……
[/Quote]
deviceName怎么获取?
zgszft 2012-02-25
  • 打赏
  • 举报
回复
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;
}
o____os 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mobailwang 的回复:]

首先你可以利用Wave系统API对输入到声卡的声音数据进行采集;
然后再对采集到的声音数据进行大小分析并转换为分贝,然后显示到进度条里面。
你可以先根据这两个研究下,网上应该可以找到点资料。
[/Quote]
能否给个网址或代码
凌枫 2012-02-25
  • 打赏
  • 举报
回复
首先你可以利用Wave系统API对输入到声卡的声音数据进行采集;
然后再对采集到的声音数据进行大小分析并转换为分贝,然后显示到进度条里面。
你可以先根据这两个研究下,网上应该可以找到点资料。
  • 打赏
  • 举报
回复
http://blog.csdn.net/abcpanpeng/article/details/3806160
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
http://group.gimoo.net/review/5246
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
http://topic.okbase.net/200811/2008112810/3516438.html
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
http://www.tctl.com.cn/accp/1533/1536/2037.html
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/paulluo0739/article/details/7192056
o____os 2012-02-24
  • 打赏
  • 举报
回复
咋没人回复俺呢
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:采集麦克风、PCM重采样、AAC或MP3音频编码存储、并直播。具体内容包括:1.FFmpeg采集麦克风并存储为PCM。2.PCM重采样原理及实战。3.采集麦克风实时转码AAC或MP3并保存文件。4.采集麦克风实时转码AAC并可以直播。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。 目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧