媒体设备枚举
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
写作背景:
前几节我们都是使用的默认的音视频设备来进行媒体数据的输出,我们这一节就将系统中可以使用的音频输入、输出设备及视频输入设备列举出来并进行切换。
涉及 API:
枚举设备的 API 是 navigator.mediaDevices.enumerateDevices()
,它将会异步回调给我们一个 MediaDeviceInfo 数组,每个 MediaDeviceInfo 将包含一个设备的 deviceId ,设备名称 label ,设备的类型 kind 。设备类型包括:audioinput(音频输入),audiooutput(音频输出),videoinput(视频输入)。
// 获取当前计算机可列举的音频输入|输出|视频输入设备 navigator.mediaDevices .enumerateDevices() .then((devices) => { for (const device of devices) { if (device.kind === "audioinput") { audioInputDevices.push(device); } else if (device.kind === "audiooutput") { audioOutputDevices.push(device); } else if (device.kind === "videoinput") { videoDevices.push(device); } } }) .then(() => { resolve({ audioInputDevices, audioOutputDevices, videoDevices }); });
注:当用户选择完设备后最好支持保存配置,省去下次调整,因为用户的偏好和设备时候故障都会影响到用户的实际使用。
HTMLMediaElement.setSinkId()
API 是一个实验功能,可以通过传入一个音频输出设备的 deviceId 来切换不同的音频输出设备:
const handleChangeAudioOutputDevice = (value: string) => { selectedAudioOutputDevice.value = value; video // @ts-ignore .value!.setSinkId(value) .then(() => { console.log(`音频输出设备设置成功${value}`); }) .catch((error: Error) => { console.log(error); }); };
注:实际开发时在 HTMLMediaElement 接口中没能找到 setSinkId 函数,但功能正常,这里先使用 @ts-ignore
将下一行的错误忽略。
启动设备:
在这里我们要扩展约束条件,以支持使用默认选择的各设备:
const openDevice = () => { const constraints: MediaStreamConstraints = { audio: { deviceId: selectedAudioInputDevice.value ? { exact: selectedAudioInputDevice.value } : undefined, }, video: { deviceId: selectedVideoDevice.value ? { exact: selectedVideoDevice.value } : undefined, }, }; ... };
注:
- 强烈推荐使用 TypeScript 来开发,并指定真实的类型来得到优秀的代码提示;
- 其他步骤同前几节的方式,也可以看文末的完整代码。
完整代码:Resolution.vue
结语:
我们通过 enumerateDevices 的到了系统中已存在的音频输入、输出设备及视频的输入设备,在视频会议等软件中也需要支持多种设备的切换来满足不同的场景。
明天继续~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)