webrtc 导航器用户媒体中的视频如何(停止、退出)JavaScript
how ( stop,exit ) video in webrtc navigator user media JavaScript
我如何在纯 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>
如何在其他file.js中关闭和退出网络摄像头例如:
function exitWebCam () {
document.getElementById("live")."close the web cam";
}
您可以通过关闭其所有曲目来结束流:
stream.getTracks().forEach(function(track) { track.stop(); })
菲利普说的。还要清除对流的所有引用,以便释放它。这里有一个错误:
live.src = stream;
是错误的(src
需要一个URL,而不是一个流)。幸运的是它永远不会运行,因为 window.URL
存在于所有支持 WebRTC 的浏览器中。但是 createObjectURL
会导致相机保持打开状态。而是这样做:
if (typeof live.srcObject == "object") {
live.srcObject = stream;
} else {
live.src = window.URL.createObjectURL(stream)
}
或者只是 live.srcObject = stream
,因为 srcObject
目前在所有 WebRTC 浏览器中实现(Chrome 54+)。它会正确处理资源,因此当您稍后执行 live.srcObject = null
时,浏览器知道它可以对流进行垃圾收集(如果您错过了在任何轨道上调用 track.stop()
,则关闭相机)。
createObjectURL
很糟糕并且已弃用,除非您记得 revokeObjectURL
,否则会在页面导航之前分配资源。这就是为什么你的相机永远不会自行停止的原因,如果你想知道的话,所以如果你在代码中看到这种模式,请帮忙把它去掉。
比较
尝试使用这些进行比较。视频在 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>
然后用createObjectURL
(没有revokeObjectURL
)(https fiddle for Chrome):
(在两种浏览器中永远保持打开状态。)
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
navigator.mediaDevices.getUserMedia({video: true})
.then(stream => video.src = URL.createObjectURL(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>
显式调用 track.stop()
会停止它,但前提是您已停止 all 曲目,考虑到曲目可以现在克隆。所以避免 createObjectURL
.
我如何在纯 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>
如何在其他file.js中关闭和退出网络摄像头例如:
function exitWebCam () {
document.getElementById("live")."close the web cam";
}
您可以通过关闭其所有曲目来结束流:
stream.getTracks().forEach(function(track) { track.stop(); })
菲利普说的。还要清除对流的所有引用,以便释放它。这里有一个错误:
live.src = stream;
是错误的(src
需要一个URL,而不是一个流)。幸运的是它永远不会运行,因为 window.URL
存在于所有支持 WebRTC 的浏览器中。但是 createObjectURL
会导致相机保持打开状态。而是这样做:
if (typeof live.srcObject == "object") {
live.srcObject = stream;
} else {
live.src = window.URL.createObjectURL(stream)
}
或者只是 live.srcObject = stream
,因为 srcObject
目前在所有 WebRTC 浏览器中实现(Chrome 54+)。它会正确处理资源,因此当您稍后执行 live.srcObject = null
时,浏览器知道它可以对流进行垃圾收集(如果您错过了在任何轨道上调用 track.stop()
,则关闭相机)。
createObjectURL
很糟糕并且已弃用,除非您记得 revokeObjectURL
,否则会在页面导航之前分配资源。这就是为什么你的相机永远不会自行停止的原因,如果你想知道的话,所以如果你在代码中看到这种模式,请帮忙把它去掉。
比较
尝试使用这些进行比较。视频在 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>
然后用createObjectURL
(没有revokeObjectURL
)(https fiddle for Chrome):
(在两种浏览器中永远保持打开状态。)
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
navigator.mediaDevices.getUserMedia({video: true})
.then(stream => video.src = URL.createObjectURL(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>
track.stop()
会停止它,但前提是您已停止 all 曲目,考虑到曲目可以现在克隆。所以避免 createObjectURL
.