MediaDevices设置音频输出设备
- 更新:2021-07-03 17:02:17
- 首发:2019-03-10 20:22:39
- 源代码
- 6971
MediaDevices 为浏览器控制音频输入设备、音频输出设备、视频输入设备提供了接口。
简单检测浏览器对MediaDevices
API的支持情况:
checkMediaDevicesSupport () {
if (!navigator) {
throw new Error('navigator not supported.')
}
if (!navigator.mediaDevices) {
throw new Error('mediaDevices not supported.')
}
if (!navigator.mediaDevices.enumerateDevices) {
throw new Error('mediaDevices.enumerateDevices() not supported.')
}
return true
}
获取设备列表:
async getDeviceList () {
await navigator.mediaDevices.getUserMedia({ // 请保留此代码以确保用户授权访问设备
video: true,
audio: true
})
this.deviceList = await navigator.mediaDevices.enumerateDevices()
return this.deviceList
}
设置音频输出设备(来源):
setOutAudioDevices (element, sinkId) {
return new Promise((resolve, reject) => {
if (typeof element.sinkId !== 'undefined') {
element.setSinkId(sinkId)
.then(() => {
console.log(`Success, audio output device attached: ${sinkId} to element with ${element.title} as source.`)
resolve(true)
})
.catch(error => {
let errorMessage = error
if (error.name === 'SecurityError') {
errorMessage = `You need to use HTTPS for selecting audio output device: ${error}`
}
console.error(errorMessage)
reject(errorMessage)
})
} else {
console.warn('Browser does not support output device selection.')
}
})
}
大坑提示:
const audio = document.createElement('audio') // 不能用 new Audio(res.url),否则无法设置输出信号,最好不要使用 createElement
audio.src = res.url
audio.load()
if (deviceId) {
await jsMediaDevices.setOutAudioDevices(audio, deviceId)
}
audio.play()
设置输出设备不能用Audio
对象,并且不能在audio.load()
之前调用setOutAudioDevices
。
最好不要使用createElement
,应该直接写到HTML中,否则部分浏览器将会出现此报错信息:DOMException: play() failed because the user didn't interact with the document first.
,在Chrome 50+版本中,JavaScript启动的播放发生之前都需要明确的用户操作。这有助于确保用户不会在没有明确地与页面交互的情况下开始下载和播放媒体。因此video
或audio
标签需要播放前事先加载到HTML。
Uncaught (in promise) DOMException: Failed to load because no supported source was found.
:报错通常与音频源有关(src里面的地址),可能是音频大小为0,也可能是发生了跨域。
更多示例代码:https://webrtc.github.io/samples/
对MediaDevices接口的简单封装:https://github.com/yi-ge/js-media-devices
除特别注明外,本站所有文章均为原创。原创文章均已备案且受著作权保护,未经作者书面授权,请勿转载。
打赏
交流区
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢