我已经做了很多研究,但感到沮丧,因为我觉得解决方案应该很简单,但我知道不是。理想情况下,我只想使用node来托管服务器,webrtc获取用户在本地客户端上的实时流,并使用类似socket.io的东西将流发送到服务器,然后服务器会将流广播到远程客户端;就像是一个简单的消息聊天应用程序。
再仔细考虑一下,这种简单的方法似乎是不可能的,因为直播视频需要连续发送大量的数据,这与发送单个消息甚至文件不相等(事件后发送按钮按下)。
也许我错了,直播视频流应用程序是否可以遵循与节点/ socket.io消息传递应用程序相同的结构?您会发送从getUserMedia返回的媒体对象,blob,某些二进制数据(我已经尝试了所有这些,但可能不正确)。
理想目标是使用最少的额外组件,npm安装尽可能少,尽可能少的额外JavaScript库,或者很少担心编码/解码或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