Как визуализировать звук микрофона / уровень давления в Silverlight 4? - PullRequest
2 голосов
/ 05 августа 2011

Я читал этот урок о том, как сделать аудиорекордер Silverlight.Я подумал, что было бы здорово добавить индикатор громкости, чтобы предоставить пользователю обратную связь о том, что происходит.Однако я не могу заставить это работать должным образом.

Метод OnSamples класса AudioSink предоставляет необработанные данные PCM в качестве одного из аргументов.Кроме того, я установил AudioFrameSize свойство AudioCaptureDevice на 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);

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

progressBar.Value = volume;

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

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

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

попробуйте это ... это для (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 голос
/ 13 марта 2012

Эта статья помогла мне решить проблему

Обработка аудио "на лету" (C #, WP7)

...