2017-07-16 23 views
0

我试图制作一个使用getUserMedia和.NET MVC的网络录音机。HTML5录音机流并上传到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; 
} 

在服务器端我存储他们的顺序块到一个会话(不知道我是否应该使用别的这里会话不健全适合。我):

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]); 

录制结束后,我只是解析我流为float数组,n音讯编码字符串,并保存到磁盘:

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没有成功...

+0

我也尝试给.net NAudio从录制原始数组,没有成功。我注意到的一件事是,转换为浮点数时某些精度会丢失。可能它不会发生,如果我把它转换成双倍的,但NAudio不能以这种格式接收。任何ideias? –

回答

0

很多时间后,我意识到我需要做什么。问题是我需要从int16转换回浮动才能将它传递给NAudio。

buffer[k] = float.Parse(strs[k].Replace(".", ","))/32767.5f; 
相关问题