2011-08-05 7 views
2

Silverlight 오디오 레코더 제작 방법에 대해서는 this tutorial을 따르고있었습니다. 나는 무슨 일이 일어나고 있는지에 대한 피드백을 사용자에게 제공하기 위해 볼륨 바 표시기를 추가하는 것이 좋을 것이라고 생각했다. 그러나, 나는 제대로 작동하지 않을 것 같습니다.Silverlight 4에서 마이크 사운드/압력 수준을 시각화하는 방법은 무엇입니까?

OnSamples AudioSink 클래스의 메소드는 원시 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); 

값은 다음 볼륨으로 설정됩니다 :

progressBar.Value = volume; 

내 코드가 분명히 작동하지 않습니다, 이후


내가 지금까지 무엇을 가지고 볼륨 값은 거의 항상 같은 수준입니다.

도움을 주시면 감사하겠습니다. 와

답변

2

노력이 ... 당신은 대체 2 개 채널을 사용하는 경우이 (8000,8,1)입니다 "인덱스 + = 1" "지수는 + = 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()); 
      } 
관련 문제