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 秒后消失,但请留意相机指示灯和浏览器内的录制指示器。首先使用 srcObjecthttps 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.