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获取麦克风音量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
ant design中upload组件上传大文件,显示进度条进度的实例
这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-10-10解决el-upload批量上传只执行一次成功回调on-success的问题
这篇文章主要介绍了解决el-upload批量上传只执行一次成功回调on-success的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
这篇文章主要介绍了解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-07-07
最新评论