您正在通过 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')