如何在 Silverlight 4 中可视化麦克风声音/压力级别?

Posted

技术标签:

【中文标题】如何在 Silverlight 4 中可视化麦克风声音/压力级别?【英文标题】:How to visualize microphone sound/pressure level in Silverlight 4? 【发布时间】:2011-08-05 17:47:07 【问题描述】:

我正在关注this tutorial,了解如何制作 Silverlight 录音机。我认为添加音量条指示器以向用户提供有关正在发生的事情的反馈会很棒。但是,我似乎无法让它正常工作。

OnSamples Audiosink 类的方法提供原始 PCM 数据作为参数之一。另外,我将AudioCaptureDevice 的AudioFrameSize 属性设置为40(1000/40 == 25fps),因此每40ms 触发一次OnSamples。

我的问题是如何从 PCM 数据中提取音量信息并将其显示为进度条 [0-100] 的百分比?


这是我目前所拥有的:

double average = 0;
for (int a = 0; a < sampleData.Length; ++a)

    average += Math.Abs(sampleData[a]);

average /= sampleData.Length;

double volume = 20 * Math.Log10(average);

然后将进度条的值设置为音量:

progressBar.Value = volume;

显然,我的代码不起作用,因为音量值几乎总是处于同一水平。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

试试这个...如果您使用 2 个通道,这适用于 (8000,8,1) 将“index+=1”替换为“index+=2”

            for (int index = 0; index < sampleData.Length; index += 1)
            
                short sample = (short)((sampleData[index + 1] << 8) | sampleData[index + 0]);

                //short sample = (short)(sampleData[index + 0]);
                float sample32 = sample / 32768f;

                float maxValue = 0;
                float minValue = 0;

                maxValue = Math.Max(maxValue, sample32);
                minValue = Math.Min(minValue, sample32);

                float lastPeak = Math.Max(maxValue, Math.Abs(minValue));

                this.MicLevel = (100 - (lastPeak * 100)) * 10;
                //System.Diagnostics.Debug.WriteLine("Mic Level: " + this.MicLevel.ToString());
            

【讨论】:

以上是关于如何在 Silverlight 4 中可视化麦克风声音/压力级别?的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 中 Wave 文件的声音可视化工具

Silverlight 4:如何切换控件可见性

如何将 .rtf 文件导入 silverlight 4 Richtextbox?

如何在不实际删除行的情况下明显折叠 Silverlight 4 ListBox 中的单行?

如何安装Silverlight Tools 4

Silverlight 4:如何在键盘焦点上显示工具提示(修订)