Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何发现MediaRecorder.OnDataAvailable不再被调用的问题?_Javascript_Getusermedia_Mediastream_Web Mediarecorder_Mediastreamtrack - Fatal编程技术网

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也不会被调用。