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

时间:2011-08-05 17:47:08

标签: silverlight audio microphone pcm

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

AudioSink类的

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

我的问题是如何从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);

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

progressBar.Value = volume;

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

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

尝试这个...这是针对(8000,8,1)如果您使用2个频道将“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());
            }

答案 1 :(得分:1)

这篇文章帮助我解决了这个问题

Processing audio "on-fly" (C#, WP7)