5

我正在开发一个屏幕捕获应用程序,并且能够让ondataavailable事件工作并以块的形式获取数据,我将其进一步转换为 blob,但是当我通过 websocket 将相同的数据流发送到服务器并将流保存为 webm 文件时磁盘并稍后播放文件,该文件不播放任何内容。我认为该文件需要一些我不确定的元信息。

有什么建议么?

这是我的 JavaScript 代码:

socket.emit('message', new Blob([event.data], {type: 'video/webm'}));

服务器保存代码:

fs.writeFile("d://test.webm", data, "binary", function(err) { });

4

2 回答 2

3

dataavailable事件返回一个——一段录音——并多次触发。一个事件不可能包含整个记录。

将来自多个事件的数据合并到一个chunks数组中,然后在您停止记录后,将整个数组合并到一个新的Blob. 这会产生一个适合我的文件:

const rec = new MediaRecorder(stream), chunks = [];
rec.ondataavailable = e => chunks.push(e.data);
rec.start();
await new Promise(r => setTimeout(r, 10000)); // wait 10 seconds
rec.stop();
await new Promise(r => rec.onstop = r);
const blob = new Blob(chunks);
link.href = URL.createObjectURL(blob);

工作演示:https ://jsfiddle.net/jib1/pkc16k9r/

于 2018-12-23T17:50:16.540 回答
0

您可以使用 RecordRTC

timeSlice:10000, ondataavailable: function(b){ 每 10000 秒触发一次,但所有元数据仅在第一个文件中}

于 2020-07-07T09:47:43.983 回答