我想将从网络摄像头捕获的视频保存到本地文件。到目前为止,我已经能够:
getUserMedia
RecordRTC
RecordRTC
我无法弄清楚如何将视频保存到文件中。在save()
上调用RecordRTC
可以让我下载视频文件,但我想在nodejs中发生所有事情以便进一步处理。无论如何,该文件都是可播放的。我试图将blob和dataURL写入文件,但该文件无法播放。
答案 0 :(得分:3)
我从未使用过RecordRTC。 使用本机(JavaScript)MediaRecorder API进行记录 我写了sample
答案 1 :(得分:2)
在Chromium中实现的MediaRecorder类以及因此在Electron中实现的类可以单独支持您的用例,除了将媒体写入本地文件的部分。据我所知,使用任何标准化的Web API都无法实现后一种功能,但是由于Electron嵌入了Node.js,因此不仅可以实现,而且可以说是微不足道的:
navigator.mediaDevices.getUserMedia().then(function(stream) {
const recorder = new MediaRecorder(stream);
const blob_reader = new FileReader();
const storage_stream = require("fs").createWriteStream(path);
const blobs = [];
blob_reader.addEventListener("load", function(ev) {
storage_stream.write(Buffer.from(ev.currentTarget.result));
if(blobs.length) {
ev.currentTarget.readAsArrayBuffer(blobs.shift());
}
});
recorder.addEventListener("dataavailable", function(ev) {
if(blob_reader.readyState != 1) {
blob_reader.readAsArrayBuffer(ev.data);
} else {
blobs.push(ev.data);
}
});
});
将我认为是将Blob
对象转换为ArrayBuffer
等价物的技术上可消耗且不希望(但必要)的步骤简而言之,这与API实现本身一样有效-JavaScript机器本身这里没有繁重的工作。
MediaRecorder.start
方法的调用来实际启动媒体记录器之前,将没有任何动作。请注意,如果需要,可以使该代码段与多个生成的Blob配合使用-视情况而定,使用1秒的时间片(start
的第一个参数)可能是个好主意。这样的时间片允许您进行适当的数据流传输,而不是将潜在的巨大单点编码视频流存储在进程内存中(如果您将{{1}省略了timeslice
参数,则会得到此结果) })。start
调用(带有时间片),生成的文件将开始在“磁盘上”增长,这取决于时间片的值和中间缓冲区的长度。start
对象生成blobs,由于某种原因,它不被许多其他API所“消耗”,因此我们必须将它们转换为易消耗的东西,在这种情况下,对于我们的ArrayBuffer
类来说更方便。MediaRecorder
为我们提供了一个Node.js模块,“ fs”不是您的Web浏览器中其他可用的模块,至少不是根据我所知道的Web标准草案。但是,这就是该模块,它使我们可以将所得的数组缓冲区转储到文件中。require("fs")
不仅令人眼花-乱-Web API空间中没有Buffer.from(...)
类,它是一个能够包装{{ 1}}作为视图(无数据复制)。这是必要的,因为您不能直接将Buffer
写入文件流。ArrayBuffer
或ArrayBuffer
)。.webm
但是可以通过对这些文件建立索引并进行相应的修补来对这些文件进行简单的后处理。我认为这样的步骤是可选的-传输流没有天生就错,就像上面的代码片段生成的一样。.mp4
的{{1}}变量表示要将视频保存到的文件的路径。该变量未在代码段中声明或定义,但显然必须如此。我已经在Windows 10上使用3.0.4版本的Electron测试了代码段。