我一直在研究这个问题,但我很沮丧,因为我觉得解决方案应该简单,虽然我知道不会。理想情况下,我只想使用node来托管服务器,webrtc getusermedia来获取本地客户端上的实时流,并使用类似socket.io的内容将流发送到服务器,然后服务器将流广播到远程服务器客户;好像它是一个简单的消息聊天应用程序。
考虑到这一点,这似乎是一种简单的方法,因为实时视频需要连续发送大量数据,这并不等于在事件发送后发送单个消息甚至文件(发送)按下按钮)。
也许我错了,但是直播视频流应用程序是否可以遵循node / socket.io messenger应用程序的相同结构?你会发送从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
答案 0 :(得分:16)
尽量清楚明确。 首先,您没有在这里使用WebRTC。 getUserMedia()是您用于从相机获取媒体流的导航器WebAPI 的一部分。
使用WebRTC意味着您正在使用ICE和STUN / TURN服务器进行信令。您将使用主机服务器(节点)来指定ICE配置,识别每个用户并提供相互呼叫的方式。
如果您想通过主机流式传输,可能应该将其以块的形式流式传输并设置自己的信令基础架构。您可以将Stream API与套接字io一起使用来以块(数据包)的形式传输数据。见Stream API(socket.io)
此外,您可以在此处查看WebRTC + Socket.io的实例:Socket.io | WebRTC Video Chat
您可以在此处找到更多信息:sending a media stream to Host server