提问者:小点点

如何在webrtc navigator用户媒体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>

如何关闭和退出其他文件中的web cam。例如:

  function exitWebCam () {  
     document.getElementById("live")."close the web cam";
  }

共2个答案

匿名用户

通过关闭流的所有轨迹来结束流:stream。getTracks()。forEach(函数(track){track.stop();})

匿名用户

菲利普说的。还清除对流的所有引用,以便可以释放它。这里有一个bug:

live.src = stream;

错误(src采用URL,而不是流)。幸运的是,它从未在窗口中运行过。URL存在于所有执行WebRTC的浏览器中。但是createObjectURL会使相机保持打开状态。而是这样做:

if (typeof live.srcObject == "object") {
    live.srcObject = stream;
} else {
    live.src = window.URL.createObjectURL(stream)
}

或者干脆直播。srobject=streamassrobject目前已在所有WebRTC浏览器中实现(Chrome54)。它正确地处理资源,因此当您以后进行live时。srcObject=null浏览器知道它可以对流进行垃圾收集(如果您错过了对任何曲目调用track.stop(),请关闭摄像头)。

createObjectURL是可怕的和不建议使用的,并且将资源分配到页面导航,除非您记得撤销ObjectURL。这就是为什么你的相机永远不会自己停下来,以防你想知道,所以如果你在代码中看到这个模式,请帮助盖章。

试着比较一下。视频会在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>