2014-01-06 1 views
1

Я хочу, чтобы уровень громкости от записи данных микрофона в Windows Phone 8.Как получить громкость микрофона в Windows Phone 8

microphone = Microphone.Default; 
microphone.BufferDuration = TimeSpan.FromMilliseconds(150); 
microphone.BufferReady += microphone_BufferReady; 

private void microphone_BufferReady(object sender, EventArgs e) 
{ 
     // Get buffer from microphone and add to collection 
     int size = microphone.GetSampleSizeInBytes(microphone.BufferDuration); 
     byte[] buffer = new byte[size]; 
     int bytes = microphone.GetData(buffer); 
     MicrophoneDuration += microphone.GetSampleDuration(size); 
     bufferCollection.Add(buffer); 
     //Get the volume of microphone 
     MicrophoneVolume = GetMicrophoneVolume(buffer); 
} 

/// <summary> 
/// Get the microphone volume, from 0 up to 100. 
/// 
/// The sum of data[i] square divided by the total length of the data. 
/// volume = sum(data[i] * data[i])/Length/10000 
/// </summary> 
/// <param name="data"></param> 
/// <returns></returns> 
public static double GetMicrophoneVolume(byte[] data) 
{ 
    double value = 0; 

    for (int i = 0; i < data.Length; i++) 
    { 
     value += data[i] * data[i]; 
    } 
    return ConvertTo(value/data.Length/10000); 
} 

/// <summary> 
/// x/100 = value/MaxiMicrophoneVolume/// </summary> 
/// <param name="value"></param> 
/// <returns></returns> 
private static double ConvertTo(double value) 
{ 
    if (value > MaxiMicrophoneVolume) 
     value = MaxiMicrophoneVolume; 
    if (value < 0) 
     value = 0; 

    return (100 * value)/MaxiMicrophoneVolume; 
} 

Но в этом методе, объем зависит от суммы каждого типа данных в данные[]. В начале, когда сумма низкая, когда мы говорим громко, сумма больше, но когда звук уменьшается, сумма не изменяется, поэтому объем, который рассчитывается по GetMicrophoneVolume, не изменяется.

Кто-нибудь знает, как правильно получить громкость микрофона?
Или есть некоторые проблемы с моим решением?
Также почему не уменьшается сумма данных при уменьшении звука?
Лучше всего решить эту проблему.

+0

Где вы взяли эту формулу в любом случае? Кроме того, что такое значение «MaxiMicrophoneVolume», возможно, что он слишком низок и ваш расчетный объем всегда превышает его. –

+0

Разве вы не эмулируете xna gameloop? – user2737037

ответ

1

Спасибо вам, ребята, наконец, я получил решение, рассчитанное RMS

/// <summary> 
/// Detecting volume changes, the RMS Mothod. 
/// 
/// RMS(Root mean square) 
/// </summary> 
/// <param name="data">RAW datas</param> 
/// <returns></returns> 
public static void MicrophoneVolume(byte[] data) 
{ 
    //RMS Method 
    double rms = 0; 
    ushort byte1 = 0; 
    ushort byte2 = 0; 
    short value = 0; 
    int volume = 0; 
    rms = (short)(byte1 | (byte2 << 8)); 

    for (int i = 0; i < data.Length - 1; i += 2) 
    { 
     byte1 = data[i]; 
     byte2 = data[i + 1]; 

     value = (short)(byte1 | (byte2 << 8)); 
     rms += Math.Pow(value, 2); 
    } 

    rms /= (double)(data.Length/2); 
    volume = (int)Math.Floor(Math.Sqrt(rms)); 
}