Закрытие веб-камеры без перезагрузки
Я новичок в веб-разработке и работаю над приложением для видеочата, созданным на основе create-react-app
, я использую recordRTC
библиотека для записи и потоковой передачи с веб-камеры пользователя и микрофона. Когда я прекращаю запись, я также хотел бы закрыть веб-камеру.
import React, { Component } from "react";
import RecordRTC from "recordrtc";
const captureUserMedia = callback => {
const params = { audio: true, video: true };
navigator.mediaDevices
.getUserMedia(params)
.then(callback)
.catch((error) => {
console.error(JSON.stringify(error));
});
};
export default class Recorder extends Component {
constructor(props) {
super(props);
this.recordVideo = null;
this.videoRef = React.createRef();
}
componentDidMount = () => {
captureUserMedia(stream => (this.videoRef.current.srcObject = stream));
};
startRecord = () => {
captureUserMedia(stream => {
this.recordVideo = RecordRTC(stream, { type: "video" });
this.recordVideo.startRecording();
});
};
stopRecord = () => {
this.recordVideo.stopRecording();
this.videoRef.current.srcObject.getTracks().forEach((track) => {
track.stop();
});
};
render() {
return (
<div>
<video ref={this.videoRef} autoPlay muted />
<div>
<button onClick={this.startRecord}>START</button>
<button onClick={this.stopRecord}>STOP</button>
</div>
</div>
);
}
}
Я нашел здесь связанный пост, где я нашел это:
stream.getTracks().forEach((track) => {
track.stop()
})
Это останавливает поток, но красный кружок все еще присутствует на вкладке навигатора (хром), а индикатор веб-камеры продолжает гореть.
Как я могу сделать, чтобы выключить веб-камеру?
Единственный способ, который я нашел, - это вызвать перезагрузку, но я не хочу этого делать...
Если у кого-то есть идея, пожалуйста, дайте мне знать.
Спасибо за ваш ответ:)
1 ответ
Я обнаружил, что я сделал не так!
Я звонил два раза getUserMedia()
метод вместо одного (с функцией captureUserMedia).
Вы можете попробовать с кодом ниже, все будет в порядке!
...
componentDidMount = () => {
captureUserMedia((stream) => {
this.videoRef.current.srcObject = stream;
this.recordVideo = RecordRTC(stream, { type: "video" });
});
};
startRecord = () => {
this.recordVideo.startRecording();
};
stopRecord = () => {
this.recordVideo.stopRecording();
this.videoRef.current.srcObject.getTracks().forEach((track) => {
track.stop();
});
};
...