麦克风设备检测

主要介绍了媒体设备麦克风的相关检测实现,包括扬声器检测、麦克风检测(音量动态展示)、录音检测等

要使用浏览器媒体功能,如麦克风、摄像头,一般需要先进行一下设备检测,确认设备功能正常。特别是线上考试或者测试前,都有这种检测页。

1. 扬声器检测

扬声器检测比较简单,就是播放一个音频文件,看能不能听到声音。

直接展示audio标签即可

html 复制代码
<audio
  src="@/assets/audio/testspeak.mp3"
  controlslist="nodownload"
  controls
  loop
  crossorigin="anonymous"
></audio>

当然也可以获取媒体设备列表中的扬声器,然后进行音频播放测试,我做的比较简单。

获取扬声器列表可以查看WebRTC 之媒体设备列表 enumerateDevices

2. 麦克风检测

麦克风检测一般是获取麦克风列表,实时监听麦克风,然后对着说话,展示音量大小,看音量条是否变化。

html 复制代码
// 展示麦克风列表
<a-select
  :options="audioDevices"
  v-model="audioSelect"
  @change="changeAudio"
></a-select>
// 展示音量条大小数据
<div class="audio-wrapper">
  <div class="audio-player">
    <audio autoplay playinline></audio>
  </div>
  <div class="audio-volume" :style="{ width: volumeRate + '%' }"></div>
</div>

获取媒体麦克风权限,通过getUserMedia来实现

获取设备列表,通过getDevices实现,audioinput表示麦克风,audiooutput表示扬声器,可以根据需求修改过滤条件

监听麦克风音量大小,通过AudioContext实现

js 复制代码
// 获取媒体麦克风权限
getUserMedia({ audio: true }, (mediaStream) => {
  // 获取设备列表
  this.getDevices();

  // 监听麦克风音量大小
  this.stream = mediaStream;
  this.getAudioVolume(mediaStream);
});

// 获取麦克风音量
getAudioVolume(stream) {
  // 创建一个音频上下文对象
  const audioContext = window.AudioContext || window.webkitAudioContext;
  this.audioCtx = new audioContext();

  // 创建媒体流输入源节点,将音频流连接到该节点
  const liveSource = this.audioCtx.createMediaStreamSource(stream);

  // 创建音频分析对象,用于检测音频的音量级别
  // 采样的缓冲区大小为2048,输入和输出都是单声道
  const levelChecker = this.audioCtx.createScriptProcessor(2048, 1, 1);

  // 将该分析对象与麦克风音频进行连接
  liveSource.connect(levelChecker);

  // 将该分析对象连接到音频上下文的目标节点(通常是扬声器)
  levelChecker.connect(this.audioCtx.destination);

  levelChecker.onaudioprocess = (e) => {
    // 获取输入缓冲区的数据
    const buffer = e.inputBuffer.getChannelData(0);

    // 计算音频的平方和,即音频信号的能量
    let sum = 0.0;
    for (let i = 0; i < buffer.length; i += 1) {
      sum += buffer[i] * buffer[i];
    }

    // 计算音频的平均音量并将其转化为百分比形式
    const volume = Math.round(Math.sqrt(sum / buffer.length) * 100);

    // 打印音频大小
    console.log(`volume: ${volume}`);
    this.volumeRate = volume;
  };
}

切换麦克风监听:需要先关掉媒体流,然后通过 deviceId 打开指定设备,开启监听模式

js 复制代码
// 关闭操作
async closeStream() {
  if (this.stream && this.stream.getTracks()) {
    this.stream.getTracks().forEach((track: MediaStreamTrack) => {
      track.stop();
    });
  }
  await this.audioCtx?.close();
}

// 切换媒体设备操作
async changeAudio(deviceId) {
  await this.closeStream();
  getUserMedia({ audio: { deviceId } }, (mediaStream) => {
    this.stream = mediaStream;
    // 监听麦克风音量大小
    this.getAudioVolume(mediaStream);
  });
}

3. 录音检测

录音检测:用户录制自己的一段声音,然后播放听听是否符合自己的声音,录音质量咋样,是否有噪音干扰等等,检测用户设备整体质量。

直接使用js-audio-recorder插件

  1. 创建录音:配置参数如下
  • sampleBits:采样位数,支持 8 或 16,默认是 16
  • sampleRate:采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值
  • numChannels:声道,支持 1(单声道) 或 2(双声道), 默认是 1
js 复制代码
import Recorder from "js-audio-recorder";
// 创建录音对象
const recorder = new Recorder({
  sampleBits: 16,
  sampleRate: 16000,
  numChannels: 1,
});
  1. 开始录音:默认录制 5s 的声音,5s 后自动停止。
js 复制代码
startRecord() {
  this.isRecording = true;
  recorder.start();
  this.time = 5;
  this.timer = setInterval(() => {
    this.time--;
    if (this.time <= 0) {
      this.stopRecord();
    }
  }, 1000);
}
  1. 停止录音
js 复制代码
stopRecord() {
  clearInterval(this.timer);
  this.isRecording = false;
  this.timer = null;
  recorder.stop();
}
  1. 播放录音
js 复制代码
playRecord() {
  recorder.play();
}
相关推荐
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
bobostudio19952 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
黄尚圈圈3 小时前
Vue 中引入 ECharts 的详细步骤与示例
前端·vue.js·echarts
浮华似水4 小时前
简洁之道 - React Hook Form
前端
正小安6 小时前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光7 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   7 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发