如何在纯js中停止和退出,在WEBRTC api js中流式网络摄像头,我的代码中有以下脚本:
<script type="text/javascript">
$(document).ready(function() {
$("#abrirModal").click(function() {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
var constraints = {
audio: false,
video: true
};
var live = document.getElementById("live");
function successCallback(stream) {
window.stream = stream; // stream available to console
if (window.URL) {
live.src = window.URL.createObjectURL(stream);
} else {
live.src = stream;
}
$("#myModal").modal("show");
window.setTimeout(function() {
$("#myModal").modal("hide");
}, 9000);
}
function errorCallback(error) {
console.log("navigator.getUserMedia error: ", error);
}
navigator.getUserMedia(constraints, successCallback, errorCallback);
});
});
</script>
如何关闭和退出其他文件中的web cam。例如:
function exitWebCam () {
document.getElementById("live")."close the web cam";
}
通过关闭流的所有轨迹来结束流:stream。getTracks()。forEach(函数(track){track.stop();})代码>
菲利普说的。还清除对流的所有引用,以便可以释放它。这里有一个bug:
live.src = stream;
错误(src
采用URL,而不是流)。幸运的是,它从未在窗口中运行过。URL
存在于所有执行WebRTC的浏览器中。但是createObjectURL
会使相机保持打开状态。而是这样做:
if (typeof live.srcObject == "object") {
live.srcObject = stream;
} else {
live.src = window.URL.createObjectURL(stream)
}
或者干脆直播。srobject=stream
assrobject
目前已在所有WebRTC浏览器中实现(Chrome54)。它正确地处理资源,因此当您以后进行live时。srcObject=null
浏览器知道它可以对流进行垃圾收集(如果您错过了对任何曲目调用track.stop()
,请关闭摄像头)。
createObjectURL
是可怕的和不建议使用的,并且将资源分配到页面导航,除非您记得撤销ObjectURL。这就是为什么你的相机永远不会自己停下来,以防你想知道,所以如果你在代码中看到这个模式,请帮助盖章。
试着比较一下。视频会在2秒钟后消失,但请注意您的摄像头指示灯和浏览器内的录制指示灯。首先使用srcObject
(https fiddle代表Chrome):
(Firefox中的摄像头指示灯和指示灯应在约10秒后熄灭;Chrome中的摄像头指示灯和指示灯应在约20秒后熄灭。)
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
navigator.mediaDevices.getUserMedia({video: true})
.then(stream => video.srcObject = stream)
.then(() => wait(2000))
.then(() => video.srcObject = null)
.catch(e => console.log(e.name + ": "+ e.message));
<video id="video" width="160" height="120" autoplay></video>