效果
navigator.mediaDevices.enumerateDevices
请求媒体输入和输出设备的列表,例如麦克风,摄像机,耳机设备等
navigator.mediaDevices.getUserMedia
会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D 转换器等等),也可能是其他轨道类型
源码
<div id="app">
<select id="audio-select">
<option value="">请选择</option>
</select>
<select id="video-select">
<option value="">请选择</option>
</select>
<video id="video" autoplay controls></video>
</div>
<script>
window.onload = function () {
const audioSelect = document.getElementById('audio-select');
const videoSelect = document.getElementById('video-select');
const audio = document.getElementById('audio');
const video = document.getElementById('video');
// 获取全部设备
navigator.mediaDevices.enumerateDevices()
.then(devices => {
devices.forEach(device => {
let option = document.createElement('option');
option.value = JSON.stringify(device);
option.innerText = device.label;
switch (device.kind) {
case 'audioinput':
case 'audiooutput':
audioSelect.appendChild(option);
break;
case 'videoinput':
videoSelect.appendChild(option);
break;
}
});
})
function videoChange(device) {
if (!device) return;
// 播放音视频
navigator.mediaDevices.getUserMedia({ audio: audioSelect.value ? JSON.parse(audioSelect.value) : false, video: device })
.then(stream => {
video.srcObject = stream;
})
}
videoSelect.onchange = function (e) { videoChange(JSON.parse(e.target.value)) }
}
</script>