- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我打算做什么的示例演示。如果有人对此修复有任何想法以使其正常工作或有任何新逻辑,请分享。
本次演示使用mediaStream API实现,使用 react-webcam 库,它实际上提供了在名为 videoConstraints={facingMode: 'user' or 'environment'} 的 Prop 的帮助下管理相机 View 的选项,但它似乎不起作用。当我单击相机开关时,ICON 屏幕只是挂起,没有任何显示,而且有时它会意外工作所以最终我不得不跳到这个 native API 解决方案,它显示了下面的代码。感谢所有的期待。
start() {
if (window.stream) {
console.log('found stream and clearing that', window.stream)
window.stream.getTracks().forEach(function(track) {
track.stop()
})
}
const constraints = {
video: true,
audio: false
}
return navigator.mediaDevices
.getUserMedia(constraints)
.then(this.gotStream)
.then(this.gotDevices)
.catch(this.handleError);
}
gotStream(stream) {
window.stream = stream // make stream available to console
// video.srcObject = stream;
// Refresh button list in case labels have become available
console.log('enumerating media devices ')
return navigator.mediaDevices.enumerateDevices()
}
gotDevices(mediaDevices) {
const { availableVideoInputs, videoConstraints } = this.state
mediaDevices.forEach(mediaDevice => {
// console.log(mediaDevice)
if (mediaDevice.kind === 'videoinput') {
console.log('found new video input ', mediaDevice)
availableVideoInputs.push({
deviceId: mediaDevice.deviceId,
label: mediaDevice.label
})
// availableVideoInputs.push('mediaDevice.deviceId.availableVideoInputs.push(mediaDevice.deviceId)')
}
})
console.log('aggregated availableVideoInputs new ', availableVideoInputs)
if (availableVideoInputs.length > 0) {
// there are accessible webcam
// setting first device as default to open
const tempVideoConstraint = {...videoConstraints}
if (availableVideoInputs[0].deviceId) {
console.log('availableVideoInputs[0] = ', availableVideoInputs[0])
tempVideoConstraint.deviceId = availableVideoInputs[0].deviceId
}
// console.log('putting tempVideoConstraint.facingMode ', tempVideoConstraint)
// if (availableVideoInputs[0].label.includes('back')) {
// tempVideoConstraint.facingMode = { exact: 'environment'}
// } else {
// // it is now turn to set front active
// tempVideoConstraint.facingMode = 'user'
// }
console.log('setting new video constrains ', tempVideoConstraint)
// this.setState({
// availableVideoInputs,
// // activeVideoInputID: availableVideoInputs[0].deviceId,
// // videoConstraints: tempVideoConstraint
// })
this.updateAvailableVideoStream(availableVideoInputs)
return Promise.resolve('done setting updateAvailableVideoStream')
} else {
// no webcam is available or accessible
console.error('ERR::VIDEO_STREAM_NOT_AVAILABLE')
}
}
updateAvailableVideoStream(availableVideoInputs) {
this.setState({ availableVideoInputs })
}
componentDidMount() {
this.start()
.then(data => {
console.log('data ', data)
console.log('update state ', this.state)
this.setState({
videoConstraints: {
...this.state.videoConstraints,
facingMode: 'user'
}
})
})
}
handleCameraSwitch() {
const { videoConstraints, availableVideoInputs, activeVideoInputID } = this.state
console.log('current video constraints ', videoConstraints)
const tempVideoConstraint = { ...videoConstraints }
// now check if it is possible to change camera view
// means check for another webcam
console.log({ availableVideoInputs })
console.log({ activeVideoInputID })
console.log({ remainingVideoStreams })
if (availableVideoInputs.length === 1) {
// cannot change the webcam as there is only 1 webcam available
console.error('ERR - cannot change camera view [Available Video Inputs: 1]')
return
}
// now change the view to another camera
// get the current active video input device id and filter then from available video stream
const remainingVideoStreams = availableVideoInputs.filter(videoStream => videoStream.deviceId !== activeVideoInputID)
// now check if in remainingVideoStreams there is more than 1 stream available to switch
// if available then show the Stream Selection List to user
// else change the stream to remainingVideoStreams[0]
console.log({ availableVideoInputs })
console.log({ activeVideoInputID })
console.log({ remainingVideoStreams })
if (remainingVideoStreams && remainingVideoStreams.length === 1) {
tempVideoConstraint.deviceId = remainingVideoStreams[0].deviceId
console.log('new video constraints ', {...tempVideoConstraint})
console.log('webcam ref ', this.webCamRef.current)
// if (remainingVideoStreams[0].label.includes('back') || tempVideoConstraint.facingMode === 'user') {
// tempVideoConstraint.facingMode = { exact: 'environment' }
// } else {
// // it is now turn to set front active
// tempVideoConstraint.facingMode = 'user'
// }
console.log('new video constraints with facing mode', tempVideoConstraint)
// const constraints = {
// video: tempVideoConstraint
// }
// navigator.mediaDevices.getUserMedia(constraints)
// .then((stream) => {
// console.log('stream -> ', stream)
// })
// .catch((error) => {
// console.error('Some error occured while changing the camera view ', error)
// console.log(error)
// })
this.setState({ videoConstraints: tempVideoConstraint, activeVideoInputID: remainingVideoStreams[0].deviceId })
} else {
// show the remaining stream list to user
}
}
<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>
最佳答案
这是您的实现的小变化。但这将完全符合您的期望。
请看下面切换相机前后的实现。我还添加了错误验证,例如:
如果您有任何其他方法或想要更多说明,请点赞并回复
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...'
如您所见,此实现使用了react-webcam 库
在 componentDidMount 中,您将首先检查类型为视频输入 的可用媒体流,然后在其他方法中检查,例如更改 cameraView,即将摄像头切换到前/后。
我卸载网络摄像头仅 100 毫秒,然后使用新的 videoConstraints { facingMode: 'user' } 或 < strong>{ facingMode: { exact: 'environment' } }
这种方法将使您的代码抢先一步,您可以玩转代码并从中获得乐趣。谢谢!
关于reactjs - 无法使用 webrtc MediaDevices 在 React 应用程序中切换摄像头(从前到后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55000680/
我正在检查Pion Mediadevices并尝试从Windows计算机交叉编译webrtc示例以获取树莓派零。但是,当我尝试构建示例时,我从Windows命令提示符中得到了以下错误: # g
因此,我制作了一个 WebRTC 屏幕共享应用程序作为 Chrome 远程桌面和其他常见远程桌面/游戏流服务的自托管替代方案。 我的困境不是navigator.mediaDevices undefin
我突然得到一个 navigator.MediaDevices.getUserMedia notAllowedError 我不是一个月前。没有代码改变。我正在使用火狐 68.01。当我在 AWS 上运行
有一个我不清楚的情况。 我想要的是:播放音频,音频播放完毕后,开始麦克风录音。 问题:在 FF 和 Chrome 中,代码运行良好。然而,在 Safari 上,当音频停止播放并且麦克风录音功能开始时,
我目前正在开发一个视频聊天项目。它使用navigator.mediaDevies。它工作正常并返回本地主机中的 MediaDevices 对象,但是当我将项目部署到服务器时,它返回未定义。我使用的是谷
我在 Firefox 中收到以下错误(在 Chrome/Edge/Safari 中没有问题): MediaStreamError { name: "AbortError", message: "Sta
背景 我尝试实现此功能的机器包含多个摄像头,我想在代码中选择摄像头。 (所有机器具有相同的硬件) 问题 我试图在请求视频访问之前实现自定义功能,其中我手动设置应该使用哪个设备来防止选择错误的摄像机,但
我目前有一个连续轮询 MediaDevices.enumerateDevices() 的方法,它会返回一组已连接的媒体设备。 let devices = []; function getDevices
我无法同时指定视频质量 和相机朝向 约束。有没有办法结合以下约束条件? { audio: true, video: { width: 1280, height: 720 } } { audio
我正在使用 this code ,但是当它获取源时,高度和宽度由下面代码块中的约束设置,但我想获取视频的实际大小。 navigator.mediaDevices.getUserMedia({
我正在使用这段代码,但是当它获取源代码时,它总是将该窗口移到前面,这有点烦人,但我在这段代码中没有看到任何使其移到前面的选项,所以不确定如何预防。 它将源移到前面,在我的应用程序前面,并将焦点放在那个
我正在尝试构建一个可以捕获用户桌面的网络应用程序。我发现这个 Web api 应该可以完美地完成这项工作,但我似乎无法让它工作。现在,通过启用标志,最新版本的 Edge 和 Chrome 70 都应该
即使我的设备没有连接麦克风,我也想进行 WebRTC 通话并听到声音。我用来加入 VOIP 通话的网络应用程序检测到我没有麦克风,并关闭了音频,因为它假定我想要呼入。 我注意到网络应用程序正在使用 n
我正在为我们的组织开发一个内部网络应用程序。该应用程序将主要(如果不是唯一)在台式机/笔记本电脑上使用。 我需要让用户能够拍摄自己的照片。我关注了 example posted by David Wa
有谁知道使用什么通信标准来检测用于 getUserMedia 的相机硬件? 我推测它是 MTP 或类似的东西,虽然我预计每个浏览器/操作系统的实现都不同,但我已经搜索了两天,但我找不到任何可靠的信息。
我目前正在使用 chrome 开发屏幕捕获功能navigator.mediaDevices.getDisplayMedia我只能打开一个用户选择,用户可以从所有给定的显示媒体中进行选择。有没有办法绕过
我在 Chrome 中用 JavaScript 编写了这段代码: navigator.mediaDevices.enumerateDevices() .then((list) => { c
我正在使用 navigator.mediaDevices.getUserMedia() 创建音频记录应用程序,它会记录我周围的每一个声音,即使是非常安静且距离我 10m 的声音。我不播放这个声音,我只
我试图用 navigator.mediaDevices.getUserMedia 替换已弃用的 navigator.getUserMedia 但在尝试时出现此错误: TypeError: Cannot
使用浏览器 Web API,我想设置 MediaDevices.getUserMedia 约束属性,适合记录音频语音(语音消息),例如设置这些参数: 单声道 16 位 16KHz 这是我的代码:
我是一名优秀的程序员,十分优秀!