Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows Phone 8中获取麦克风音量_C#_Windows Phone 8_Windows Phone_Microphone - Fatal编程技术网

C# 如何在Windows Phone 8中获取麦克风音量

C# 如何在Windows Phone 8中获取麦克风音量,c#,windows-phone-8,windows-phone,microphone,C#,Windows Phone 8,Windows Phone,Microphone,我想通过在windows phone 8中录制麦克风数据来获取音量级别 microphone = Microphone.Default; microphone.BufferDuration = TimeSpan.FromMilliseconds(150); microphone.BufferReady += microphone_BufferReady; private void microphone_BufferReady(object sender, EventArgs e) {

我想通过在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;
}
麦克风=麦克风。默认值;
Mirror.BufferDuration=TimeSpan.From毫秒(150);
麦克风.BufferReady+=麦克风\u BufferReady;
专用无效麦克风\u BufferReady(对象发送方,事件参数e)
{
//从麦克风获取缓冲区并添加到集合中
int size=麦克风.GetSampleSizeInBytes(麦克风.BufferDuration);
字节[]缓冲区=新字节[大小];
int字节=麦克风.GetData(缓冲区);
麦克风持续时间+=麦克风。GetSampleDuration(大小);
bufferCollection.Add(buffer);
//获取麦克风的音量
麦克风音量=获取麦克风音量(缓冲区);
}
/// 
///获取麦克风音量,从0到100。
/// 
///数据的总和[i]平方除以数据的总长度。
///体积=总和(数据[i]*数据[i])/长度/10000
/// 
/// 
/// 
公共静态双GetMicrophoneVolume(字节[]数据)
{
双值=0;
for(int i=0;i最大Microphone音量)
值=最大微音器音量;
如果(值<0)
数值=0;
返回值(100*值)/最大Microphone音量;
}
但在这种方法中,体积取决于数据[]中每个数据的总和。开始时,当sum较低时,当我们大声说话时,sum较大,但当声音降低时,sum不会改变,因此由
GetMicrophoneVolume
计算的音量不会改变

有人知道如何正确获取麦克风音量吗?
或者我的解决方案有问题吗?
另外,为什么声音降低时,数据总和不减少?

如果有更好的方法来解决这个问题,我们将不胜感激。

谢谢大家,最后我得到了一个由

//
///检测体积变化,RMS方法。
/// 
///均方根
/// 
///原始数据
/// 
公共静态无效麦克风卷(字节[]数据)
{
//RMS方法
双均方根=0;
ushort字节1=0;
ushort字节2=0;
短值=0;
int体积=0;

rms=(短)(字节1 |)(字节2)你是从哪里得到这个公式的?另外,
MaximicromphoneVolume
的值是多少,可能太低了,你计算的音量总是超过它。你不应该模拟xna gameloop吗?
/// <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));
}