我正在使用WebRTC和socket.视频通话的io.

通话正常,但当我运行"关闭摄像头"功能时,视频会停止,但网络摄像头的灯仍亮着.

以下是关闭摄像头的功能:

const  mute= ()=>{
  setMuteCamera(true)
  navigator.mediaDevices
    .getUserMedia({ video: false, audio: true })
    .then((stream) => {
      setStream(stream);
      myVideo.current.srcObject = stream;
      if (stream!= null) {

        stream?.getTracks().forEach((track) => {
          
          track.stop()
        })
        
        }
  
  

    })

  }

推荐答案

每次你打navigator.mediaDevices.getUserMedia(),就会产生一个new MediaStreamnew MediaStreamTracks.关闭这些新的MediaStreamTracks不会关闭以前的MediaStreamTracks.

So what you need is to keep track of your previous MediaStream, and close the VideoTrack from it.
Given your current code it seems that you do set it as myVideo.current.srcObject, if so, you can access it from there:

const muteVideoTrack = () => {
  myVideo.current.srcObject.getVideoTracks().forEach((track) => track.stop());
};

Or you could also simply store this MediaStream in any variable accessible to your method.
This will let the MediaStream capture only the microphone. If you wanted to completely stop the whole MediaStream, then call getTracks() instead of getVideoTracks(), and optionally set the srcObject to null.

Javascript相关问答推荐

在TypScript中计算使用旋转谷仓的鸡舍所需的农场数量

React中的表格中 Select Radio按钮

如何在pixi js中画一条简单的线

使用JavaScript更改json值顺序

更新Reduxstore 中的状态变量,导致整个应用程序出现不必要的重新渲染

nPM审计始终发现0个漏洞

RxJS setTimeout操作符等效

如何在RTK上设置轮询,每24小时

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

切换时排序对象数组,切换不起作用

空的结果抓取网站与Fetch和Cheerio

如何从调整大小/zoom 的SVG路径定义新的d属性?""

从Node JS将对象数组中的数据插入Postgres表

在带有背景图像和圆形的div中添加长方体阴影时的重影线

变量的值在Reaction组件中的Try-Catch语句之外丢失

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

如何在JAVASCRIPT中合并两组对象并返回一些键

Phaser3 preFX addGlow不支持zoom

如何在尚未创建的鼠标悬停事件上访问和着色div?