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



我正在学习如何制作Silverlight音频记录器。我认为如果能添加一个音量条指示器,为用户提供正在发生的事情的反馈,那就太棒了。然而,我似乎不能使它正常工作。

AudioSink类的

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

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

我的代码不工作,显然,因为音量值几乎总是在同一级别。

任何帮助都是感激的!

试试这个…这适用于(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());
            }

最新更新