javascript - 通过 websocket 传输音频,延迟低且无中断

标签 javascript node.js websocket streaming audio-streaming

我正在开发一个项目,该项目需要能够将音频从网页流式传输到其他客户端。我已经在使用 websocket,并希望在那里传输数据。

我当前的方法使用媒体记录器,但采样存在问题,会导致中断。它注册 1 秒音频,然后将其发送到服务器,服务器将其中继到其他客户端。有没有办法捕获连续的音频流并将其转换为 Base64?

也许如果有一种方法可以毫不延迟地从 MediaStream 创建 Base64 音频,那么问题就可以解决。你觉得怎么样?

我想继续使用 websockets,我知道有 webrtc。 你有没有做过这样的事情,这可行吗?

                                                                --> Device 1
 MediaStream -> MediaRecorder -> base64 -> WebSocket -> Server --> Device ..
                                                                --> Device 18

这里是当前方法的演示...您可以在这里尝试:https://jsfiddle.net/8qhvrcbz/

var sendAudio = function(b64) {
  var message = 'var audio = document.createElement(\'audio\');';
  message += 'audio.src = "' + b64 + '";';
  message += 'audio.play().catch(console.error);';
  eval(message);
  console.log(b64);
}

 navigator.mediaDevices.getUserMedia({
      audio: true
 }).then(function(stream) {
        setInterval(function() {
            var chunks = [];
            var recorder = new MediaRecorder(stream);
            recorder.ondataavailable = function(e) {
                chunks.push(e.data);
            };
            recorder.onstop = function(e) {
                var audioBlob = new Blob(chunks);
                var reader = new FileReader();
                reader.readAsDataURL(audioBlob);
                reader.onloadend = function() {
                    var b64 = reader.result
                    b64 = b64.replace('application/octet-stream', 'audio/mpeg');
                    sendAudio(b64);
                }
            }
            recorder.start();
            setTimeout(function() {
                recorder.stop();
            }, 1050);
        }, 1000);
    });

最佳答案

Websocket 不是最好的。我通过使用 WebRTC 而不是 websocket 解决了。 使用 websocket 的解决方案是在记录 1050 毫秒而不是 1000 毫秒时获得的,它会导致一些重叠,但仍然比听到空白要好。

关于javascript - 通过 websocket 传输音频,延迟低且无中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55975895/

相关文章:

python - 如何在 Tornado 中随意发送 websocket 消息?

javascript - ReactJS _ Promise - 可以在 componentDidMount() 方法中初始化函数吗?

javascript - OpenAI gpt-3.5-turbo : Request failed with status code 400

mysql - 如何检查 JSON 是否包含字段并具有值 Sequelize MySQL (MariaDB)

node.js - 如何将外部 .js 文件包含到 ejs Node 模板页面

java - Spring 4 WebSocket 远程代理配置

javascript - 在 javascript 中,项目在数组中的长度是否有限制?

javascript - 获取数组推送之前的数据

javascript - 如何从 li 值中获取一个元素并操作它的值?

firefox - 使用 Firefox Quantum 检查 Websocket 帧