我想录制用户麦克风 5 秒长的片段并将每个片段上传到服务器。我尝试使用 MediaRecorder 并以 5 秒的时间间隔调用 start() 和 stop() 方法,但是当我连接这些录音时,之间会发出“滴”声。所以我尝试使用 start() 方法的 timeslice 参数记录 5 秒的片段:
navigator.mediaDevices.getUserMedia({ audio: { channelCount: 2, volume: 1.0, echoCancellation: false, noiseSuppression: false } }).then(function(stream) {
const Recorder = new MediaRecorder(stream, { audioBitsPerSecond: 128000, mimeType: "audio/ogg; codecs=opus" });
Recorder.start(5000);
Recorder.addEventListener("dataavailable", function(event) {
const audioBlob = new Blob([event.data], { type: 'audio/ogg' });
upload(audioBlob);
});
});
但只有第一部分可以播放。我能做什么,或者如何使所有斑点都可以播放?
我必须录制然后上传每个片段。我无法制作 blob 数组(因为用户可以记录 24 小时甚至更多的数据,并且在用户记录时需要将数据上传到服务器 - 有 5 秒的延迟)。
谢谢你!
您必须了解媒体文件是如何构建的。
它不仅仅是一些可以直接转换为音频或视频的原始数据。
这取决于所选的格式,但基本情况是您拥有所谓的格式metadata它们就像一本描述文件结构的字典。
These metadata对于随后读取文件的软件来说,这些信息是必要的,以了解它应该如何解析文件中包含的实际数据。
MediaRecorder API 在这里处于一个奇怪的位置,因为它必须能够同时写入这些metadata,并添加未确定的数据(它是live录音机)。
所以发生的情况是浏览器会将 mainmetadata在文件的开头,他们将能够简单地将新数据推送到文件,并且仍然是一个有效的文件(即使某些信息(例如持续时间)会丢失)。
现在,你得到了什么datavailableEvent.data
只是正在生成的整个文件的一部分。
第一个通常包含metadata以及一些其他数据,具体取决于事件被告知触发的时间,但接下来的部分不一定包含任何元数据。
因此,您不能仅将这些部分作为独立文件获取,因为生成的唯一文件是由所有这些部分组成的文件,这些部分连接在一起形成一个 Blob。
因此,对于您的问题,您有不同的可能方法:
-
您可以将一段时间内从记录器获得的最新切片发送到服务器,并在服务器端合并这些切片。
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.ondataavailable = e => chunks.push(e.data);
recorder.start(); // you don't need the timeslice argument
setInterval(()=>{
// here we both empty the 'chunks' array, and send its content to the server
sendToServer(new Blob(chunks.splice(0,chunks.length)))
}, 5000);
在服务器端,您可以将新发送的数据附加到正在录制的文件中。
-
另一种方法是生成许多小的独立文件,为此,您可以简单地在一个时间间隔内生成一个新的 MediaRecorder:
function record_and_send(stream) {
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.ondataavailable = e => chunks.push(e.data);
recorder.onstop = e => sendToServer(new Blob(chunks));
setTimeout(()=> recorder.stop(), 5000); // we'll have a 5s media file
recorder.start();
}
// generate a new file every 5s
setInterval(record_and_send, 5000);
这样做,每个文件将是独立的,持续时间约为 5 秒,您将能够逐个播放这些文件。
现在,如果您只想在服务器上存储单个文件,仍然使用此方法,您也可以在服务器端将这些文件合并在一起,例如使用类似的工具ffmpeg.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)