问题描述
我正在使用getUserMedia来记录来自用户的音频,如下所示:
stream = await navigator.mediaDevices.getUserMedia({ audio: true });
执行此行后,会提示用户录音许可。我想先执行此步骤,例如先请求许可,如果未授予许可,则不会显示录制用户界面。我们如何实现呢?
解决方法
在普通的网页代码中,它可以获取流,然后停止其运行。像这样的函数应该为您完成。
async function getUserMediaPermission (constraints) {
try {
const stream = await navigator.mediaDevices.getUserMedia (constraints)
if (stream) {
stream.tracks.forEach(track => track.stop())
return true
}
return false
}
catch(error) {
return false
}
}
然后您使用如下代码调用该函数
const permissionGranted = getUserMediaPermission ({audio:true})
if (!permissionGranted) console.log ('Hey! to use this you must grant permission!')
这是做什么的:它得到一个流。在用户授予权限之前,await getUserMedia()
不会完成。如果用户拒绝许可,将调用catch{}
。
但是,在桌面浏览器上,权限是持久的,因此已被授予await getUserMedia()
,该权限立即完成。如果已经被拒绝,也是一样。
一旦有了流,就必须关闭它。没有stream.close()
函数:“关闭”流的方法是停止其所有轨道,并使stream
对象超出范围。
我不知道这在Web Extensions中是否有效;我知道它可以在台式机和移动浏览器上使用。 如果您可以在Web Extension中使用它,请发表评论或回答以说明您的操作方式。