Javascript 如何发现MediaRecorder.OnDataAvailable不再被调用的问题?
我正在使用Javascript 如何发现MediaRecorder.OnDataAvailable不再被调用的问题?,javascript,getusermedia,mediastream,web-mediarecorder,mediastreamtrack,Javascript,Getusermedia,Mediastream,Web Mediarecorder,Mediastreamtrack,我正在使用navigator.mediaDevices.getUserMedia()捕获用户的音频和视频,然后使用MediaRecorder及其ondataavailable本地存储该视频和音频块,以便稍后上载 现在我正在处理一个问题,由于某种原因,ondataavailable在录制过程中停止被调用。我不知道为什么,也没有收到任何出错的警报。那么首先,有人知道为什么会发生这种情况,以及如何捕捉错误吗 第二,我试图复制。通过做这样的事情 navigator.mediaDevices.getUse
navigator.mediaDevices.getUserMedia()
捕获用户的音频和视频,然后使用MediaRecorder
及其ondataavailable
本地存储该视频和音频块,以便稍后上载
现在我正在处理一个问题,由于某种原因,ondataavailable
在录制过程中停止被调用。我不知道为什么,也没有收到任何出错的警报。那么首先,有人知道为什么会发生这种情况,以及如何捕捉错误吗
第二,我试图复制。通过做这样的事情
navigator.mediaDevices.getUserMedia({ audio: true, video: true })
.then(function(camera) {
local_media_stream = camera;
camera.getVideoTracks()[0].onended = function() { console.log("VIDEO ENDED") }
camera.getAudioTracks()[0].onended = function() { console.log("Audio ENDED") }
camera.onended = function() { console.log("--- ENDED") }
camera.onremovetrack = (event) => { console.log(`${event.track.kind} track removed`); };
}).catch(function(error) {
alert('Unable to capture your camera. Please check logs.' + error);
console.error(error);
});
并使用
recorder = new MediaRecorder(local_media_stream, {
mimeType: encoding_options,
audioBitsPerSecond: 128000,
videoBitsPerSecond: bits_per_second,
});
recorder.ondataavailable = function(e) {
save_blob(e.data, blob_index)
blob_index++;
}
recorder.onstop = function(e) {
console.log("recorder stopped");
console.log(e)
}
recorder.onerror = function(error) {
console.log("recorder error");
alert(error)
throw error;
}
recorder.onstart = function() {
console.log('started');
};
recorder.onpause = function() {
console.log('paused');
};
recorder.onresume = function() {
console.log('resumed');
};
recorder.start(15000)
然后,我尝试手动终止流,希望通过执行
local_media_stream.getVideoTracks()[0].stop()
现在不再调用ondataavailable
,但未调用任何已命名事件。录制仍在进行,本地媒体流
仍处于活动状态
如果我也把音频关掉
local_media_stream.getAudioTracks()[0].stop()
现在,local\u media\u流
未处于活动状态,但仍没有调用任何事件,告诉我流已停止,记录器仍在运行,但从未调用ondatavaailable
我能做什么?我想知道本地流正在被成功录制,如果没有被提醒,那么我至少可以通知用户录制不再保存。MediaRecorder有一个。我没有看到您在示例代码中调用它。试着叫它
当您对媒体流的曲目调用track[n].stop()
时,您会告诉他们停止向MediaRecorder提供数据。因此,毫不奇怪,MediaRecorder停止生成其编码输出流
如果你在Google Chrome上运行,你也可以尝试比你的
记录器.start(15000)
更短的时间片。或者通过使用强制交付您的数据可用
事件。停止两个曲目应停止您的录音机,它在FF和Chrome中对我都起作用:
但是你的用户自己调用stop()
是不可能的。最有可能的问题不在MediaRecorder中,而是在MediaStream的曲目中 所有曲目都已静音的MediaRecorder不会发出新的dataavailable事件,因为从它的角度来看,仍有一些事情可能发生,曲目可能随时取消静音 例如,假设一个具有硬件一键通功能的麦克风,每次用户释放此类按钮时,该麦克风的音轨都会静音,但MediaRecorder即使在此期间不会录制任何内容,也必须增加其内部计时,以便“间隙”不会“粘”在最终媒体上。但是,由于它没有向其图形传递任何内容,因此它既不会发出新的dataavailable事件,也不会在将发出的下一个块中调整时间戳 对于您试图找出问题来源的案例,您可以尝试收听MediaRecorder的,在某些情况下它可能会触发 但您也应该明确地将事件添加到其流的每个轨道中,并且不要忘记:
recorder.stream.getTracks().forEach((曲目)=>{
track.onmute=track.onended=console.warn;
};
但如果您只停止()视频曲目、ondataavailable将不再被调用,onended回调将不再被调用。这是我对正在发生的事情的猜测,但我甚至不知道。@John AFK现在所以我不能重复检查,但如果你只停止其中一个曲目,录像机仍应记录另一个曲目是。但无论如何,你的用户不是在说。stop()
在他们结束时发生了其他事情,请使用我在回答中提到的事件来了解那里发生了什么。@John我可以尝试,但Chrome确实有问题,我将打开一个问题。根据规格,他们应该继续录制“直到所有曲目结束”(Firefox正确完成)。目前,您可以通过处理"结束了“所有曲目的事件,然后为了确保您面临错误,您可以在两次调用之间有一定延迟的情况下调用recorder.requestData两次。如果第二次调用导致dataavailableevent.data为空,则错误发生。@John I打开了Thank@Kaido!另一方面,您不知道为什么iPad上的视频会因您而变黑?:)我正试图解决另一个问题,但似乎没有多少人太有知识。希望你有想法!是的,我不打电话给录音机。由于某些原因,用户的记录器不再触发ondataavailable事件。我怀疑他们的媒体流出了问题。我唯一可以复制的方法是停止视频流,并且不会为曲目和录像机触发onended事件。onstop也不会被调用。