Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过websocket传输音频,延迟低,无中断_Javascript_Node.js_Websocket_Streaming_Audio Streaming - Fatal编程技术网

Javascript 通过websocket传输音频,延迟低,无中断

Javascript 通过websocket传输音频,延迟低,无中断,javascript,node.js,websocket,streaming,audio-streaming,Javascript,Node.js,Websocket,Streaming,Audio Streaming,我正在做一个项目,需要有能力流音频从网页到其他客户。我已经在使用websocket,希望将数据传输到那里 我目前的方法是使用媒体记录器,但采样有问题,会导致中断。它注册1s音频,然后将其发送到服务器,服务器将其转发给其他客户端。有没有办法捕获连续音频流并将其转换为base64 如果有一种方法可以毫不延迟地从MediaStream创建base64音频,它可能会解决这个问题。你觉得怎么样 我想继续使用WebSocket,我知道有webrtc。 你做过这样的事吗,这行得通吗

我正在做一个项目,需要有能力流音频从网页到其他客户。我已经在使用websocket,希望将数据传输到那里

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

如果有一种方法可以毫不延迟地从MediaStream创建base64音频,它可能会解决这个问题。你觉得怎么样

我想继续使用WebSocket,我知道有webrtc。 你做过这样的事吗,这行得通吗

                                                                --> Device 1
 MediaStream -> MediaRecorder -> base64 -> WebSocket -> Server --> Device ..
                                                                --> Device 18
这里是当前方法的演示。。。您可以在这里尝试:


Websocket不是最好的。我通过使用WebRTC而不是websocket解决了这个问题。 websocket的解决方案是在录制1050ms而不是1000 ms时获得的,它会造成一些重叠,但仍然比听空白要好。

虽然您已经通过业界推荐的WebRTC解决了这个问题,但我想分享一下我的答案

这里的问题不是WebSocket,而是MediaRecorder API。您可以使用PCM音频捕获,然后将捕获的阵列缓冲区提交到web worker或WASM,以编码为MP3块或类似内容,而不用它

const context = new AudioContext();
let leftChannel = [];
let rightChannel = [];
let recordingLength = null;
let bufferSize = 512;
let sampleRate = context.sampleRate;

const audioSource = context.createMediaStreamSource(audioStream);
const scriptNode = context.createScriptProcessor(bufferSize, 1, 1);

audioSource.connect(scriptNode);
scriptNode.connect(context.destination);
scriptNode.onaudioprocess = function(e) {
    // Do something with the data, e.g. convert it to WAV or MP3
};

根据我的实验,这将给你“实时”音频。我对MediaRecorderAPI的理论是,在发出任何导致可观察延迟的信息之前,它首先进行一些缓冲

旁注:为什么要使用Base64?WebSocket支持二进制数据。节省编码/解码将节省CPU和带宽。使用base64进行测试更容易,我尝试使用binary,但没有太多improvement@Myst我认为问题在于MediaRecorder,而不是数据本身,它甚至在不涉及WebSocket的情况下也会跳过。或者可能是因为球员的延误。我做了一个提琴女巫用blob而不是base64为什么要用你的Web套接字呢?使用WebRTC,它有一个为低延迟设计的完整堆栈。不要重新发明轮子。我2分钟前刚刚发布了相同的答案。但webrtc似乎能更好地处理音频。我想使用websocket,因为它更容易将数据发送到许多客户机,从而将作业卸载到服务器。有了WebRTC,我们可以使用更多的连接。。。我要测试一下。
const context = new AudioContext();
let leftChannel = [];
let rightChannel = [];
let recordingLength = null;
let bufferSize = 512;
let sampleRate = context.sampleRate;

const audioSource = context.createMediaStreamSource(audioStream);
const scriptNode = context.createScriptProcessor(bufferSize, 1, 1);

audioSource.connect(scriptNode);
scriptNode.connect(context.destination);
scriptNode.onaudioprocess = function(e) {
    // Do something with the data, e.g. convert it to WAV or MP3
};