我使用以下 JavaScript 代码打开了一个网络摄像头:
const stream = await navigator.mediaDevices.getUserMedia({ /* ... */ });
是否有任何 JavaScript 代码可以停止或关闭网络摄像头?感谢大家。
我使用以下 JavaScript 代码打开了一个网络摄像头:
const stream = await navigator.mediaDevices.getUserMedia({ /* ... */ });
是否有任何 JavaScript 代码可以停止或关闭网络摄像头?感谢大家。
编辑
由于此答案最初已发布,因此浏览器 API 已更改。
.stop()
在传递给回调的流上不再可用。开发人员必须访问组成流(音频或视频)的轨道并单独停止每个轨道。
更多信息:https : //developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active
示例(来自上面的链接):
stream.getTracks().forEach(function(track) {
track.stop();
});
浏览器支持可能有所不同。
原答案
navigator.getUserMedia
在成功回调中为您提供一个流,您可以调用.stop()
该流来停止录制(至少在 Chrome 中,似乎 FF 不喜欢它)
使用以下任一功能:
// 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();
}
});
}
FF,Chrome和Opera已经开始暴露getUserMedia
通过navigator.mediaDevices
标准现在(可能会更改:)
navigator.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 id="video"></video>
那么我们应该有以下代码 -
var 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;