国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue前端獲取/切換麥克風(fēng),播放采集音頻和采集音量大小

這篇具有很好參考價(jià)值的文章主要介紹了vue前端獲取/切換麥克風(fēng),播放采集音頻和采集音量大小。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、前言

使用時(shí)確保你有如下依賴且版本為Vue2,終端里面運(yùn)行

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

二、案列圖示

vue 麥克風(fēng),Vue,vue.js,音視頻,前端

vue 麥克風(fēng),Vue,vue.js,音視頻,前端

三、代碼

1、獲取麥克風(fēng)列表

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  var Mic = []
  // 彈框獲取麥克風(fēng)
  navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
    navigator.mediaDevices.enumerateDevices().then(function (devices) {
      devices.forEach(function (device) {
        if(device.kind === 'audioinput'){ // 麥克風(fēng)
          if(device.deviceId != 'default' && device.deviceId != 'communications'){
            that.Mic.push(device)
          }
        }
      });
    })
  // 只是為了獲取麥克風(fēng)權(quán)限,獲取以后立馬關(guān)閉
  stream.getTracks().forEach(track => track.stop());
  })
}

2、用戶在麥克風(fēng)列表里面選擇一個(gè)麥克風(fēng)

<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="請(qǐng)選擇麥克風(fēng)">
      <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、選取了麥克風(fēng)以后使用當(dāng)前麥克風(fēng)錄音

重要代碼:audio: { deviceId: this.form.chooseMicDeviceId },將上面選的麥克風(fēng)放到getUserMedia中,即可啟用用戶自己選擇的麥克風(fēng)

// 開始錄音
startRecord(){
  var that = this
  this.voiceStatus = true
  // mediaDevices可提供對(duì)相機(jī)和麥克風(fēng)等媒體輸入設(shè)備的連接訪問
  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('當(dāng)前瀏覽器不支持開啟麥克風(fēng)!');
    that.voiceStatus = false
  });
},

在sendData中可以把數(shù)據(jù)流傳給后端,可以播放/下載采集到的數(shù)據(jù)流,也可以將數(shù)據(jù)流轉(zhuǎn)換成file傳給后端文章來源地址http://www.zghlxwxcb.cn/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 = '測(cè)試';
  // a.click();
  // // 釋放這個(gè)臨時(shí)的對(duì)象url
  // window.URL.revokeObjectURL(audioURL);

  let file = new window.File([BB], '測(cè)試.wav')
  console.log(file);
},

4、獲取采集的音頻音量大小

// 獲取音量值大小
getVoice() {
  const audioContext = new (window.AudioContext || window.webkitAudioContext)()
  // 將麥克風(fēng)的聲音輸入這個(gè)對(duì)象
  const mediaStreamSource = audioContext.createMediaStreamSource(this.stream)
  // 創(chuàng)建分析節(jié)點(diǎn)
  const analyserNode = audioContext.createAnalyser()
  // 連接節(jié)點(diǎn)
  mediaStreamSource.connect(analyserNode)
  // 可以實(shí)時(shí)聽到麥克風(fēng)采集的聲音
  // analyserNode.connect(audioContext.destination)

  // 獲取音量數(shù)據(jù)
  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];
    }
    // 計(jì)算平均音量
    const averageVolume = sum / dataArray.length;
    return averageVolume;
  }

  // 每隔一段時(shí)間獲取一次音量
  this.timer1 = setInterval(() => {
    const volume = getVolume();
    console.log('音量:', Math.round( volume ));
    RMSList.value.unshift(Math.round(volume));
    RMSList.value.pop();
    // 在這里可以根據(jù)需要進(jìn)行相應(yīng)的處理
  }, 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="請(qǐng)選擇麥克風(fēng)">
          <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: '', // 選擇的麥克風(fēng)id
      },
      Mic: [], // 可選擇的麥克風(fēng)
      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: {
    // 獲取當(dāng)前頁面可以選擇的麥克風(fēng)
    getMic(){
      let that = this;
      if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        // 彈框獲取麥克風(fēng)
        navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
          navigator.mediaDevices.enumerateDevices().then(function (devices) {
            devices.forEach(function (device) {
              console.log(devices);
              if(device.kind === 'audioinput'){ // 麥克風(fēng)
                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可提供對(duì)相機(jī)和麥克風(fēng)等媒體輸入設(shè)備的連接訪問
      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('當(dāng)前瀏覽器不支持開啟麥克風(fēng)!');
        that.voiceStatus = false
      });
    },

    // 結(jié)束錄音
    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)()
      // 將麥克風(fēng)的聲音輸入這個(gè)對(duì)象
      const mediaStreamSource = audioContext.createMediaStreamSource(this.stream)
      // 創(chuàng)建分析節(jié)點(diǎn)
      const analyserNode = audioContext.createAnalyser()
      // 連接節(jié)點(diǎn)
      mediaStreamSource.connect(analyserNode)
      // 可以實(shí)時(shí)聽到麥克風(fēng)采集的聲音
      // analyserNode.connect(audioContext.destination)

      // 獲取音量數(shù)據(jù)
      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];
        }
        // 計(jì)算平均音量
        const averageVolume = sum / dataArray.length;
        return averageVolume;
      }

      // 每隔一段時(shí)間獲取一次音量
      this.timer1 = setInterval(() => {
        const volume = getVolume();
        console.log('音量:', Math.round( volume ));
        // 在這里可以根據(jù)需要進(jìn)行相應(yīng)的處理
        this.RMSList.unshift(Math.round(volume));
    	this.RMSList.value.pop();
      }, 100);
    },

    // 每timeSlice執(zhí)行一次
    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 = '測(cè)試';
      // a.click();
      // // 釋放這個(gè)臨時(shí)的對(duì)象url
      // window.URL.revokeObjectURL(audioURL);

      let file = new window.File([BB], '測(cè)試.wav')
      console.log(file);
    },
  },
};
</script>

<style lang="scss" scoped>

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

到了這里,關(guān)于vue前端獲取/切換麥克風(fēng),播放采集音頻和采集音量大小的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android麥克風(fēng)數(shù)據(jù)采集格式和常見的編碼格式

    在 Android 平臺(tái)上,PCM(脈沖編碼調(diào)制)數(shù)據(jù)是一種常用的音頻數(shù)據(jù)表示格式。PCM 是一種無損音頻編碼,可以捕捉和存儲(chǔ)原始音頻信號(hào)的波形。在 Android 系統(tǒng)中,開發(fā)人員可以使用 PCM 數(shù)據(jù)處理音頻信號(hào),以實(shí)現(xiàn)音頻播放、錄音、實(shí)時(shí)語音通信等功能。 在處理 PCM 數(shù)據(jù)時(shí),And

    2023年04月08日
    瀏覽(44)
  • STM32驅(qū)動(dòng)INMP441麥克風(fēng)實(shí)現(xiàn)左右通道聲音采集

    STM32驅(qū)動(dòng)INMP441麥克風(fēng)實(shí)現(xiàn)左右通道聲音采集

    注意INMP441的第4引腳,用來選擇左聲道還是右聲道。 代碼使用cubemx生成 根據(jù)以上說明,最后一個(gè)參數(shù)size的單位是由數(shù)據(jù)幀的長度決定的。前面在Cube中設(shè)置的數(shù)據(jù)格式為24 Bits Data on 32 Bits Frame,因此DMA讀取數(shù)據(jù)的總長度為size×4字節(jié)。前面定義的DMA緩沖區(qū)是一個(gè)長度為4的uint3

    2024年02月14日
    瀏覽(33)
  • android開發(fā)獲取手機(jī)麥克風(fēng)設(shè)備信息

    android開發(fā)獲取手機(jī)麥克風(fēng)設(shè)備信息

    之前為了測(cè)試藍(lán)牙耳機(jī)的麥克,想從藍(lán)牙耳機(jī)的麥克錄音。嘗試發(fā)現(xiàn)三星、小米自帶的錄音機(jī)并不能從藍(lán)牙錄音??戳司W(wǎng)上一篇文章,提供了一個(gè)特定的錄音APP,才支持開啟藍(lán)牙錄音功能。 非常令人疑惑。想到現(xiàn)在的手機(jī),有不只一個(gè)麥克風(fēng),是否能開發(fā)一個(gè)可選擇錄音源的

    2024年04月16日
    瀏覽(22)
  • 傳感器使用——ESP-WROOM-32 and INMP441麥克風(fēng)音頻采集

    傳感器使用——ESP-WROOM-32 and INMP441麥克風(fēng)音頻采集

    ?????????使用不同傳感器前需要了解其連接及通信方式。對(duì)于 ESP-WROOM-32 and INMP441麥克風(fēng) 是通過 I2S 方式進(jìn)行通信。具體連接引腳參照下圖: ESP-WROOM-32引腳示意圖 ? ? ? ? ?使用的麥克風(fēng)為MEMS麥克風(fēng),具體規(guī)格可參照芯片規(guī)格數(shù)說明。 INMP441麥克風(fēng) ????????I2S音頻連接

    2024年02月09日
    瀏覽(20)
  • Android 使用外置USB麥克風(fēng)MIC錄音遇到問題并解決(含錄音播放源碼)

    Android 使用外置USB麥克風(fēng)MIC錄音遇到問題并解決(含錄音播放源碼)

    使用RK3399的開發(fā)板,跑Android8.1系統(tǒng) 一開始插上外置的USB麥克風(fēng)的時(shí)候,無法使用 查看USB麥克風(fēng)拔插過程的debug打印日志 插入U(xiǎn)SB麥克風(fēng)后,adb 查詢當(dāng)前聲卡信息 cat cards 通過分析發(fā)現(xiàn),USB麥克風(fēng)設(shè)備沒有枚舉出來,節(jié)點(diǎn)都沒掛載上去 這時(shí)候就懷疑是硬件問題, USB麥克風(fēng)設(shè)備

    2024年02月09日
    瀏覽(30)
  • DXGI高幀率屏幕錄像軟件源碼解析(聲音捕獲,抓屏,ffmpeg錄像,MP4錄像,flv錄像,麥克風(fēng)采集)(第4篇編碼,錄像部分)

    DXGI高幀率屏幕錄像軟件源碼解析(聲音捕獲,抓屏,ffmpeg錄像,MP4錄像,flv錄像,麥克風(fēng)采集)(第4篇編碼,錄像部分)

    本文DEMO源碼下載: https://download.csdn.net/download/xjb2006/85109025 dxgi桌面屏幕錄像(windows屏幕錄像,硬件編碼,聲音捕獲,音視頻同步) 由于篇幅有限,分為4篇發(fā)表: 1、SDK接口一覽: 2、聲音采集部分: 3、屏幕捕獲部分: 4、編碼,錄像部分: 距離上篇文章已經(jīng)過了快1年了,才

    2023年04月17日
    瀏覽(20)
  • 音頻——數(shù)字麥克風(fēng)和模擬麥克風(fēng)(DMIC/AMIC)

    音頻——數(shù)字麥克風(fēng)和模擬麥克風(fēng)(DMIC/AMIC)

    麥克風(fēng) (microphone):是將聲音信號(hào)轉(zhuǎn)換為電信號(hào)的能量轉(zhuǎn)換器件,也就是用來采集你說話的聲音 揚(yáng)聲器 (speaker):是一種把電信號(hào)轉(zhuǎn)變?yōu)槁曅盘?hào)的換能器件,就是把對(duì)方說話產(chǎn)生的電信號(hào)轉(zhuǎn)換成聲音播放出來。 簡(jiǎn)單來說,麥克風(fēng)的功能是采集聲音,揚(yáng)聲器的功能是播放聲音。

    2024年02月10日
    瀏覽(22)
  • 麥克風(fēng)分類匯總

    麥克風(fēng)分類匯總

    1)按聲電轉(zhuǎn)換原理分為:電動(dòng)式(動(dòng)圈式、鋁帶式),電容式(直流極化式)、壓電式(晶體式、陶瓷式)、以及電磁式、碳粒式、半導(dǎo)體式等。 2)按聲場(chǎng)作用力分為:壓強(qiáng)式、壓差式、組合式、線列式等。 3)按電信號(hào)的傳輸方式分為:有線、無線(無線麥克風(fēng)分為三個(gè)頻段,

    2024年02月09日
    瀏覽(22)
  • 電腦麥克風(fēng)沒聲音?

    電腦麥克風(fēng)沒聲音?

    這3招就可以解決! 在我們使用電腦錄制視頻時(shí),有時(shí)會(huì)遇到一個(gè)令人頭疼的問題:麥克風(fēng)沒有聲音。那么,為什么會(huì)出現(xiàn)這種情況呢?更重要的是,我們應(yīng)該如何解決這個(gè)問題呢?本文將介紹3種方法,幫助您解決麥克風(fēng)沒有聲音的難題! 方法一:通過聲音設(shè)置來調(diào)整麥克風(fēng)

    2024年02月13日
    瀏覽(21)
  • 成功解決電腦麥克風(fēng)不管用、電腦無法錄制聲音之出現(xiàn)的麥克風(fēng)Realtek(R) Audio未插入

    成功解決電腦麥克風(fēng)不管用、電腦無法錄制聲音之出現(xiàn)的麥克風(fēng)Realtek(R) Audio未插入

    成功解決電腦麥克風(fēng)不管用、電腦無法錄制聲音之出現(xiàn)的麥克風(fēng)Realtek(R) Audio未插入 目錄 1.解決問題 2.解決方法 電腦無法錄制聲音,經(jīng)過查看發(fā)現(xiàn)問題,麥克風(fēng)Realtek(R) Audio未插入 搜索框輸入Realtek Audio Console→麥克風(fēng)陣列→點(diǎn)擊取消靜音,即可! 哈哈,大功告成! 完工了??!

    2024年02月11日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包