HTML5 录音机流式传输并上传到 MVC 服务器 - 为什么有噪音?
HTML5 audio recorder stream and upload to MVC server - Why is it noisy?
我正在尝试使用 getUserMedia 和 .NET MVC 制作网络录音机。
我已经完成了记录并将数据块发送到服务器。问题是我无法播放结果。下面的代码是我离正确播放它越近的距离,我可以在录音中录制和听到我的声音,但我得到了很多白噪音。我可能在搞乱数据的编码或解析。以下是部分代码:
chan = e.inputBuffer.getChannelData(channel);
buffer.push(chan);
var conv_buffer = convertFloat32ToInt16(chan);
uploadAudio(conv_buffer);
function convertFloat32ToInt16(buffer) {
l = buffer.length;
buf = new Int16Array(l);
while (l--) {
buf[l] = Math.min(1, buffer[l]) * 0x7FFF;
}
return buf;
}
在服务器端,我将块及其顺序存储到 Session 中(不知道我是否应该在这里使用其他任何东西。Session 听起来不适合我):
if (Session["wave"] == null)
Session["wave"] = new Dictionary<string, string>();
if (Request.Files.Count == 0)
((Dictionary<string, string>)Session["wave"]).Add(Request.Form[0], Request.Form[1]);
录制结束后,我只是解析流式传输到浮点数组的字符串,使用 NAudio 编码并保存到磁盘:
List<float> list = new List<float>();
foreach (var item in ((Dictionary<string, string>)Session["wave"]).OrderBy(c => c.Key))
{
list.AddRange(StringToFloatArray(item.Value).ToList());
}
Random rand = new Random();
WaveFormat waveFormat = new WaveFormat(48000, 16, 1);
string fileName = "teste" + rand.Next(0, 999999).ToString() + ".wav";
WaveFileWriter writer = new WaveFileWriter("c:\" + fileName, waveFormat);
writer.WriteSamples(list.ToArray(), 0, list.Count());
writer.Close();
解析:
private float[] StringToFloatArray(string input)
{
var strs = input.Split(',');
float[] arr = new float[strs.Length];
for (int i = 0; i < (strs.Length - 1)/2; i++)
{
arr[i] = float.Parse(strs[i]);
}
return arr;
}
如果有人能帮助我或指出任何方向,我将非常高兴。我已经尝试过很多方法来更改 enconding,但都没有成功...
后来很多次我意识到我需要做什么。问题是我需要从 int16 转换回 float 以将其传递给 NAudio。
buffer[k] = float.Parse(strs[k].Replace(".", ",")) / 32767.5f;
我正在尝试使用 getUserMedia 和 .NET MVC 制作网络录音机。
我已经完成了记录并将数据块发送到服务器。问题是我无法播放结果。下面的代码是我离正确播放它越近的距离,我可以在录音中录制和听到我的声音,但我得到了很多白噪音。我可能在搞乱数据的编码或解析。以下是部分代码:
chan = e.inputBuffer.getChannelData(channel);
buffer.push(chan);
var conv_buffer = convertFloat32ToInt16(chan);
uploadAudio(conv_buffer);
function convertFloat32ToInt16(buffer) {
l = buffer.length;
buf = new Int16Array(l);
while (l--) {
buf[l] = Math.min(1, buffer[l]) * 0x7FFF;
}
return buf;
}
在服务器端,我将块及其顺序存储到 Session 中(不知道我是否应该在这里使用其他任何东西。Session 听起来不适合我):
if (Session["wave"] == null)
Session["wave"] = new Dictionary<string, string>();
if (Request.Files.Count == 0)
((Dictionary<string, string>)Session["wave"]).Add(Request.Form[0], Request.Form[1]);
录制结束后,我只是解析流式传输到浮点数组的字符串,使用 NAudio 编码并保存到磁盘:
List<float> list = new List<float>();
foreach (var item in ((Dictionary<string, string>)Session["wave"]).OrderBy(c => c.Key))
{
list.AddRange(StringToFloatArray(item.Value).ToList());
}
Random rand = new Random();
WaveFormat waveFormat = new WaveFormat(48000, 16, 1);
string fileName = "teste" + rand.Next(0, 999999).ToString() + ".wav";
WaveFileWriter writer = new WaveFileWriter("c:\" + fileName, waveFormat);
writer.WriteSamples(list.ToArray(), 0, list.Count());
writer.Close();
解析:
private float[] StringToFloatArray(string input)
{
var strs = input.Split(',');
float[] arr = new float[strs.Length];
for (int i = 0; i < (strs.Length - 1)/2; i++)
{
arr[i] = float.Parse(strs[i]);
}
return arr;
}
如果有人能帮助我或指出任何方向,我将非常高兴。我已经尝试过很多方法来更改 enconding,但都没有成功...
后来很多次我意识到我需要做什么。问题是我需要从 int16 转换回 float 以将其传递给 NAudio。
buffer[k] = float.Parse(strs[k].Replace(".", ",")) / 32767.5f;