【发布时间】:2021-11-02 12:06:47
【问题描述】:
我目前正在使用MediaRecorder 从用户的网络摄像头/麦克风中获取视频流的块,如下所示:
navigator.mediaDevices
.getUserMedia({audio: true, video: true})
.then((stream) => {
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(5000);
mediaRecorder.ondataavailable = (blobEvent) => {
console.log('got 5 seconds of stream', blobEvent);
}
})
这会每 5 秒发出一段视频流,但是,我想要特定大小的块,而不是长度。似乎没有一个明确的方法可以做到这一点,因为我无法在不开始新块的情况下检查当前块的大小,而且事后我也无法将它们组合起来。这是我想出的解决方法,使用 2 个媒体记录器:
const MIN_BLOB_SIZE = 5000000;
var partSize = 0;
navigator.mediaDevices
.getUserMedia({audio: true, video: true})
.then((stream) => {
var mediaRecorder = new MediaRecorder(stream);
var mediaRecorder2 = new MediaRecorder(stream)
mediaRecorder.start();
mediaRecorder2.start(5000)
mediaRecorder2.ondataavailable = (blobEvent) => {
console.log('got 5 seconds of data', blobEvent)
const blob = blobEvent.data
partSize += blob.size;
if (partSize >= MIN_BLOB_SIZE) {
partSize = 0;
mediaRecorder.requestData();
}
}
mediaRecorder.ondataavailable = (blobEvent) => {
console.log('got a chunk at least 5mb', blobEvent);
};
});
但这感觉很麻烦,提供不精确的块,需要我确保这两个记录器完全同步,使错误处理/边缘情况复杂化,而且我担心使用 2 个媒体记录器的性能影响。会接受使用一个媒体记录器完成此任务的答案,或者,如果这不可能,如果有人可以说服我 2 个媒体记录器在性能方面表现良好,我也会接受并处理它带来的复杂性。
【问题讨论】:
标签: javascript typescript navigator web-mediarecorder