当前位置: 首页 > 知识库问答 >
问题:

从NodeJS服务器获取实时音频流到客户端

华昕
2023-03-14

我需要有一个实时直播音频流从一个客户端到一个服务器到多个侦听器客户端。

目前,我已经从客户端录制工作和流通过套接字的音频。将io发送到服务器。服务器接收此数据,并且必须流式传输音频(也通过socket.io?)发送给希望侦听此流的客户端。它必须尽可能实时(尽量减少延迟)。

我正在使用GetUserMedia录制麦克风(浏览器兼容性在这里并不重要)。我希望客户端使用HTML5音频标签来收听流。在服务器上接收的数据是块(目前由700打包),打包在一个blob中,类型为dio/wav。

这是我将其发送到服务器的代码

mediaRecorder.ondataavailable = function(e) {
    this.chunks.push(e.data);
    if (this.chunks.length >= 700)
    {
        this.sendData(this.chunks);
        this.chunks = [];
    }
};
mediaRecorder.sendData = function(buffer) {
    blob = new Blob(buffer, { 'type' : 'audio/wav' });
    socket.emit('voice', blob);
}

在服务器上,我可以像这样将块发送到客户端:

socket.on('voice', function(blob) {
    socket.broadcast.emit('voice', blob);
});

在客户端上,我可以这样玩:

var audio = document.createElement('audio');
socket.on('voice', function(arrayBuffer) {
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/wav' });
    audio.src = window.URL.createObjectURL(blob);
    audio.play();
});

这适用于我发送的第一个blob块,但不允许您继续更改为音频。src到新的URL源,因此这不是一个有效的解决方案。

我想我必须在服务器上创建某种流,我可以把它放在监听客户端的HTML5的音频标签中,但我不知道怎么做。接收到的带有块的Blob应该实时附加到此流中。

最好的方法是什么?从客户端麦克风到服务器,我做得对吗?

共有2个答案

孙德本
2023-03-14

您可以动态更改音频src,如下所示(假设为mp3类型):

<audio id="audio" controls="controls">
    <source id="mp3Source" type="audio/mp3"></source>
        Your browser does not support the audio format.
</audio>

每当接收到套接字事件时调用以下函数

function updateSource() { 
        var audio = document.getElementById('audio');

        var source = document.getElementById('mp3Source');
        source.src= <blob>;

        audio.load(); //call this to just preload the audio without playing
        audio.play(); //call this to play the song right away
    }
丰辰沛
2023-03-14

我在这里的聚会有点晚,但看起来网络音频应用编程接口将是你的朋友,如果你还没有完成的话。它允许您直接向输出设备播放音频流,而无需将其附加到音频元素。

我正在考虑做同样的事情,您的问题已经回答了我的问题-如何从客户机到服务器获取数据。web音频API的好处是能够将流添加到一起,并在服务器上对其应用音频效果。

网络音频API

io事件应替换音频上下文中音频缓冲区对象中的数据。音频处理可以在nodeJS web音频上下文中进行,然后作为单个流发送到每个客户端。

 类似资料:
  • 我需要录制音频(我相信使用函数)并将其从nodejs服务器传输到连接的客户端浏览器。我环顾了一些例子,没有什么太明确的内容,并且采用了不同的方法。 我不能使用webrtc。它必须使用服务器向客户端发送流。但是,我可以使用(我相信这是webrtc的一部分)来录制音频并将其发送到nodejs服务器)。 是否有任何资源或示例显示这样的工作方式?

  • 问题内容: 我目前正在尝试将直播麦克风音频从Android设备流式传输到Java程序。我首先在两个Android设备之间发送实时音频,以确认我的方法正确。在接收设备上几乎没有任何延迟地可以完美地听到音频。接下来,我将相同的音频流发送到一个小型Java程序,并验证了数据也已正确发送到此处。现在,我想要做的是对这些数据进行编码,并以某种方式在运行Java程序的服务器上对其进行回放。我宁愿在使用HTML

  • 我正在做一个项目,我需要发送一个音频流到一个节点。js服务器。我可以使用此功能捕获麦克风声音: 如你所见,我能够捕捉音频并在网站上播放。 现在我想把那个音频流发送到一个节点。js服务器,并将其发送回其他客户端。像语音聊天,但我不想使用WebRTC,因为我需要服务器中的流。我怎样才能做到这一点?我可以用插座吗。我想这样做?在我看到的示例中,他们录制了音频,并发送了一个文件,但我需要“实时”音频。

  • 我正在寻找一些关于如何实现一个能够将音频发送到服务器的Java客户端的链接/源代码/教程(见下文)。它将能够发送一个音频文件,然后由服务器接收并通过计算机扬声器播放。 我还想问,对于这种情况,使用UDP或TCP服务器会更好吗?因为我将开发一个android应用程序,它可以录制声音,然后通过电脑扬声器将声音发送到服务器进行实时播放。

  • 我有一个现有的应用程序,通过RTMP将实时音频从Flash客户端流到Wowza zerver。。。我能够将Flash客户端连接到该设备,并获得实时、低延迟的音频。 我想在PC、Android和iOS中连接一些基于HTML5的客户端,而不在客户端使用任何Flash。。。RTMP URI通常为“rtmp://myserver/live/mystream“我尝试从HTML5页面连接视频和音频标签,但没有

  • 我想做一个网站,将作为一个VoIP录音机应用程序。它将从麦克风获取音频,仅将音频传输到服务器和服务器,然后服务器将处理音频重新分配到其连接的客户端。 以下是我已经尝试过的: WebRTC(据我所知,它只是点对点的) 我设置的堆栈是带有Express的NodeJS,但我对任何有帮助的包都非常开放。 就可能性而言,我知道这是可能的,因为不和谐在他们自己的博客中写道,他们明确不发送点对点数据包,因为他们