通过 Socket IO 从 Screen 发送数据?

Sending data from Screen over Socket IO?

我一直在谷歌搜索,但找不到明确的答案。

我正在制作一个 chrome 记录标签的扩展。这个想法是使用 Websockets(特别是 Socket.io)将 getUserMedia 流式传输到后端,后端写入文件直到设置特定条件(后端中的值)。

问题是,我不知道如何调用具有特定 ID 的后端,以及如何在不损坏文件的情况下正确写入文件?

您正在通过 websocket 将 MediaRecorder 的输出发送到您的后端。

大概您是从 MediaRecorder 的 ondataavailable 处理程序中执行此操作的。

将数据填充到 websocket 中非常容易:

function ondataavailable ( event ) {
  event.data.arrayBuffer().then ( buf => {socket.emit('media', buf) })
}

在后端,您必须按照接收顺序将收到的所有数据连接到一个媒体文件中。此媒体文件可能具有 video/webm MIME 类型;如果你给它 .webm 文件扩展名,大多数媒体播放器都能正确处理它。请注意,如果媒体文件未按顺序包含所有 Blob,则该文件将毫无用处。前几个 Blob 包含理解流所需的元数据。通过将每个接收到的数据项附加到文件中可以很容易地做到这一点。

服务器端可以使用socket.id属性来组成文件名;为每个套接字连接提供一个唯一的文件。像这种低级性能不佳的非调试非生产就绪代码就可以做到这一点。

io.on("connection", (socket) => {
  if (!socket.filename) 
     socket.filename = path.join(__dirname, 'media', socket.id + '.webm))

  socket.on('filename', (name) => {
     socket.filename = path.join(__dirname, 'media', name + '.webm))
  })
  socket.on('media', (buf) => {
    fs.appendFile(buf, filename)
  })
})

在客户端你可以用这个设置文件名。

socket.emit('filename', 'myFavoriteScreencast')