错误视频流 socket.io + socket.io-流(超出最大调用堆栈大小)
Error video-stream socket.io + socket.io-stream (Maximum call stack size exceeded)
我正在尝试在 socket.io 和 socket.io-stream 的帮助下通过我的 node.js 服务器创建网络摄像头视频流。
我想在 /camera 中捕获视频,用视频打开一个流槽 socket.io(在 socket.io-stream 的帮助下),并在索引 [=71 上接收它=].
当我通过 /camera 连接到服务器并因此启动流时,服务器崩溃并出现错误 "RangeError: Maximum call stack size exceeded"。
错误似乎来自“/node_modules/socket.io/node_modules/has-binary/index.js:48:23”。
在示例中,我省略了大部分任意代码,因为 server/connection 可以很好地传输数据片段。
这是我当前的设置:
服务器:
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();
};
});
我无法在 server/index 上测试代码,因为当相机启动流时服务器崩溃。
有人知道这里出了什么问题吗?
很遗憾,您不能那样做。 socket.io-stream 库只处理静态文件,不处理实时视频流。
要共享视频流,您应该使用 WebRTC。有几个库可以帮助您入门:
值得注意的是,WebRTC 不会通过您的服务器传输视频(在大多数情况下)。它做的更多 - 它将视频流从一个对等点直接传输到另一个对等点,这有利于您的服务器带宽。但是当同行落后 symmetric NAT 时可能会出现问题。在这种情况下,视频流应该通过 TURN 服务器传输。
有关 WebRTC 的更多信息,您可以找到 here。
我正在尝试在 socket.io 和 socket.io-stream 的帮助下通过我的 node.js 服务器创建网络摄像头视频流。
我想在 /camera 中捕获视频,用视频打开一个流槽 socket.io(在 socket.io-stream 的帮助下),并在索引 [=71 上接收它=].
当我通过 /camera 连接到服务器并因此启动流时,服务器崩溃并出现错误 "RangeError: Maximum call stack size exceeded"。
错误似乎来自“/node_modules/socket.io/node_modules/has-binary/index.js:48:23”。
在示例中,我省略了大部分任意代码,因为 server/connection 可以很好地传输数据片段。
这是我当前的设置:
服务器:
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();
};
});
我无法在 server/index 上测试代码,因为当相机启动流时服务器崩溃。
有人知道这里出了什么问题吗?
很遗憾,您不能那样做。 socket.io-stream 库只处理静态文件,不处理实时视频流。
要共享视频流,您应该使用 WebRTC。有几个库可以帮助您入门:
值得注意的是,WebRTC 不会通过您的服务器传输视频(在大多数情况下)。它做的更多 - 它将视频流从一个对等点直接传输到另一个对等点,这有利于您的服务器带宽。但是当同行落后 symmetric NAT 时可能会出现问题。在这种情况下,视频流应该通过 TURN 服务器传输。
有关 WebRTC 的更多信息,您可以找到 here。