2011-08-05 1 views
2

Я следовал this tutorial о том, как сделать аудиомагнитофон Silverlight. Я подумал, что было бы здорово добавить индикатор уровня громкости, чтобы предоставить пользователю обратную связь о том, что происходит. Однако я не могу заставить это работать правильно.Как визуализировать уровень звука/уровня микрофона в Silverlight 4?

OnSamples Метод класса AudioSink предоставляет необработанные данные PCM в качестве одного из аргументов. Кроме того, я установил свойство AudioFrameSizeAudioCaptureDevice в 40 (1000/40 == 25 кадров в секунду), поэтому 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); 

Значение индикатора выполнения затем устанавливается в объеме:

progressBar.Value = volume; 

Мой код не работает, по-видимому, так значение объема почти всегда находится на одном уровне.

Любая помощь приветствуется!

ответ

2

попробовать это ... это для (8000,8,1), если вы используете 2 канала заменить "индекс + = 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()); 
      }