如何通过麦克风来获取当前说话的音量或分贝高低

gooyan 2010-12-29 02:35:52
设施:PC机+麦克风+软件
软件能通过麦克风获得观众掌声、欢呼声最高音量即可。

关键是软件怎么实现呢?请给个思路或代码。谢谢

gooyan@163.com
...全文
2628 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我也遇到了这个问题,求解
quakeguobiao 2011-03-05
  • 打赏
  • 举报
回复
他是uchar,音频都是震动的,所以中点127是无声静音。
dengzikun 2010-12-30
  • 打赏
  • 举报
回复
好像是在对话框的一个Process函数中。
dengzikun 2010-12-30
  • 打赏
  • 举报
回复
呵呵,手头没有源码。里边有一个FFT类,你找找哪里用这个类了。
gooyan 2010-12-30
  • 打赏
  • 举报
回复
dc.LineTo(xnow/100,rect.bottom/2 - 63 - ynow);
gooyan 2010-12-30
  • 打赏
  • 举报
回复
没看到啊,就是上面的一段函数,就画线了
dengzikun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gooyan 的回复:]
下面的函数是响应MM_WIM_DATA消息,并画波形图,也没有看到fft转换啊。
if(ynow >= 0)
ynow = 127 - ynow;
else
ynow = -(128 + ynow);
dc.LineTo(xnow/100,rect.bottom/2 - 63 - ynow);


不明白什么意思,为什么出来127,128和63这些数字


WAVEHDR *……
[/Quote]

这里应该是振幅波形。你看他的频谱图处理,里面有FFT.
dengzikun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gooyan 的回复:]
windows下可以用wave系列函数或dsound采集到声音PCM数据,
然后分帧做FFT变换,计算音量。FFT网上有代码。

PCM数据是什么数据呢?
MM_WIM_DATA消息里面的吗?WAVEHDR中的lpdata吗?
[/Quote]

采集出来的就是PCM数据。
gooyan 2010-12-30
  • 打赏
  • 举报
回复
下面的函数是响应MM_WIM_DATA消息,并画波形图,也没有看到fft转换啊。
if(ynow >= 0)
ynow = 127 - ynow;
else
ynow = -(128 + ynow);
dc.LineTo(xnow/100,rect.bottom/2 - 63 - ynow);


不明白什么意思,为什么出来127,128和63这些数字


WAVEHDR *pwhi;
pwhi->lpData=waveBufferRecord[k];

void CAddnewdataDlg::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{

pwhi=&whis[bufflag];
waveInUnprepareHeader(hwi,pwhi,sizeof(WAVEHDR));
pwhi=&whis[MAX_INQUEU - 1 - bufflag];
pwhi->dwFlags=0;
pwhi->dwLoops=0;
waveInPrepareHeader(hwi,pwhi,sizeof(WAVEHDR));
waveInAddBuffer(hwi,pwhi,sizeof(WAVEHDR));
static unsigned char prevBuf[BUFSIZE];
memcpy(prevBuf,waveBufferRecord[bufflag], BUFSIZE);
bufflag = (bufflag + 1)%MAX_INQUEU;
///////////////////////////////////
CClientDC dc(this);
if(xnow == 110250)
{
dc.SelectObject(&penDot);
dc.FillSolidRect(mrect,RGB(0,0,180));

int width = mrect.Width();
int heigh = mrect.Height();

for(int i=0;i<21;i++)
{
dc.MoveTo(mrect.left+i*width/20,rect.top);
dc.LineTo(mrect.left+i*width/20,rect.bottom - 130);
}
for(int j=0;j<13;j++)
{
dc.MoveTo(mrect.left,rect.top+j*heigh/13);
dc.LineTo(mrect.right,rect.top+j*heigh/13);
}
xnow = 0;

}
dc.MoveTo(xnow/100,rect.bottom/2 - 63);

dc.SelectObject(&plotpen);
double ynow1=0;
if(timedisply == true)
{
for(int k = 0;k <BUFSIZE;k++)
{
ynow = prevBuf[k];
if(ynow >= 0)
ynow = 127 - ynow;
else
ynow = -(128 + ynow);
dc.LineTo(xnow/100,rect.bottom/2 - 63 - ynow);
xnow = xnow + 1;
}
}

}
gooyan 2010-12-30
  • 打赏
  • 举报
回复
windows下可以用wave系列函数或dsound采集到声音PCM数据,
然后分帧做FFT变换,计算音量。FFT网上有代码。

PCM数据是什么数据呢?
MM_WIM_DATA消息里面的吗?WAVEHDR中的lpdata吗?
gooyan 2010-12-30
  • 打赏
  • 举报
回复
声音波形幅度值(峰值)有没有最大、最小,是多少啊
dengzikun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gooyan 的回复:]
对录完的保存为文件的声音或正在录音的内存数据怎么分析波形或音量呢?
[/Quote]

FFT变换。参考
gooyan 2010-12-30
  • 打赏
  • 举报
回复
对录完的保存为文件的声音或正在录音的内存数据怎么分析波形或音量呢?
dengzikun 2010-12-29
  • 打赏
  • 举报
回复
没有直接的方式,只能写程序实现。
gooyan 2010-12-29
  • 打赏
  • 举报
回复
这方面不了解,感觉太难了。没有现成的函数能获取麦克风说话声音大小的吗?
dengzikun 2010-12-29
  • 打赏
  • 举报
回复
或者找开源的播放器,应该有相关的代码。
dengzikun 2010-12-29
  • 打赏
  • 举报
回复
那个帖子已经说的很清楚了。

剩下就是具体实现了。

windows下可以用wave系列函数或dsound采集到声音PCM数据,
然后分帧做FFT变换,计算音量。FFT网上有代码。
gooyan 2010-12-29
  • 打赏
  • 举报
回复
参考??
dengzikun 2010-12-29
  • 打赏
  • 举报
回复
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及: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上的网页播放器等实战产品。 目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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