Это небольшой вариант вашей реализации.Но это будет работать именно так, как вы хотели.
Пожалуйста, ознакомьтесь с приведенной ниже реализацией для переключения камеры вперед / назад.Я также добавил проверку ошибок, например:
- Будет выдано сообщение об ошибке, если видеопоток недоступен.
- Будет выдано сообщение об ошибке, если при наличии только 1 видеопотокапытаясь получить доступ к задней камере.
Пожалуйста, сделайте лайк и прокомментируйте, если у вас есть какой-либо другой подход или хотите получить больше разъяснений
componentDidMount() {
const gotDevices = (mediaDevices) =>
new Promise((resolve, reject) => {
const availableVideoInputs = []
mediaDevices.forEach(mediaDevice => {
if (mediaDevice.kind === 'videoinput') {
availableVideoInputs.push({
deviceId: mediaDevice.deviceId,
label: mediaDevice.label
})
}
})
if (availableVideoInputs.length > 0) {
resolve(availableVideoInputs)
} else {
reject(new Error('ERR::NO_MEDIA_TO_STREAM'))
}
})
navigator.mediaDevices.enumerateDevices().then(gotDevices)
.then((availableVideoInputs) => this.setState({ availableVideoInputs }))
.catch((err) => this.setState({ hasError: err }))
}
updateFileUploadView(newActiveView) {
this.setState({ activeFileUploadView: newActiveView })
const { hasError } = this.state
if (newActiveView === 'clickFromWebcam' && hasError) {
return console.error(hasError)
}
if (newActiveView === '') {
// means no view is active and clear the selected image
this.setState({ captureImageBase64: '', videoConstraints: defaultVideoConstraints })
}
}
changeCameraView() {
const { availableVideoInputs } = this.state
if (availableVideoInputs.length === 1) {
return console.error('ERR::AVAILABLE_MEDIA_STREAMS_IS_1')
}
this.setState({ resetCameraView: true })
setTimeout(() => {
const { videoConstraints: { facingMode } } = this.state
const newFacingMode = facingMode === 'user' ? { exact: 'environment' } : 'user'
this.setState({
videoConstraints: { facingMode: newFacingMode },
resetCameraView: false
})
}, 100)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
!resetCameraView ?
<Webcam
audio={false}
height='100%'
ref={this.webCamRef}
screenshotFormat="image/png"
minScreenshotWidth={screenShotWidth}
minScreenshotHeight={screenShotHeight}
screenshotQuality={1}
width='100%'
videoConstraints={videoConstraints}
/>
: 'Loading...'
Как вы можете видеть, эта реализация использует библиотеку реагирующих веб-камер
в componentDidMount сначала вы проверите доступный медиа-поток типа видеовхода , а затем другими способами, такими как изменение cameraView, т. Е. Переключение камеры вперед / назад.
Я отключаю веб-камерутолько на 100 мс, а затем смонтируйте его снова с новыми videoConstraints либо {ringMode: 'user'} или {сторонойMode: {точный: 'среда'}}
Этот подход даст вашему коду преимущество, и вы сможете поиграть с кодом и повеселиться. Спасибо!