vue前端获取/切换麦克风,播放采集音频和采集音量大小

这篇具有很好参考价值的文章主要介绍了vue前端获取/切换麦克风,播放采集音频和采集音量大小。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

使用时确保你有如下依赖且版本为Vue2,终端里面运行

npm install element-ui
npm install recordrtc
npm install sass sass-loader

二、案列图示

vue 麦克风,Vue,vue.js,音视频,前端

vue 麦克风,Vue,vue.js,音视频,前端

三、代码

1、获取麦克风列表

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  var Mic = []
  // 弹框获取麦克风
  navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
    navigator.mediaDevices.enumerateDevices().then(function (devices) {
      devices.forEach(function (device) {
        if(device.kind === 'audioinput'){ // 麦克风
          if(device.deviceId != 'default' && device.deviceId != 'communications'){
            that.Mic.push(device)
          }
        }
      });
    })
  // 只是为了获取麦克风权限,获取以后立马关闭
  stream.getTracks().forEach(track => track.stop());
  })
}

2、用户在麦克风列表里面选择一个麦克风

<el-form
  style="padding: 0 80px"
  ref="mainFormRef"
  :model="main_form"
  label-width="100px"
  :rules="rules"
>
  <el-form-item label="声纹采集:" prop="file">
    <el-select :disabled="voiceStatus" style="width: 200px;" v-model="main_form.chooseMicDeviceId" placeholder="请选择麦克风">
      <el-option
        v-for="item in Mic"
        :key="item.deviceId"
        :label="item.label"
        :value="item.deviceId">
      </el-option>
    </el-select>
    <div class="voiceGather" v-if="main_form.chooseMicDeviceId != ''">
      <el-button style="margin-top: 20px;" @click="voiceInput">{{ voiceStatus ? '取消录音' : '开始录音' }}</el-button>
      <!-- 正在录制 -->
      <template v-if="voiceStatus">
        <div class="bo">
          <div v-for="(item, index) in RMSList" :key="index" :style="{height: item / 100 * 40 + 'px'}" class="RMS"></div>
        </div>
      </template>
    </div>
  </el-form-item>
</el-form>

3、选取了麦克风以后使用当前麦克风录音

重要代码:audio: { deviceId: this.form.chooseMicDeviceId },将上面选的麦克风放到getUserMedia中,即可启用用户自己选择的麦克风

// 开始录音
startRecord(){
  var that = this
  this.voiceStatus = true
  // mediaDevices可提供对相机和麦克风等媒体输入设备的连接访问
  window.navigator.mediaDevices.getUserMedia(
    { audio: { deviceId: this.main_form.chooseMicDeviceId }}
    ).then((stream) => {
    this.stream = stream;
    this.getVoice()
    
    this.recorder = RecordRTC(stream, {
      type: 'audio',
      mimeType: 'audio/wav',
      recorderType: RecordRTC.StereoAudioRecorder,
      desiredSampRate: 16000,
      numberOfAudioChannels: 1, // 单声道
      timeSlice: 30000,
      // bufferSize: 4096, // 缓存大小
      ondataavailable: this.sendData,
    });
    this.recorder.startRecording();
  }).catch(function(err) {
    console.log(err);
    console.log('当前浏览器不支持开启麦克风!');
    that.voiceStatus = false
  });
},

在sendData中可以把数据流传给后端,可以播放/下载采集到的数据流,也可以将数据流转换成file传给后端文章来源地址https://www.toymoban.com/news/detail-721006.html

sendData(blob) {
  var BB =new Blob([blob], {'type': 'audio/wav; codecs=opus'})
  // var audioURL = window.URL.createObjectURL(BB)

  // 播放
  // const audio = document.createElement('audio')
  // audio.controls = true // 音频是否显示控件
  // audio.src = audioURL
  // audio.play()

  // 下载
  // let a = document.createElement("a");
  // a.href = audioURL;
  // a.download = '测试';
  // a.click();
  // // 释放这个临时的对象url
  // window.URL.revokeObjectURL(audioURL);

  let file = new window.File([BB], '测试.wav')
  console.log(file);
},

4、获取采集的音频音量大小

// 获取音量值大小
getVoice() {
  const audioContext = new (window.AudioContext || window.webkitAudioContext)()
  // 将麦克风的声音输入这个对象
  const mediaStreamSource = audioContext.createMediaStreamSource(this.stream)
  // 创建分析节点
  const analyserNode = audioContext.createAnalyser()
  // 连接节点
  mediaStreamSource.connect(analyserNode)
  // 可以实时听到麦克风采集的声音
  // analyserNode.connect(audioContext.destination)

  // 获取音量数据
  const dataArray = new Uint8Array(analyserNode.frequencyBinCount);

  function getVolume() {
    analyserNode.getByteFrequencyData(dataArray);
    let sum = 0;
    for (let i = 0; i < dataArray.length; i++) {
      sum += dataArray[i];
    }
    // 计算平均音量
    const averageVolume = sum / dataArray.length;
    return averageVolume;
  }

  // 每隔一段时间获取一次音量
  this.timer1 = setInterval(() => {
    const volume = getVolume();
    console.log('音量:', Math.round( volume ));
    RMSList.value.unshift(Math.round(volume));
    RMSList.value.pop();
    // 在这里可以根据需要进行相应的处理
  }, 100);
},

四、全部代码

<template>
  <div class="Page">
    <el-form
      style="padding: 0 80px"
      ref="mainFormRef"
      :model="main_form"
      label-width="100px"
      :rules="rules"
    >
      <el-form-item label="声纹采集:" prop="file">
        <el-select :disabled="voiceStatus" style="width: 200px;" v-model="main_form.chooseMicDeviceId" placeholder="请选择麦克风">
          <el-option
            v-for="item in Mic"
            :key="item.deviceId"
            :label="item.label"
            :value="item.deviceId">
          </el-option>
        </el-select>
        <div class="voiceGather" v-if="main_form.chooseMicDeviceId != ''">
          <el-button style="margin-top: 20px;" @click="voiceInput">{{ voiceStatus ? '取消录音' : '开始录音' }}</el-button>
          <!-- 正在录制 -->
          <template v-if="voiceStatus">
            <div class="bo">
              <div v-for="(item, index) in RMSList" :key="index" :style="{height: item / 100 * 40 + 'px'}" class="RMS"></div>
            </div>
          </template>
        </div>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import RecordRTC from 'recordrtc'

export default {
  data() {
    return {
      recorder: '',
      voiceStatus: false, // 是否正在录音
      main_form: {
        chooseMicDeviceId: '', // 选择的麦克风id
      },
      Mic: [], // 可选择的麦克风
      rules: {
        file: [
          { required: true, message: "不能为空", trigger: "blur" },
        ],
      },
      RMSList = [
		  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		  0, 0, 0, 0,
		]
    };
  },
  created() {},
  mounted() {
    this.getMic()
  },
  methods: {
    // 获取当前页面可以选择的麦克风
    getMic(){
      let that = this;
      if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        // 弹框获取麦克风
        navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
          navigator.mediaDevices.enumerateDevices().then(function (devices) {
            devices.forEach(function (device) {
              console.log(devices);
              if(device.kind === 'audioinput'){ // 麦克风
                if(device.deviceId != 'default' && device.deviceId != 'communications'){
                  that.Mic.push(device)
                }
              }
            });
          })
          stream.getTracks().forEach(track => track.stop());
        })
      }
      
    },

    // 语音输入
    voiceInput(){
      // 正在语音输入
      if(this.voiceStatus) {
        this.stopRecord() // 停止输入
      } else { // 开启语音输入
        this.startRecord()
      }
    },

    // 开始录音
    startRecord(){
      var that = this
      this.voiceStatus = true
      // mediaDevices可提供对相机和麦克风等媒体输入设备的连接访问
      window.navigator.mediaDevices.getUserMedia(
        { audio: { deviceId: this.main_form.chooseMicDeviceId }}
        ).then((stream) => {
        this.stream = stream;
        this.getVoice()
        
        this.recorder = RecordRTC(stream, {
          type: 'audio',
          mimeType: 'audio/wav',
          recorderType: RecordRTC.StereoAudioRecorder,
          desiredSampRate: 16000,
          numberOfAudioChannels: 1, // 单声道
          timeSlice: 1000,
          // bufferSize: 4096, // 缓存大小
          ondataavailable: this.sendData,
        });
        this.recorder.startRecording();
      }).catch(function(err) {
        console.log(err);
        console.log('当前浏览器不支持开启麦克风!');
        that.voiceStatus = false
      });
    },

    // 结束录音
    stopRecord(){
      this.voiceStatus = false
      if (this.recorder != null) {
        let recorder = this.recorder
        recorder.stopRecording();
        let stream = this.stream;
        clearInterval(this.timer1);
        this.RMSList= [
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0,
      ];
        stream.getAudioTracks().forEach(track => track.stop());
      }
    },

    // 获取音量值大小
    getVoice() {
      const audioContext = new (window.AudioContext || window.webkitAudioContext)()
      // 将麦克风的声音输入这个对象
      const mediaStreamSource = audioContext.createMediaStreamSource(this.stream)
      // 创建分析节点
      const analyserNode = audioContext.createAnalyser()
      // 连接节点
      mediaStreamSource.connect(analyserNode)
      // 可以实时听到麦克风采集的声音
      // analyserNode.connect(audioContext.destination)

      // 获取音量数据
      const dataArray = new Uint8Array(analyserNode.frequencyBinCount);

      function getVolume() {
        analyserNode.getByteFrequencyData(dataArray);
        let sum = 0;
        for (let i = 0; i < dataArray.length; i++) {
          sum += dataArray[i];
        }
        // 计算平均音量
        const averageVolume = sum / dataArray.length;
        return averageVolume;
      }

      // 每隔一段时间获取一次音量
      this.timer1 = setInterval(() => {
        const volume = getVolume();
        console.log('音量:', Math.round( volume ));
        // 在这里可以根据需要进行相应的处理
        this.RMSList.unshift(Math.round(volume));
    	this.RMSList.value.pop();
      }, 100);
    },

    // 每timeSlice执行一次
    sendData(blob) {
      var BB = new Blob([blob], {'type': 'audio/wav; codecs=opus'})
      // var audioURL = window.URL.createObjectURL(BB)

      // 播放
      // const audio = document.createElement('audio')
      // audio.controls = true // 音频是否显示控件
      // audio.src = audioURL
      // audio.play()

      // 下载
      // let a = document.createElement("a");
      // a.href = audioURL;
      // a.download = '测试';
      // a.click();
      // // 释放这个临时的对象url
      // window.URL.revokeObjectURL(audioURL);

      let file = new window.File([BB], '测试.wav')
      console.log(file);
    },
  },
};
</script>

<style lang="scss" scoped>

.Page{
  padding: 20px;
}
</style>

到了这里,关于vue前端获取/切换麦克风,播放采集音频和采集音量大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android麦克风数据采集格式和常见的编码格式

    在 Android 平台上,PCM(脉冲编码调制)数据是一种常用的音频数据表示格式。PCM 是一种无损音频编码,可以捕捉和存储原始音频信号的波形。在 Android 系统中,开发人员可以使用 PCM 数据处理音频信号,以实现音频播放、录音、实时语音通信等功能。 在处理 PCM 数据时,And

    2023年04月08日
    浏览(54)
  • STM32驱动INMP441麦克风实现左右通道声音采集

    注意INMP441的第4引脚,用来选择左声道还是右声道。 代码使用cubemx生成 根据以上说明,最后一个参数size的单位是由数据帧的长度决定的。前面在Cube中设置的数据格式为24 Bits Data on 32 Bits Frame,因此DMA读取数据的总长度为size×4字节。前面定义的DMA缓冲区是一个长度为4的uint3

    2024年02月14日
    浏览(63)
  • android开发获取手机麦克风设备信息

    之前为了测试蓝牙耳机的麦克,想从蓝牙耳机的麦克录音。尝试发现三星、小米自带的录音机并不能从蓝牙录音。看了网上一篇文章,提供了一个特定的录音APP,才支持开启蓝牙录音功能。 非常令人疑惑。想到现在的手机,有不只一个麦克风,是否能开发一个可选择录音源的

    2024年04月16日
    浏览(47)
  • 传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

             使用不同传感器前需要了解其连接及通信方式。对于 ESP-WROOM-32 and INMP441麦克风 是通过 I2S 方式进行通信。具体连接引脚参照下图: ESP-WROOM-32引脚示意图          使用的麦克风为MEMS麦克风,具体规格可参照芯片规格数说明。 INMP441麦克风         I2S音频连接

    2024年02月09日
    浏览(45)
  • Android 使用外置USB麦克风MIC录音遇到问题并解决(含录音播放源码)

    使用RK3399的开发板,跑Android8.1系统 一开始插上外置的USB麦克风的时候,无法使用 查看USB麦克风拔插过程的debug打印日志 插入USB麦克风后,adb 查询当前声卡信息 cat cards 通过分析发现,USB麦克风设备没有枚举出来,节点都没挂载上去 这时候就怀疑是硬件问题, USB麦克风设备

    2024年02月09日
    浏览(85)
  • DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)

    本文DEMO源码下载: https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕录像(windows屏幕录像,硬件编码,声音捕获,音视频同步) 由于篇幅有限,分为4篇发表: 1、SDK接口一览: 2、声音采集部分: 3、屏幕捕获部分: 4、编码,录像部分: 距离上篇文章已经过了快1年了,才

    2023年04月17日
    浏览(52)
  • 音频——数字麦克风和模拟麦克风(DMIC/AMIC)

    麦克风 (microphone):是将声音信号转换为电信号的能量转换器件,也就是用来采集你说话的声音 扬声器 (speaker):是一种把电信号转变为声信号的换能器件,就是把对方说话产生的电信号转换成声音播放出来。 简单来说,麦克风的功能是采集声音,扬声器的功能是播放声音。

    2024年02月10日
    浏览(77)
  • 电脑麦克风没声音?

    这3招就可以解决! 在我们使用电脑录制视频时,有时会遇到一个令人头疼的问题:麦克风没有声音。那么,为什么会出现这种情况呢?更重要的是,我们应该如何解决这个问题呢?本文将介绍3种方法,帮助您解决麦克风没有声音的难题! 方法一:通过声音设置来调整麦克风

    2024年02月13日
    浏览(53)
  • 麦克风分类汇总

    1)按声电转换原理分为:电动式(动圈式、铝带式),电容式(直流极化式)、压电式(晶体式、陶瓷式)、以及电磁式、碳粒式、半导体式等。 2)按声场作用力分为:压强式、压差式、组合式、线列式等。 3)按电信号的传输方式分为:有线、无线(无线麦克风分为三个频段,

    2024年02月09日
    浏览(51)
  • 成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入

    成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入 目录 1.解决问题 2.解决方法 电脑无法录制声音,经过查看发现问题,麦克风Realtek(R) Audio未插入 搜索框输入Realtek Audio Console→麦克风阵列→点击取消静音,即可! 哈哈,大功告成! 完工了!!

    2024年02月11日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包