我一直在谷歌周围,但找不到一个明确的答案。
我正在制作一个记录标签的chrome扩展。这个想法是使用Websockets(特别是Socket.io)将getUserMedia流式传输到后端,后端写入文件,直到特定条件(后端中的值)被设置。
问题是,我不知道如何使用特定的ID调用后端,也不知道如何正确地写入文件而不破坏它?
您正在通过websocket将MediaRecorder的输出发送到后端。
您可以在MediaRecorder的ondataavailable
处理程序中执行此操作。
很容易把这些数据塞进websocket:
function ondataavailable ( event ) {
event.data.arrayBuffer().then ( buf => {socket.emit('media', buf) })
}
在后端,您必须按照接收的顺序将接收到的所有数据连接到媒体文件。该媒体文件可能具有视频/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')