Vue3封装hooks实现实时获取麦克风音量

 更新时间:2024年03月13日 09:45:04   作者:非洲难民  
这篇文章主要为大家详细介绍了Vue3如何通过封装一个hooks实现实时获取麦克风音量功能,文中的示例代码讲解详细,需要的小伙伴可以参考一下

之前是在做一个electron项目中需要去检测音量,检测音量不是为了证明音量本身,而是去看看麦克风是否正常响应。

如图所示:这是一个模仿腾讯会议的音量检测的UI

在浏览器中是无法获取真实设备的电平输入的,所以此方法是通过后去音频数据来计算出音量,并非系统实际音量

使用场景

  • 在web端对麦克风进行检测,看看麦克风是否有效
  • 在electron、Capacitor等以web交互为主开发的应用都可以支持(比如:electron应用)
// useVolume.ts

import { ref } from 'vue'

/**
 * 实时获取麦克风音量
 * 此方法是通过后去音频数据来计算出音量,并非系统实际音量
 * @param _audioContext 如果传入AudioContext,则使用它,否则新建一个音频来获取音量大小
 * @returns
 */
export const useVolume = () => {
  const audioContext = ref<AudioContext | null>()
  const analyser = ref<AnalyserNode | null>(null)
  const isStart = ref<boolean>(false)
  // 音量[0, 100]
  const volume = ref<number>(0)

  /**
   * 开启音量检测
   * @param _source 数据源
   * @param _audioContext audio上下文 (用于在录音的过程中同时去检测,这样就不需要再次创建多一个audio上下文)
   * @param deviceId 麦克风设备ID,用于指定检测那个麦克风的音量
   */
  const startVolumeCheck = async (
    _source?: MediaStreamAudioSourceNode | null,
    _audioContext?: AudioContext | null,
    deviceId?: string | null,
  ) => {
    if (!audioContext.value) {
      if (_audioContext) {
        audioContext.value = _audioContext
      } else {
        audioContext.value = new AudioContext()
      }
    }

    isStart.value = true
    const mediaOptions = deviceId
      ? { audio: { deviceId: deviceId } }
      : { audio: true }
    let source = _source
    if (!source) {
      const stream = await navigator.mediaDevices.getUserMedia(mediaOptions)
      source = audioContext.value.createMediaStreamSource(stream)
    }

    analyser.value = audioContext.value.createAnalyser()
    analyser.value!.fftSize = 32
    source.connect(analyser.value!)

    // 创建数据缓冲区
    const bufferLength = analyser.value!.frequencyBinCount
    const dataArray = new Uint8Array(bufferLength)

    // 定义更新音量的函数
    function updateVolume() {
      analyser.value!.getByteFrequencyData(dataArray)

      let sum = 0
      for (let i = 0; i < bufferLength; i++) {
        sum += dataArray[i]
      }
      volume.value = Math.floor((sum / bufferLength / 255) * 100)

      if (isStart.value) {
        requestAnimationFrame(updateVolume)
      } else {
        volume.value = 0
      }
    }

    // 开始更新音量
    updateVolume()
  }
  
  // 暂停检测
  const stopVolumeCheck = () => {
    isStart.value = false
    analyser.value?.disconnect()
  }

  return {
    startVolumeCheck,
    stopVolumeCheck,
    volume,
    isStart,
  }
}

提示:在检测麦克风之前,需要获取麦克风权限,并且获取到你正在使用的麦克风

到此这篇关于Vue3封装hooks实现实时获取麦克风音量的文章就介绍到这了,更多相关Vue3获取麦克风音量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Vue开发人员的7个最好的VSCode扩展

    浅谈Vue开发人员的7个最好的VSCode扩展

    这篇文章主要介绍了浅谈Vue开发人员的7个最好的VSCode扩展,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Vue3前端生成随机id(生成 UUID)实际运用

    Vue3前端生成随机id(生成 UUID)实际运用

    前端在做增删改查时通常会使⽤⼀个唯⼀数值做为数据的key值,下面这篇文章主要给大家介绍了关于Vue3前端生成随机id(生成 UUID)的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下
    2024-04-04
  • 通过Vue+axios获取接口数据的示例详解

    通过Vue+axios获取接口数据的示例详解

    这篇文章主要介绍了Vue结合axios获取笑话接口数据的示例,重点讲解axios的特性、使用方法及请求方式,演示如何通过get方法获取数据并展示,同时解决this指向问题,感兴趣的小伙伴跟着小编一起来看看吧
    2025-08-08
  • vue踩坑日记之params传递参数问题

    vue踩坑日记之params传递参数问题

    这篇文章主要介绍了vue踩坑日记之params传递参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue前后端端口不一致的问题解决

    vue前后端端口不一致的问题解决

    本文主要介绍了vue前后端端口不一致的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • vuex状态持久化在vue和nuxt.js中的区别说明

    vuex状态持久化在vue和nuxt.js中的区别说明

    这篇文章主要介绍了vuex状态持久化在vue和nuxt.js中的区别说明,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue FileManagerPlugin 报错问题及解决

    Vue FileManagerPlugin 报错问题及解决

    这篇文章主要介绍了Vue FileManagerPlugin 报错问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 详解在vue3中使用jsx的配置以及一些小问题

    详解在vue3中使用jsx的配置以及一些小问题

    本文主要介绍了在vue3中使用jsx的配置以及一些小问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue+openlayers+nodejs+postgis实现轨迹运动效果

    vue+openlayers+nodejs+postgis实现轨迹运动效果

    使用postgres(postgis)数据库以及nodejs作为后台,vue和openlayers做前端,openlayers使用http请求通过nodejs从postgres数据库获取数据,这篇文章主要介绍了vue+openlayers+nodejs+postgis实现轨迹运动,需要的朋友可以参考下
    2024-05-05
  • Element-UI组件实现面包屑导航栏的示例代码

    Element-UI组件实现面包屑导航栏的示例代码

    面包屑导航栏是一种用户界面组件,用于展示用户在网站或应用中的路径,它包括了从主页到当前页面的链接序列,有助于用户快速了解和导航至上级页面,本文就来介绍一下Element-UI组件实现面包屑导航栏的示例代码,感兴趣的可以了解一下
    2024-09-09

最新评论