通过 socket.io 1.0 实时音频

     2023-02-25     50

关键词:

【中文标题】通过 socket.io 1.0 实时音频【英文标题】:Live audio via socket.io 1.0 【发布时间】:2014-09-12 12:25:05 【问题描述】:

来自 socket.io 网站

二进制流

从 1.0 开始,可以来回发送任何 blob:图像、音频、视频。

我现在想知道,如果这不能成为我最近想要实现的目标的解决方案。

我实际上正在寻找一种方法,如何将实时音频流从(A - 即麦克风输入..)广播到连接到我的网站的所有客户端。这样的事情可能吗?我一直在搞乱 WebRTC (https://www.webrtc-experiment.com/) 示例,但我无法管理多个已连接客户端的目标。

我的想法是关于诸如 getUserMedia 或 A 侧的任何其他音频源(PCM,等等)之类的东西被切成块并提供给客户端并由例如 html5 音频元素或任何东西播放。我需要做到这一点尽可能多地实时流式传输,没有喊叫/冰播服务不够快(实际上,它们不能解决我的问题,它们应该以这种方式使用)而且我并不真正关心音频质量。跨平台兼容性会很棒。

这样的事情可能吗?通过使用 socket.io 如何将这些数据提供给客户端?

我将非常感谢任何可以帮助我实现这一目标的参考、提示或来源。 非常感谢。

【问题讨论】:

【参考方案1】:

此示例向您展示如何使用MediaRecorder 上传音频,然后使用socket.io 转发。此代码仅在您被称为mediaRecorder.stop() 后才会广播。您可以选择在ondataavailable 内广播。如果这样做,您可能需要将timeslice 传递给mediaRecorder.start(),这样它就不会经常触发ondataavailable

此解决方案并未真正上线,但我认为它会帮助那些回来并找到此问题的人。

客户端代码

var constraints =  audio: true ;
navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) 
    var mediaRecorder = new MediaRecorder(mediaStream);
    mediaRecorder.onstart = function(e) 
        this.chunks = [];
    ;
    mediaRecorder.ondataavailable = function(e) 
        this.chunks.push(e.data);
    ;
    mediaRecorder.onstop = function(e) 
        var blob = new Blob(this.chunks,  'type' : 'audio/ogg; codecs=opus' );
        socket.emit('radio', blob);
    ;

    // Start recording
    mediaRecorder.start();

    // Stop recording after 5 seconds and broadcast it to server
    setTimeout(function() 
        mediaRecorder.stop()
    , 5000);
);

// When the client receives a voice message it will play the sound
socket.on('voice', function(arrayBuffer) 
    var blob = new Blob([arrayBuffer],  'type' : 'audio/ogg; codecs=opus' );
    var audio = document.createElement('audio');
    audio.src = window.URL.createObjectURL(blob);
    audio.play();
);

服务器代码

socket.on('radio', function(blob) 
    // can choose to broadcast it to whoever you want
    socket.broadcast.emit('voice', blob);
);

【讨论】:

嘿,您的代码工作正常,但由于 setTimeout 功能在其他客户端可以侦听后,它在 5 秒后停止。这是让其他客户在每一秒内听到所有声音的任何方式吗? 嘿@niteshsingh,我不完全确定如何在不弄乱代码的情况下做到这一点。我不知道我什么时候会回来修改它,但希望这可以帮助您获得基础设置!如果你弄清楚了,请告诉我:)【参考方案2】:

Client Code 中,您可以编写 setInterval() 而不是 setTimeout(),然后递归调用 mediaRecorder.start() 以便每 5 秒,blob 将连续发射一次。

setInterval(function() 
        mediaRecorder.stop()
        mediaRecorder.start()
    , 5000);

客户端代码

var constraints =  audio: true ;
navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream) 
var mediaRecorder = new MediaRecorder(mediaStream);
mediaRecorder.onstart = function(e) 
    this.chunks = [];
;
mediaRecorder.ondataavailable = function(e) 
    this.chunks.push(e.data);
;
mediaRecorder.onstop = function(e) 
    var blob = new Blob(this.chunks,  'type' : 'audio/ogg; codecs=opus' );
    socket.emit('radio', blob);
;

// Start recording
mediaRecorder.start();

// Stop recording after 5 seconds and broadcast it to server
setInterval(function() 
    mediaRecorder.stop()
    mediaRecorder.start()
  , 5000);
);

// When the client receives a voice message it will play the sound
socket.on('voice', function(arrayBuffer) 
  var blob = new Blob([arrayBuffer],  'type' : 'audio/ogg; codecs=opus' );
  var audio = document.createElement('audio');
  audio.src = window.URL.createObjectURL(blob);
  audio.play();
);

服务器代码

socket.on('voice', function(blob) 
    // can choose to broadcast it to whoever you want
    socket.broadcast.emit('voice', blob);
);

【讨论】:

有没有办法不是每 5 秒执行一次,而是实时执行一次?像 1 毫秒? 我如何在 Java 中读取这个 blob?它看起来像一个 ebml 文件

在 node.js 中使用 socket.io 通过 webrtc 广播实时音频

】在node.js中使用socket.io通过webrtc广播实时音频【英文标题】:Broadcastingliveaudiothroughwebrtcusingsocket.ioinnode.js【发布时间】:2015-08-1119:02:59【问题描述】:我正在尝试使用webrtc通过getUserMedia()获取音频并使用socket.io将其发送到服务器... 查看详情

通过 socket.io 更新实时 d3 图表

】通过socket.io更新实时d3图表【英文标题】:Updaterealtimed3chartbysocket.io【发布时间】:2015-10-2017:30:18【问题描述】:我正在编写一个基于d3.js的实时图表指令。结构如下:myDirective.js:app.directive(\'myDirective\',function(socketio)returnrestric... 查看详情

节点(套接字)实时音频流/广播

...706:35:40【问题描述】:请问,是否有任何简单的方法可以通过NODE.js和可能的SOCKET.IO将媒体文件(ogg、mp3、spx..)从服务器流式传输(广播)到客户端(浏览器)?我必须在服务器端录制音频输入,然后才能为许多客户端实时播放... 查看详情

通过 Socket.IO 1.0 发送到具有 socketId 的特定客户端

】通过Socket.IO1.0发送到具有socketId的特定客户端【英文标题】:EmittoaspecificclientwithsocketIdviaSocket.IO1.0【发布时间】:2014-10-2405:53:27【问题描述】:我知道这是一个非常受欢迎的问题,但我没有找到我的问题的答案。非常相似的问... 查看详情

聊天功能插件socket.io(代码片段)

...时间的实时双向通讯库  基于websocket协议的  前后端通过时间进行双向通讯  配合express快速开发实时应用二、Socket.io和ajax区别  基于不同的网络协议  ajax基于http协议,单向,实时获取数据只能轮询  socket.io基于we... 查看详情

如何使用 node.js、socket.io 和 mysql 显示实时数据?

...新手,正在尝试向网页显示实时数据。我尝试做的是首先通过URL插入MySQL数据库。这是URL[http://localhost:4000/api/motor_deta 查看详情

Socket.io 1.0:配置关闭超时

】Socket.io1.0:配置关闭超时【英文标题】:Socket.io1.0:configureclosetimeout【发布时间】:2014-12-1513:14:35【问题描述】:如何使用以下代码配置“关闭超时”选项?varapp=require(\'express\')();varserver=require(\'http\').Server(app);vario=require(\'socket... 查看详情

在 Socket.IO 1.0 中配置超时和传输

】在Socket.IO1.0中配置超时和传输【英文标题】:ConfigureTimeOutandTransportsinSocket.IO1.0【发布时间】:2014-09-0108:08:38【问题描述】:在旧版本的Socket.IO(io.set("transports",["xhr-polling"]);io.set("closetimeout",3);但现在,io.set命令已被弃用。如何... 查看详情

socket.io在线聊天室

...是一个JavaScript库,用来建立实时的WebApp。socket.io可以通过npm安装到Node.js的应用中,同时浏览器和服务器拥有同样的API接口。你还在思考socket.io是如何做到实时推送的么?它会利用HTML5的新特性websocket协议与服务器建... 查看详情

使用 Socket.IO 和 NodeJS 实现音频聊天

】使用Socket.IO和NodeJS实现音频聊天【英文标题】:ImplementingAudiochatwithSocket.IOandNodeJS【发布时间】:2015-05-2207:09:57【问题描述】:我使用sails.js(node.js)和socket.IO创建了一个聊天应用程序。我需要同时实现audiochat和filetransfers。谁能... 查看详情

如何让我的音频在 socket.io 中播放?

】如何让我的音频在socket.io中播放?【英文标题】:HowdoIgetmyaudiotoplayinsocket.io?【发布时间】:2019-02-2703:55:25【问题描述】:我正在对我的socket.io聊天进行一些更新,并且我试图在每次传递消息时获取音频。当我发送消息时,我... 查看详情

socket.IO:当我在 socket.io 1.0 中向特定客户端发出信号时,如何获取 socketid

】socket.IO:当我在socket.io1.0中向特定客户端发出信号时,如何获取socketid【英文标题】:socket.IO:howcanigetthesocketidwheniemittoaspecificclientinsocket.io1.0【发布时间】:2014-07-3020:57:47【问题描述】:我想使用socket.io1.0向特定客户端发出操... 查看详情

如何在 socket.io 1.0 中获取房间的客户列表

】如何在socket.io1.0中获取房间的客户列表【英文标题】:Howtogetroom\'sclientslistinsocket.io1.0【发布时间】:2014-07-1413:08:08【问题描述】:我可以在socket.io0.9中使用此代码获取房间的客户列表。io.sockets.clients(roomName)如何在socket.io1.0中... 查看详情

socket.io入门原理

...eg;Flash®Socket大部分PC浏览器都支持的socket模式,不过是通过第三方嵌入到浏览器,不在W3C规范内,所以可能将逐步被淘汰,况且,大部分的手机浏览器都不支持这种模式。 AJAXlongpolling这个很好理解,所有浏览器都支持这种... 查看详情

实时应用:Socket.io vs Pusherapp

】实时应用:Socket.iovsPusherapp【英文标题】:Realtimeapps:Socket.iovsPusherapp【发布时间】:2011-04-2200:58:51【问题描述】:在Socket.io和Pusherapp之间进行选择时,您会考虑哪些因素?重要的考虑因素包括:与现有系统(如rails/django)的集... 查看详情

如何在 socket.io 1.0 中关闭服务器?

】如何在socket.io1.0中关闭服务器?【英文标题】:howdoIcloseaserverinsocket.io1.0?【发布时间】:2014-07-2012:32:11【问题描述】:有这样的骗局,但它们是针对库的先前版本的。好像代码变了。我正在像这样实例化一个套接字:this.socketL... 查看详情

向 Socket.IO 1.0 中的特定 ID 发送消息

】向Socket.IO1.0中的特定ID发送消息【英文标题】:SendingmessagetoaspecificIDinSocket.IO1.0【发布时间】:2014-07-2507:50:30【问题描述】:我想将数据发送到一个特定的套接字ID。我们过去可以在旧版本中做到这一点:io.sockets.socket(socketid).em... 查看详情

如何实时使用 vue-socket.io + vuex?

】如何实时使用vue-socket.io+vuex?【英文标题】:Howtousevue-socket.io+vuexforrealtime?【发布时间】:2020-07-1102:33:05【问题描述】:我有一个供稿,用户可以在其中对帖子进行投票服务器>node,express,socket.iov2.3.0服务器>app.jsclient.on(\'conn... 查看详情