我正在学习如何制作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());
}