Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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 暂停getUserMedia返回的流_Javascript_Html_Html5 Video_Getusermedia - Fatal编程技术网

Javascript 暂停getUserMedia返回的流

Javascript 暂停getUserMedia返回的流,javascript,html,html5-video,getusermedia,Javascript,Html,Html5 Video,Getusermedia,我已经将getUserMedia返回的流引导到html页面中的元素,现在可以在该元素中看到视频。问题是,如果我暂停视频元素控件中的视频,然后在x秒后恢复,那么视频元素中显示的计时器将跳到pauseTime+x秒。我猜这是因为在视频元素中暂停播放时,流没有暂停。如果是这样,我们也可以暂停流。免责声明 这个答案回答了另一个问题… 当时我误解了OP的问题,并假设他们想“暂停”流,以便稍后能够在同一时间点恢复流。 其中所有出现的“暂停”都采用了这个定义,与OP是否愿意停止流向MediaElement的c

我已经将getUserMedia返回的流引导到html页面中的
元素,现在可以在该元素中看到视频。问题是,如果我暂停视频元素控件中的视频,然后在x秒后恢复,那么视频元素中显示的计时器将跳到pauseTime+x秒。我猜这是因为在视频元素中暂停播放时,流没有暂停。如果是这样,我们也可以暂停流。

免责声明 这个答案回答了另一个问题… 当时我误解了OP的问题,并假设他们想“暂停”流,以便稍后能够在同一时间点恢复流。
其中所有出现的“暂停”都采用了这个定义,与OP是否愿意停止流向MediaElement的currentTime提供数据没有多大关系。对于这种情况,请参阅其他答案。 (我自己无法删除此项,因为它当前已被接受)


这就是流的本质,你不能暂停它们

但是,您可以做的是缓冲这个流,并播放您缓冲的内容

要通过MediaStream实现这一点,您可以使用API以及

但是请注意,现在,您显然会得到比直接读取流时更多的延迟

navigator.mediaDevices.getUserMedia({
视频:真的
})
。然后(流=>{
const mediaSource=new mediaSource();
让数据,源缓冲区;
vid.src=URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen',sourceopen);
常量记录器=新媒体记录器(流{
mimeType:'video/webm;codecs=“vp8”'
});
常量块=[];
recorder.ondataavailable=e=>push(e.data);
功能推送(数据){
如果(mediaSource.readyState!=“打开”)返回;
设fr=newfilereader();
fr.onload=e=>sourceBuffer.appendBuffer(fr.result);
fr.readAsArrayBuffer(新Blob([数据]);
}
函数sourceOpen(3;){
记录器。启动(50);
sourceBuffer=mediaSource.addSourceBuffer('video/webm;codecs=“vp8”);
视频播放();
}
});
看起来可以切换以临时暂停视频流

MediaStreamTrack接口上的enabled属性是一个布尔值,如果允许轨迹呈现源流,则为true;如果不允许,则为false。这可用于故意使轨迹静音。启用时,轨迹数据从源输出到目标;否则,将输出空帧

//使用'await',记住根据需要使用'async function(){}',或者切换到Promise()。然后()如果需要。。。
const myStream=await navigator.mediaDevices.getUserMedia({audio:true,video:true})
const myTracks=myStream.getTracks();
const myAudio=myTracks.filter(track=>track.kind==“audio”)[0];
const myVideo=myTracks.filter(track=>track.kind==“视频”)[0];
功能切换TrackMute(轨道){
track.enabled=!track.enabled;
log(`${track.enabled?'unmuted':'muted'}track.kind`);
}
切换TrackMute(myAudio)

这解决了问题,但我发现有一点是错误的,暂停一次会使视频开始显示陈旧的录制,摄像机前面的任何内容都不再包含在视频元素中,我们是否可以跳过暂停视频时的缓冲区。@MohdRizwan你是什么意思?你在这条评论中描述的只是显示媒体流的默认行为,不是吗?但是你想要的是完全禁用暂停吗?@Rizvan显然我在回答问题时误解了你的问题,你能接受吗?斯坦·詹姆斯的答案似乎更适合你的需要。@Kaido,你可以更新你的答案,以反映你在回答一个关于如何在这个特定意义上停顿的问题的特定观点,并指向另一个答案(并删除“您不能暂停流”的语句,这可能会误导阅读已接受答案第一句的人)。