C# 如何在Windows Phone 8中获取麦克风音量
我想通过在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) {
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));
}