我关注如何制作Silverlight录音机的this tutorial。我认为添加音量条指示器以向用户提供有关正在发生的事情的反馈会很棒。但是,我似乎无法使其正常工作。
AudioSink类的OnSamples方法提供原始PCM数据作为参数之一。另外,我将AudioFrameSize的AudioCaptureDevice属性设置为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;
显然,我的代码不起作用,因为音量值几乎总是处于同一水平。
感谢任何帮助!
答案 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)
这篇文章帮助我解决了这个问题