关键词:
【中文标题】通过 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... 查看详情