停止/关闭由 navigator.mediaDevices.getUserMedia 打开的网络摄像头流

IT技术 javascript html html5-video webrtc getusermedia
2021-01-28 02:07:31

我使用以下 JavaScript 代码打开了一个网络摄像头:

const stream = await navigator.mediaDevices.getUserMedia({ /* ... */ });

是否有任何 JavaScript 代码可以停止或关闭网络摄像头?感谢大家。

6个回答

编辑

由于此答案最初已发布,因此浏览器 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 不喜欢它)

@Muntu,我认为这取决于我,stream.stop() 正在工作(在 chrome 中)。因为我有一个 webRTC 流。那么如果你在浏览器中录制 mediaRecorder.stop() 会起作用吗?
2021-03-13 02:07:31
@Cyber​​supernova 您找到解决方案了吗?我认为页面刷新可能有效
2021-03-23 02:07:31
这会停止流,但 chrome 上的视频指示器仍然保持活动状态,直到重新加载。有没有办法删除它?
2021-03-30 02:07:31
是的,但这引发了另一个问题。在允许几秒钟/几分钟的录音后,应该会出现停止录音的功能。您如何控制:在默认录制时间后停止?谢谢!
2021-04-07 02:07:31
我认为stream.stop()不适用于 chrome,mediaRecorder.stop()停止录制,而它不会停止浏览器提供的流。你能看看这个stackoverflow.com/questions/34715357/...
2021-04-12 02:07:31

使用以下任一功能:

// 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 已被弃用。
2021-04-03 02:07:31
@DanBrown 你的解决方案是什么?
2021-04-10 02:07:31
我强烈反对修改原生 API 的原型来恢复已被正式弃用并从浏览器中删除的功能。这是不规则的,以后可能会引起混淆。当您需要停止流中的所有曲目时,为什么不这样做stream.getTracks().forEach(track => { track.stop() })呢?或者,如果你真的经常这样做来证明速记是合理的,你总是可以定义一个辅助函数,如stopAllTracks(stream).
2021-04-12 02:07:31

不要使用stream.stop(),它已被弃用

媒体流弃用

利用 stream.getTracks().forEach(track => track.stop())

如何恢复赛道?
2021-03-19 02:07:31
@NeerajJain 一旦关闭 mediaStreamTrack,它就无法退出结束状态
2021-03-26 02:07:31
非常感谢,它运行良好,由于折旧,人们对哪个正在运行感到困惑,但截至 2019 年 3 月,上述解决方案在 chrome 中运行良好..🙂
2021-04-04 02:07:31
2021-04-05 02:07:31

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;