【问题标题】:HTML5 audio recorder stream and upload to MVC server - Why is it noisy?HTML5 录音机流式传输并上传到 MVC 服务器 - 为什么它很吵?
【发布时间】:2017-07-16 00:00:39
【问题描述】:

我正在尝试使用 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;
    }

如果有人可以帮助我或指出任何方向,我会非常高兴。我已经尝试以多种方式更改编码但没有成功...

【问题讨论】:

  • 我还尝试将记录中的原始数组提供给 .net NAudio,但没有成功。我注意到的一件事是,转换为浮点数时会丢失一些精度。如果我将其转换为双精度,可能不会发生这种情况,但 NAudio 无法以这种格式接收。有什么想法吗??

标签: .net asp.net-mvc audio html5-audio audio-recording


【解决方案1】:

后来我意识到我需要做什么。问题是我需要从 int16 转换回 float 以将其传递给 NAudio。

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

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2011-04-26
    • 2012-01-24
    • 2012-08-21
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2023-03-28
    • 2018-04-08
    相关资源
    最近更新 更多