Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >音量检测

音量检测

作者头像
前端小鑫同学
发布于 2022-12-26 04:37:49
发布于 2022-12-26 04:37:49
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

写作背景:

在一些在线会议软件、通讯软件中尤其是头一次使用麦克风设备,当电脑中存在多个麦克风设备的时候,往往初始的设备有可能并不是我们想使用的,或者有时候设备故障的时候也需要通过音量的检测来进行判断。我们可以通过音量条的显示来反馈当前设备是否正常工作。

HTML5 中提供的 AudioContext 对象用来专门处理音频,通过上下文创建的各种 AudioNode 相互链接。

模板定义:

提供一个启动麦克风的按钮事件和一个用来显示音量的 div 元素,通过动态改变元素的宽度来实时显示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <h2>音量检测</h2>
  <a-divider />
  <a-button @click="openMicrophone">打开麦克风</a-button>
  <div
    :style="{
      width: `${audioLevel}px`,
      height: '10px',
      background: '#8dc63f',
      marginTop: '20px',
    }"
  ></div>
</template>

启动麦克风和检测:

实例化 SoundMeter ,并注册监听来回调音量数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
soundMeter.value = new SoundMeter(
    new window.AudioContext(),
    (instant: number) => {
      audioLevel.value = Number(instant.toFixed(2)) * 348 + 1;
    }
);

通过 getUserMedia 设置允许音频的约束来启动麦克风,并对接检测工具

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const constraints: MediaStreamConstraints = { audio: true, video: false };
  navigator.mediaDevices
    .getUserMedia(constraints)
    .then((stream: MediaStream) => {
      soundMeter.value?.connectToSource(stream);
    })
  .catch(handleError);

当组件卸载后我们需要停掉检测音量的工具类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onUnmounted(() => {
  soundMeter.value?.stop();
});

检测音量工具类:

在工具类中通过 onaudioprocess 来实时回调音量的数据,通过计算来得到一个适用于显示的数值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class SoundMeter {
  mic: MediaStreamAudioSourceNode | undefined;
  script: ScriptProcessorNode;
  context: AudioContext;
  constructor(context: AudioContext, onAudioProcess: Function) {
    this.context = context;
    this.script = context.createScriptProcessor(2048, 1, 1);
    this.script.onaudioprocess = function (event) {
      let input = event.inputBuffer.getChannelData(0) || 0;
      let sum = 0.0;
      for (let i = 0; i < input.length; ++i) {
        sum += input[i] * input[i];
      }
      onAudioProcess &amp;&amp; onAudioProcess(Math.sqrt(sum / input.length));
    };
  }

  connectToSource(stream: MediaStream) {
    this.mic = this.context.createMediaStreamSource(stream);
    this.mic.connect(this.script);
    // necessary to make sample run, but should not be.
    this.script.connect(this.context.destination);
  }

  stop() {
    this.mic &amp;&amp; this.mic.disconnect();
    this.script &amp;&amp; this.script.disconnect();
  }
}

结语:

这一篇通过一个案例完成了音量的显示和检测音量的变化,明天继续学~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022高频前端面试题合集之JavaScript篇(上)
解析:该题主要考察就是对 js 中的继承是否了解,以及常见的继承的形式有哪些。最常用的继承就是「组合继承」(伪经典继承)和圣杯模式继承。下面附上 js 中这两种继承模式的详细解析。
程序员法医
2022/12/20
1.2K0
2022高频前端面试题合集之JavaScript篇(上)
字节跳动最爱考的前端面试题:JavaScript 基础
JavaScirpt 使用 Number 类型来表示数字(整数或浮点数),遵循 IEEE 754 标准,通过 64 位来表示一个数字(1 + 11 + 52)
一只图雀
2021/03/03
1.5K0
字节跳动最爱考的前端面试题:JavaScript 基础
前端知识点总结js篇(中)
(总结不够全面,建议参考es6.ruanyifeng.com/#docs/promi…
zhouzhouya
2023/10/26
2730
前端知识点总结js篇(中)
横扫 JS 面试核心考点
Javascript是前端面试的重点,本文重点梳理下Javascript中的常考知识点,然后就一些容易出现的题目进行解析。限于文章的篇幅,无法将知识点讲解的面面俱到,因此只罗列了一些重难点。
grain先森
2019/04/18
1.6K0
横扫 JS 面试核心考点
深入理解this绑定
js中的词法作用域是静态的,需要关注的往往是函数的声明位置而不是调用位置—–例如闭包引用自由变量时,应该注意闭包函数的声明位置;而this却在某种程度上类似于动态作用域,this到底绑定的是谁,要看函数的调用位置(或者说调用方法),只有在函数调用的时候this的指向才能被确定。
Chor
2019/11/07
4950
【知乎热门回答】——JavaScript 的 this 原理是什么?
知乎上「JavaScript 的 this 原理是什么?」这个问题下:有一句话解释 JavaScript 的 this 指向的,有抖机灵“骗赞”的;有人说 JavaScript 的 this 某种程度上体现了 JavaScript 初期设计的不足,不需要太过于研究这些糟粕;也有的翻出规范,“照本宣科”,也许这会让你更“云里雾里”。
童欧巴
2021/08/20
6190
ES的新特性
首先来看一下ES6新增加的特性块级作用域,至于作用域的深入讲解后续会专门出一篇文章进行讲解
用户3045442
2020/08/06
1.1K0
2021JavaScript面试题(最新)不定时更新(2021.11.6更新)
js 一共有六种基本数据类型,分别是 Undefined、Null、Boolean、Number、String,还有在 ES6 中新增的 Symbol 类型。 Symbol 代表创建后独一无二且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。
全栈程序员站长
2022/09/07
2.7K0
[前端面试]每日一题
Vue和React都是通过 diff 算法对比新旧虚拟树节点差异,然后更新节点。当新旧节点对比不一致时,会根据节点的 key 去找寻旧节点,如果未找到则表明为新的节点,反之会进行复用。
狂奔滴小马
2021/11/15
1.3K0
[前端面试]每日一题
JS入门难点解析7-this
(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)
love丁酥酥
2018/08/27
7620
面了十多家,总结出20道JavaScript 必考的面试题!
面临毕业季,相信有很多朋友正在进行找工作,背面试题;今天就分享给大家20道JavaScript必会的问题
程序员老鱼
2023/09/07
2420
面了十多家,总结出20道JavaScript 必考的面试题!
js面试题及答案2020_JS面试题大全
number、string、bootlean、null、undefined、Bigint 、Symbol
全栈程序员站长
2022/09/27
3880
es6学习笔记
ECMAScript 6.0( 以下简称ES6) 是JavaScript语言的下一代标准。
earthchen
2020/09/24
9980
最失败的 JavaScript 面试问题
很难想象有哪个JavaScript面试不会提到事件循环这个主题。这并非没有道理,这个主题确实是非常基础的,并且每天都被React、Vue、你用的任何框架的开发者所使用。
前端小智@大迁世界
2023/09/19
2670
JS面试之函数(1)
1.函数声明有预解析,而且函数声明的优先级高于变量; 2.使用Function构造函数定义函数的方式是一个函数表达式,这种方式会导致解析两次代码,影响性能。第一次解析常规的JavaScript代码,第二次解析传入构造函数的字符串
火狼1
2019/04/17
2.1K0
JS面试之函数(1)
前端面试之JavaScript
基本类型(值类型): Number(数字),String(字符串),Boolean(布尔),Symbol(符号),null(空),undefined(未定义)在内存中占据固定大小,保存在栈内存中
CODER-V
2023/03/04
8010
前端面试之JavaScript
《你不知道的js(上卷)》笔记2(this和对象原型)
this关键字是javascript中最复杂的机制之一。它是一个很特别的关键字,被自动定义在 所有函数的作用域中。
陨石坠灭
2020/01/21
7320
前端经典面试题(60道前端面试题包含JS、CSS、React、网络、浏览器、程序题等)
原文地址:https://mp.weixin.qq.com/s/PTSaytcf3xgOp6C9l3Pvjw
前端迷
2021/06/24
1.1K0
阿里前端一面必会面试题合集
需要注意的是最后一个定时器打印出的p1其实是.finally的返回值,我们知道.finally的返回值如果在没有抛出错误的情况下默认会是上一个Promise的返回值,而这道题中.finally上一个Promise是.then(),但是这个.then()并没有返回值,所以p1打印出来的Promise的值会是undefined,如果在定时器的下面加上一个return 1,则值就会变成1。
loveX001
2022/09/11
3400
前端面试题---JS部分
转载链接:https://blog.csdn.net/qq_54753561/article/details/122149197
用户8087287
2022/10/31
8240
前端面试题---JS部分
相关推荐
2022高频前端面试题合集之JavaScript篇(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验