我正在使用 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 MediaStream,其中包含 new MediaStreamTracks。关闭这些新的MediaStreamTracks不会关闭以前的。
所以你需要的是跟踪你以前的MediaStream,并关闭它的VideoTrack。
鉴于您当前的代码,您似乎确实将其设置为
myVideo.current.srcObject
,如果是这样,您可以从那里访问它:
const muteVideoTrack = () => {
myVideo.current.srcObject.getVideoTracks().forEach((track) => track.stop());
};
或者您也可以简单地将此 MediaStream 存储在您的方法可访问的任何变量中。
这将使MediaStream 仅捕获麦克风。如果您想完全停止整个 MediaStream,请调用
getTracks()
而不是 getVideoTracks()
,并可选择将 srcObject
设置为 null
。