在Node.js服务器上的实时videostream

我一直在研究这个很多,但很沮丧,因为我觉得解决scheme应该很简单,尽pipe我知道不会。 理想情况下,我只想使用节点来承载服务器,webrtc getusermedia获取本地客户端上的实时stream,并使用像socket.io发送stream到服务器,然后服务器将stream广播到远程客户; 就好像它是一个简单的消息聊天应用程序。

考虑到这一点,这似乎是一种简单的方法,因为实况video需要连续发送大量的数据,这不等同于在事件发送之后发送单个消息甚至文件(发送button被按下) 。

也许我错了,然而,一个现场videostream应用程序遵循相同的节点/ socket.io信使应用程序的结构? 你会发送从getUserMedia返回的媒体对象,blob,一些二进制数据一些(我试过所有这些,但可能不正确)。

理想的目标是一个应用程序,使用尽可能less的额外绒毛 ,小npm安装,less额外的JavaScript库,或less许担心编码/解码或任何地狱ICE或STUN是。 有没有什么办法可以或者我要求太多?

理想的客户

var socket = io(); var local = document.getElementById("local_video"); var remote = document.getElementById("remote_video"); // display local video navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(stream) { local.src = window.URL.createObjectURL(stream); socket.emit("stream", stream); }).catch(function(err){console.log(err);}); // displays remote video socket.on("stream", function(stream){ remote.src = window.URL.createObjectURL(stream); }); 

理想服务器

 var app = require("express")(); var http = require("http").Server(app); var fs = require("fs"); var io = require("socket.io")(http); app.get('/', onRequest); http.listen(process.env.PORT || 3000, function() { console.log('server started'); }) //404 response function send404(response) { response.writeHead(404, {"Content-Type" : "text/plain"}); response.write("Error 404: Page not found"); response.end(); } function onRequest(request, response) { if(request.method == 'GET' && request.url == '/') { response.writeHead(200, {"Content-Type" : "text/html"}); fs.createReadStream("./index.html").pipe(response); } else { send404(response); } } io.on('connection', function(socket) { console.log("a user connected"); socket.on('stream', function(stream) { socket.broadcast.emit("stream", stream); }); socket.on('disconnect', function () { console.log("user disconnected"); }); }); 

这是行动中的破坏应用程序: https : //nodejs-videochat.herokuapp.com/

这是github上的破解代码: https : //github.com/joshydotpoo/nodejs-videochat

尽量做到清楚明确。 首先,您在这里没有使用WebRTC。 getUserMedia()是用于从相机获取媒体stream的导航器WebAPI的一部分。

使用WebRTC意味着您正在使用ICE和STUN / TURN服务器进行信号传输。 您将使用您的主机服务器(Node)来指定ICEconfiguration,标识每个用户并提供相互调用的方法。

如果你想通过你的主机进行stream式处理,可能你应该把它分成几块,build立自己的信令基础设施。 您可以使用Stream API与套接字io以块(数据包)stream式传输数据。 请参阅Stream API(socket.io)

另外,您可以在这里查看WebRTC + Socket.io的实例: Socket.io | WebRTCvideo聊天

你可以在这里find更多的信息: 发送媒体stream到主机服务器