9

我希望从浏览器获取音频输入并将其流式传输到多个听众。预期用途是音乐,所以质量必须在mp3标准左右。

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

网络RTC

  • 直接在浏览器之间流式传输音频效果很好,但是尽管我所看到的,音频质量似乎是不可定制的。(我看到它使用的是 Opus 音频编解码器,但似乎没有公开任何控件)。
  • 有人对如何提高 WebRTC 流中的音频质量有任何见解吗?

网络套接字

  • 问题是从浏览器到服务器的传输。我可以通过以下方法获取的 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 数据以便更容易地流式传输到服务器?或者也许有更简单的方法来解决这个问题?

4

3 回答 3

4

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

于 2013-12-23T20:25:07.133 回答
2

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

于 2013-12-26T11:36:09.970 回答
0

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

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

navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false, channelCount: 2, echoCancellation: false, delay: 0, noiseSuppression: false, sampleRate: 48000, sampleSize: 16, volume: 1.0 } });

然后你还应该在 SDP 上设置stereo和参数:maxaveragebitrate

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。实际比特率取决于您的网络速度和信号强度。

于 2019-11-17T07:04:16.187 回答