我尝试在socket.io和socket.io-stream的帮助下通过我的node.js服务器创建网络摄像头视频流。
我想在/ camera中捕获视频,在视频中通过socket.io(在socket.io-stream的帮助下)打开一个流,然后在索引URL上接收它。
当我连接到服务器槽/摄像头,从而启动流时,服务器崩溃并出现错误" RangeError:超出最大调用堆栈大小"。
错误似乎来自" /node_modules/socket.io/node_modules/has-binary/index.js:48:23"。
在示例中,我遗漏了大部分任意代码,因为服务器/连接在传输数据snippits时工作正常。
这是我目前的设置:
服务器
io.on('connection', function(socket) {
ioStream(socket).on('videoStream', function(stream, data) {
socket.broadcast.emit('videoStream', stream);
});
});

相机
window.glob_socket = io();
var video = document.getElementById('camera');
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia({
audio: false,
video: {
width: 320,
height: 240
}
}, function(videoStream) {
// Local preview
video.src = window.URL.createObjectURL(videoStream);
video.onloadedmetadata = function(e) {
video.play();
};
// Stream
var stream = ss.createStream();
ss(glob_socket).emit('videoStream', stream, videoStream);
fs.createReadStream(videoStream).pipe(stream);
}, function(err) {
console.log("The following error occurred: " + err.name);
});
} else {
console.log("getUserMedia not supported");
}

索引
var video = document.getElementById('camera');
ss(glob_socket).on('videoStream', function(stream) {
video.src = window.URL.createObjectURL(stream);
video.onloadedmetadata = function(e) {
video.play();
};
});

我无法测试服务器/索引上的代码,因为当摄像头启动流时服务器崩溃。
任何人都知道这里有什么问题?
答案 0 :(得分:2)
不幸的是,你无法做到这一点。 socket.io-stream库仅处理静态文件,但不处理实时视频流。
要分享视频流,您应该使用WebRTC。有几个库可以帮助您入门:
值得注意的是,WebRTC不会通过您的服务器传输视频(在大多数情况下)。它做得更多 - 它直接将视频流从一个对等端传输到另一个对等端,这对您的服务器带宽有利。但是当同伴落后symmetric NAT时可能会出现问题。在这种情况下,视频流应通过TURN服务器传输。
有关WebRTC的更多信息,您可以找到here。