我正在为相机和麦克风运行getUserMedia,
navigator.mediaDevices
.getUserMedia({audio:true, video: true)
.then((stream) => {})
.catch((error) => {})
有没有办法区分是什么设备导致了承诺的失败?即,如果是无法读取的相机或麦克风,你能从错误对象中找到它是相机吗?除了error.name和error.message,我还能找到其他东西吗?
不,不幸的是,当您同时从两者捕获时,它们要么都成功,要么都失败。
许多应用程序将分别捕获音频和视频,然后使用每个单独设备的MediaStream中的曲目创建新的MediaStream。我有一种预感,在音频/视频从设备内部发送单个流的情况下,这可能会导致同步问题,但尚未证明这一点。这一定不是一个大问题,至少对视频会议来说是这样,因为这就是谷歌为Hangouts/Meet所做的。
您想要检测哪些类型的错误?
如果你的机器没有制作MediaStream所需的硬件(相机、麦克风(,你可以在尝试使用.getUserMedia((之前使用.enumericeDevices((来找到它。像这样的函数可能会为你提供{audio: true, video:true}
MediaStream所需要的信息。
async function canIDoIt () {
const devices = await navigator.mediaDevices.enumerateDevices()
let hasAudio = false
let hasVideo = false
devices.forEach(function(device) {
if (device.kind === 'videoinput') hasVideo = true
if (device.kind === 'audioinput') hasAudio = true
})
return hasAudio && hasVideo
}
对于一个强大的媒体应用程序来说,使用它是一个良好的开端:在深入了解.getUserMedia((.引发的错误之前,你可以立即告诉用户他们没有正确的硬件
如果您的用户拒绝.getUserMedia((访问其媒体设备的权限,它将抛出一个错误,其中error.message
包含字符串";拒绝许可";。请记住,当用户拒绝权限时,您的程序不会返回太多有关设备的描述性信息。因为网络犯罪。
如果您的用户设备无法处理您向.getUserMedia((提供的约束,您将得到";"违反约束";在CCD_ 3字符串中。你可以违反的设备限制包括
{video: { width:{exact:1920},
height:{exact:1080}}}
在约束中避免exact
可以减少违反约束的机会。相反,你可以给予这样的东西。
{video: { width:{min:480, ideal: 720, max: 1920},
height:{min:270, ideal:1280, max: 1040}}}
其他错误可能更特定于特定的机器和浏览器。实际上,在所有情况下,抛出的error
对象都包含一个解释性的error.message
。