如何解决如何发现不再调用 MediaRecorder.ondataavailble 的问题?
我正在使用 navigator.mediaDevices.getUserMedia()
捕获用户的音频和视频,然后使用 MediaRecorder
及其 ondataavailable
在本地存储该视频和音频 blob,以便稍后上传。
现在我正在处理一个问题,即由于某种原因 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
仍处于活动状态。
如果我也关闭音频
local_media_stream.getAudioTracks()[0].stop()
现在 local_media_stream
未处于活动状态,但仍然没有调用任何事件,告诉我流停止并且记录器仍在运行,但从未调用 ondatavailable
。
我能做什么?我想知道本地流正在成功录制,如果没有收到警报,我至少可以通知用户录制不再保存。
解决方法
MediaRecorder 有一个 recorder.stop() method。我没有看到您在示例代码中调用它。尝试调用它。
当您在媒体流的轨道上调用 track[n].stop()
时,您告诉他们停止向 MediaRecorder 提供数据。因此,不出所料,MediaRecorder 停止生成其编码输出流。
如果您在 Google Chrome 上运行,您也可以尝试比 recorder.start(15000)
更短的时间片。或者使用 recorder.requestData()
强制传递您的 dataavailable
事件。
停止两个轨道应该停止你的录音机,这对我来说在 FF 和 Chrome 中都是如此:https://jsfiddle.net/gpt51d6y/
但您的用户不太可能自己调用 stop()
。
问题很可能不在 MediaRecorder 中,而在 MediaStream 的轨道中。
一个所有轨道都被静音的 MediaRecorder 不会发出新的 dataavailable 事件,因为从它的角度来看,仍有可能发生的事情,轨道可能随时取消静音。
以具有硬件一键通功能的麦克风为例,每次用户释放此类按钮时,该麦克风的音轨都会静音,但是 MediaRecorder,即使它赢了在此期间不记录任何内容,仍然必须增加其内部计时,以便“间隙”不会“粘在”最终媒体中。然而,由于它没有传递给它的图形,它也不会发出新的 dataavailable 事件,它只会调整下一个将被发出的块中的时间戳。
对于您尝试查找问题出处的情况,您可以尝试侦听 MediaRecorder 的 error event,它在某些情况下可能会触发。
但您也绝对应该向其流的每个轨道添加事件,并且不要忘记 mute event:
recorder.stream.getTracks().forEach( (track) => {
track.onmute = track.onended = console.warn;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。