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

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

OnSamples AudioSink 类的方法提供原始 PCM 数据作为参数之一。另外,我将AudioCaptureDeviceAudioFrameSize 属性设置为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;

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

感谢任何帮助!

【问题讨论】:

    标签: silverlight audio microphone pcm


    【解决方案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());
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多