关于javascript:停止/关闭由navigator.mediaDevices.getUserMedia打开的网络摄像头流 |
您所在的位置:网站首页 › 摄像头怎么取消共享权限 › 关于javascript:停止/关闭由navigator.mediaDevices.getUserMedia打开的网络摄像头流 |
我使用以下JavaScript代码打开了摄像头: 1const stream = await navigator.mediaDevices.getUserMedia({ /* ... */ });是否有任何JavaScript代码可停止或关闭网络摄像头?谢谢大家。 编辑 由于最初发布了此答案,因此浏览器API已更改。 .stop()在传递给回调的流上不再可用。 开发人员将必须访问组成流(音频或视频)的Rails,并分别停止每个Rails。 此处提供更多信息:https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=zh-CN#stop-ended-and-active 示例(来自上面的链接): 123stream.getTracks().forEach(function(track) { track.stop(); });浏览器支持可能有所不同。 原始答案 navigator.getUserMedia在成功回调中为您提供一个流,您可以在该流上调用.stop()停止记录(至少在Chrome中,似乎FF不喜欢它) 相关讨论 我认为stream.stop()不适用于chrome,mediaRecorder.stop()会停止录制,而不会停止浏览器提供的流。你能看一下这个stackoverflow.com/questions/34715357/… @Muntu,我认为这取决于我,stream.stop()正在运行(适用于Chrome)。因为我有一个webRTC流。那么,如果您正在浏览器中进行录制,那么MediaRecorder.stop()会起作用吗? 是的,但这引起了另一个问题。允许录制几秒钟/分钟后,应发生此停止录制的功能。您如何控制它:在默认的录制时间后将其停止?谢谢! 这将停止流,但是在Chrome重新加载之前,Chrome上的视频指示器仍保持活动状态。有没有办法删除它呢? @Cyber??supernova您是否找到了解决方案?我认为页面刷新可能有效 @samayo不,我没有找到任何内容,我无法重新加载页面 @Muthu-此答案的最新示例似乎是在所有可用Rails上单独调用track.stop()。当我使用andrei的新代码时,记录似乎"停止",并且流被馈入全零,但是当我调用getUserMedia时注册的成功处理程序不会停止运行。你是这个意思吗?使用以下任何功能: 1234567891011121314151617181920212223242526// stop both mic and camera function stopBothVideoAndAudio(stream) { stream.getTracks().forEach(function(track) { if (track.readyState == 'live') { track.stop(); } }); } // stop only camera function stopVideoOnly(stream) { stream.getTracks().forEach(function(track) { if (track.readyState == 'live' && track.kind === 'video') { track.stop(); } }); } // stop only mic function stopAudioOnly(stream) { stream.getTracks().forEach(function(track) { if (track.readyState == 'live' && track.kind === 'audio') { track.stop(); } }); } 相关讨论 谢谢你mediaStream.stop已被弃用。 @DanBrown您的解决方案是什么? 我强烈建议不要修改本机API的原型,以恢复已正式弃用并从浏览器中删除的功能。它是不规则的,以后可能会引起混乱。当您需要停止流中的所有Rails时,为什么不只是stream.getTracks().forEach(track => { track.stop() })?或者,如果您确实经常进行此操作以证明速记的合理性,则可以始终定义诸如stopAllTracks(stream)之类的辅助函数。不使用stream.stop(),已弃用 MediaStream弃用 使用stream.getTracks().forEach(track => track.stop()) 相关讨论 非常感谢您,它的工作状况完全正常,由于折旧,这使人们感到困惑的是哪个人在工作,但是截至2019年3月,上述解决方案在chrome中效果很好。 如何恢复赛道?FF,Chrome和Opera现在已开始通过navigator.mediaDevices公开getUserMedia(可能更改:) 在线演示 12345678910111213141516navigator.mediaDevices.getUserMedia({audio:true,video:true}) .then(stream => { window.localStream = stream; }) .catch( (err) =>{ console.log(err); }); // later you can do below // stop both video and audio localStream.getTracks().forEach( (track) => { track.stop(); }); // stop only audio localStream.getAudioTracks()[0].stop(); // stop only video localStream.getVideoTracks()[0].stop();假设我们在视频代码中流式传输,并且id是video-,那么我们应该有以下代码- 123456789101112var videoEl = document.getElementById('video'); // now get the steam stream = videoEl.srcObject; // now get all tracks tracks = stream.getTracks(); // now close each track by having forEach loop tracks.forEach(function(track) { // stopping every track track.stop(); }); // assign null to srcObject of video videoEl.srcObject = null;使用不同的浏览器启动网络摄像头视频 对于Opera 12 123window.navigator.getUserMedia(param, function(stream) { video.src =window.URL.createObjectURL(stream); }, videoError );对于Firefox Nightly 18.0 123window.navigator.mozGetUserMedia(param, function(stream) { video.mozSrcObject = stream; }, videoError );对于Chrome 22 123window.navigator.webkitGetUserMedia(param, function(stream) { video.src =window.webkitURL.createObjectURL(stream); }, videoError );使用不同的浏览器停止网络摄像头视频 对于Opera 12 12video.pause(); video.src=null;对于Firefox Nightly 18.0 12video.pause(); video.mozSrcObject=null;对于Chrome 22 12video.pause(); video.src="";与此同时,网络摄像头灯每次都会熄灭... 相关讨论 这只会停止在标签中显示视频,但不会停止摄像机。您可以使用成功处理程序中返回给getUserMedia的流对象直接结束流。例如 1localMediaStream.stop()video.src=""或null只会从视频标签中删除源。它不会释放硬件。 相关讨论 我知道了。我稍后再试。 不是真的...在Firefox上不起作用。文档提到此方法并非在所有浏览器中都实现... 上述解决方案对我不起作用。做到了。尝试以下方法: 12345678910111213141516171819202122232425var mediaStream = null; navigator.getUserMedia( { audio: true, video: true }, function (stream) { mediaStream = stream; mediaStream.stop = function () { this.getAudioTracks().forEach(function (track) { track.stop(); }); this.getVideoTracks().forEach(function (track) { //in case... :) track.stop(); }); }; /* * Rest of your code..... * */ }); /* * somewhere insdie your code you call * */ mediaStream.stop();如果不赞成使用.stop(),那么我认为我们不应该像@MuazKhan剂量那样重新添加它。这是为什么不赞成使用并且不再使用的原因。只需创建一个辅助函数即可...这是更多es6版本 12345function stopStream (stream) { for (let track of stream.getTracks()) { track.stop() } } 相关讨论 for (let track of stream.getTracks()) { track.stop() } ES5中的stream.getTracks().forEach(function (track) { track.stop() }),这避免了for of的冗长babel变换由于您需要Rails来关闭流式传输,并且需要stream喷射器才能到达Rails,因此我在上述Muaz Khan的帮助下使用的代码如下: 1234567891011121314if (navigator.getUserMedia) { navigator.getUserMedia(constraints, function (stream) { videoEl.src = stream; videoEl.play(); document.getElementById('close').addEventListener('click', function () { stopStream(stream); }); }, errBack); function stopStream(stream) { console.log('stop called'); stream.getVideoTracks().forEach(function (track) { track.stop(); });当然,这将关闭所有活动的视频Rails。如果有多个,则应进行相应选择。 您需要停止所有曲目(来自网络摄像头,麦克风): 1localStream.getTracks().forEach(track => track.stop()); 启动和停止网络摄像头((更新2020 React es6))启动网络摄像头 123456789101112stopWebCamera =()=> //Start Web Came if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { //use WebCam navigator.mediaDevices.getUserMedia({ video: true }).then(stream => { this.localStream = stream; this.video.srcObject = stream; this.video.play(); }); } }一般停止网络摄像头或视频播放 12345678910stopVideo =()=> { this.video.pause(); this.video.src =""; this.video.srcObject = null; // As per new API stop all streams if (this.localStream) this.localStream.getTracks().forEach(track => track.stop()); }停止网络摄像头功能即使在视频流中也可以使用: 12 this.video.src = this.state.videoToTest; this.video.play(); 相关讨论 是否可以停止然后重新启动屏幕捕获共享,而无需让用户再次选择窗口?通过http连接时,在流上使用.stop()可以在chrome上使用。使用ssl(https)时不起作用。 请检查以下内容:https://jsfiddle.net/wazb1jks/3/ 123navigator.getUserMedia(mediaConstraints, function(stream) { window.streamReference = stream; }, onMediaError);停止录制 12345678910111213function stopStream() { if (!window.streamReference) return; window.streamReference.getAudioTracks().forEach(function(track) { track.stop(); }); window.streamReference.getVideoTracks().forEach(function(track) { track.stop(); }); window.streamReference = null; }以下代码对我有用: 123456789101112public vidOff() { let stream = this.video.nativeElement.srcObject; let tracks = stream.getTracks(); tracks.forEach(function (track) { track.stop(); }); this.video.nativeElement.srcObject = null; this.video.nativeElement.stop(); }具有流形式SuccessHandle的引用 12345678910var streamRef; var handleVideo = function (stream) { streamRef = stream; } //this will stop video and audio both track streamRef.getTracks().map(function (val) { val.stop(); }); 相关讨论 这个答案与已经给出的其他几个答案基本相同。 @DanDascalescu不能远射。看到,在此示例中,他清楚地证明了自己调用地图功能的能力。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |