我正在使用 捕获用户的音频和视频,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()
Nowondataavailable
不再被调用,但没有任何 onended 事件被调用。录制仍在进行中,并且local_media_stream
仍然处于活动状态。
如果我也杀死音频
local_media_stream.getAudioTracks()[0].stop()
现在local_media_stream
未激活,但仍然没有调用事件,告诉我流停止并且记录器仍在运行,但从ondatavailable
未被调用。
我能做些什么?我想知道本地流正在成功录制,如果没有收到警报,我至少可以通知用户录制不再保存。