HTML5& Web audio api:从浏览器到服务器的流式传输麦克风数据。理想的传输和数据压缩

时间:2013-12-23 18:47:33

标签: html5 websocket webrtc web-audio getusermedia

我希望从浏览器中获取音频输入并将其传输到多个侦听器。用途是用于音乐,所以质量必须是mp3标准或其左右。

我尝试了两种方法,都产生了不成功的结果:

的WebRTC

  • 直接在浏览器之间流式传输音频工作正常,但音频质量似乎是不可自定义的,尽管我已经看到了。 (我已经看到它正在使用Opus音频编解码器,但似乎没有暴露任何控件)。
  • 有没有人对如何提高WebRTC流的音频质量有任何见解?

Websockets

  • 问题是从浏览器到服务器的传输。我通过以下方法获取的PCM音频数据已被证明太大,无法通过websockets重复流式传输到服务器。该流在高速互联网环境中完美运行,但在较慢的wifi上它无法使用。

    var context = new webkitAudioContext()
    navigator.webkitGetUserMedia({audio:true}, gotStream)
    
    function gotStream (stream)
    {
        var source = context.createMediaStreamSource(stream)
        var proc = context.createScriptProcessor(2048, 2, 2)
    
        source.connect(proc)
        proc.connect(context.destination)
        proc.onaudioprocess = function(event)
        {
            var audio_data = event.inputBuffer.getChannelData(0)|| new Float32Array(2048)
            console.log(audio_data)
            // send audio_data to server
        }
    }
    

所以主要的问题是,有没有办法压缩PCM数据,以便更容易流式传输到服务器?或许还有一种更简单的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:3)

有很多方法可以压缩PCM数据,当然,但实际上,最好的办法是让WebRTC正常工作。 WebRTC旨在实现这一目标 - 自适应流媒体 - 尽管您没有定义“多个”侦听器的含义(3个侦听器和300,000个同时侦听器之间存在巨大差异)。

答案 1 :(得分:2)

有几种方法可以重新采样和/或压缩数据,但这些方法都不是原生的。我使用speex.js环境中的xaudio.js lib将数据重新采样到8Khz Mono(您的里程可能会有所不同)。您也可以使用speex压缩流,尽管通常仅用于音频。在您的情况下,我可能会将流发送到服务器,在那里压缩并将其流式传输给您的受众。我真的不相信一个简单的浏览器足以为大量的观众提供数据。

答案 2 :(得分:0)

WebRTC似乎默认为42 kb / s左右的一个单声道,它似乎主要是为语音设计的。

您可以使用约束禁用音频处理功能,以使用以下方法从浏览器获得更一致的输入:

navigator.mediaDevices.getUserMedia({   音频:{     autoGainControl:否,     channelCount:2     echoCancellation:否,     延迟:0,     NoiseSuppression:错误,     sampleRate:48000,     样本大小:16     音量:1.0   } });

然后,您还应该在SDP上设置stereomaxaveragebitrate参数:

let answer = await peer.conn.createAnswer(offerOptions);
answer.sdp = answer.sdp.replace('useinbandfec=1', 'useinbandfec=1; stereo=1; maxaveragebitrate=510000');
await peer.conn.setLocalDescription(answer);

这应该输出如下所示的字符串:

a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000

这可以将立体声的比特率提高到520kb / s,即每个通道260kps。实际比特率取决于您的网络速度和信号强度。