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

Shi*_*hou 107 javascript html5 html5-video webrtc

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

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

and*_*rei 146

编辑

由于此答案最初发布,因此浏览器API已更改. .stop()在传递给回调的流上不再可用.开发人员必须访问组成流(音频或视频)的曲目并单独停止每个曲目.

有关详细信息,请访问:https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl = zh_CN&stop-ended-and -active

示例(来自上面的链接):

stream.getTracks().forEach(function(track) {
  track.stop();
});
Run Code Online (Sandbox Code Playgroud)

浏览器支持可能不同.

原始答案

navigator.getUserMedia为您提供成功回调中的流,您可以调用.stop()该流来停止录制(至少在Chrome中,似乎FF不喜欢它)

  • 这会停止流,但 chrome 上的视频指示器仍然保持活动状态,直到重新加载。有没有办法去除它? (7认同)
  • 我认为`stream.stop()`对于chrome不起作用,`mediaRecorder.stop()`停止录制,而它不会停止浏览器提供的流.你能看到这个http://stackoverflow.com/questions/34715357/how-to-stop-the-capturing-mediastream-that-is-started-by-chrome-tabcapture-api-i (2认同)

Mua*_*han 56

你可以在MediaStream对象上调用" stop ",这个对象将会过时 ; 新提案是通过在每个媒体轨道上调用" 停止 " 来发布媒体曲目:

mediaStream.stop();

// or
mediaStream.getTracks()[0].stop();
mediaStream.getTracks()[1].stop();
Run Code Online (Sandbox Code Playgroud)

更新于2015年11月3日上午10:34:24

这是一个跨浏览器的stream.stop黑客攻击:

var MediaStream = window.MediaStream;

if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {
    MediaStream = webkitMediaStream;
}

/*global MediaStream:true */
if (typeof MediaStream !== 'undefined' && !('stop' in MediaStream.prototype)) {
    MediaStream.prototype.stop = function() {
        this.getTracks().forEach(function(track) {
            track.stop();
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 我强烈反对修改本机 API 的原型来_恢复_已被正式弃用并从浏览器中删除的功能。这是不规则的,并且可能会在以后引起混乱。当您需要停止流中的所有曲目时,为什么不直接执行“stream.getTracks().forEach(track => { track.stop() })”呢?或者,如果您确实经常这样做以证明速记的合理性,那么您始终可以定义一个辅助函数,例如“stopAllTracks(stream)”。 (3认同)
  • 谢谢你 mediaStream.stop已被弃用。 (2认同)

sol*_*404 37

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

MediaStream弃用

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

  • 如何恢复赛道? (2认同)

Ves*_*shi 12

假设我们在视频标签中有流媒体并且 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;
Run Code Online (Sandbox Code Playgroud)


小智 9

使用不同的浏览器启动Webcam Video

适用于Opera 12

window.navigator.getUserMedia(param, function(stream) {
                            video.src =window.URL.createObjectURL(stream);
                        }, videoError );
Run Code Online (Sandbox Code Playgroud)

适用于Firefox Nightly 18.0

window.navigator.mozGetUserMedia(param, function(stream) {
                            video.mozSrcObject = stream;
                        }, videoError );
Run Code Online (Sandbox Code Playgroud)

对于Chrome 22

window.navigator.webkitGetUserMedia(param, function(stream) {
                            video.src =window.webkitURL.createObjectURL(stream);
                        },  videoError );
Run Code Online (Sandbox Code Playgroud)

使用不同的浏览器停止网络摄像头视频

适用于Opera 12

video.pause();
video.src=null;
Run Code Online (Sandbox Code Playgroud)

适用于Firefox Nightly 18.0

video.pause();
video.mozSrcObject=null;
Run Code Online (Sandbox Code Playgroud)

对于Chrome 22

video.pause();
video.src="";
Run Code Online (Sandbox Code Playgroud)

有了这个,网络摄像头灯每次都会消失......

  • 这仅停止在<video>标签中显示视频,但不会停止相机. (10认同)

Sas*_*nan 9

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 audio 
localStream.getVideoTracks()[0].stop();
Run Code Online (Sandbox Code Playgroud)


Bha*_*vin 7

您可以使用成功处理程序中返回的流对象直接结束流到getUserMedia.例如

localMediaStream.stop()
Run Code Online (Sandbox Code Playgroud)

video.src=""或者null只是从视频标签中删除源.它不会释放硬件.


ima*_*era 5

尝试下面的方法

var 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();
Run Code Online (Sandbox Code Playgroud)