【问题标题】:Error video-stream socket.io + socket.io-stream (Maximum call stack size exceeded)错误视频流 socket.io + socket.io-stream(超过最大调用堆栈大小)
【发布时间】:2016-02-05 10:52:07
【问题描述】:

我正在尝试在 socket.io 和 socket.io-stream 的帮助下通过我的 node.js 服务器创建一个网络摄像头视频流。

我想在 /camera 中捕获视频,通过 socket.io(在 socket.io-stream 的帮助下)打开一个带有视频的流,并在索引 url 上接收它。

当我通过 /camera 连接到服务器并因此启动流时,服务器崩溃并出现错误“RangeError:超出最大调用堆栈大小”。

错误似乎来自“/node_modules/socket.io/node_modules/has-binary/index.js:48:23”。

在示例中,我省略了大部分任意代码,因为服务器/连接在传输数据片段时工作正常。

这是我目前的设置:

服务器:

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();
  };
});

我无法测试服务器/索引上的代码,因为当相机启动流时服务器崩溃。

有人知道这里出了什么问题吗?

【问题讨论】:

    标签: node.js socket.io video-streaming webrtc


    【解决方案1】:

    很遗憾,您不能这样做。 socket.io-stream 库只处理静态文件,不处理实时视频流。

    要共享视频流,您应该使用 WebRTC。有几个库可以帮助您入门:

    值得注意的是,WebRTC 不会通过您的服务器传输视频(在大多数情况下)。它做得更多——它将视频流从一个对等点直接传输到另一个对等点,这对您的服务器带宽有好处。但是当同行落后于symmetric NAT 时可能会出现问题。在这种情况下,视频流应通过 TURN 服务器传输。

    有关 WebRTC 的更多信息,您可以找到here

    【讨论】:

    • 谢谢!觉得没有视频流演示有点奇怪。
    • @IbeVanmeenen 如果您不介意我会问,您是如何解决的请分享您的经验,我遇到了几乎完全相同的问题?
    • @ASahra,不幸的是,我还没有在这个项目上走得更远,所以我没有解决方案。但我确实会选择 WebRTC 连接(也许socket.io/blog/socket-io-p2p 可以)。
    • 这有多少可能?如果我想获取 getusermedia 输出,它是一个 blob 对象,对吗?并将其转换为二进制,然后使用套接字将其发送到服务器,然后在服务器端我获取二进制数据,然后从中创建一个 blob,结果应该被流式传输?如果我错了,请纠正我,我是流媒体新手等等。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2018-12-08
    • 2011-08-31
    相关资源
    最近更新 更多