动态

详情 返回 返回

前端recorder-core實時錄音並繪製波形,blob常規數據格式 - 动态 详情

npm:https://www.npmjs.com/package/recorder-core

npm install recorder-core

這裏是常規錄音,每次結束後返回完整音頻blob,中間返回,並且結束後關閉音頻錄製並清空緩存
下面是一個vue3+ts+arco.design的案例,直接複製到項目中運行即可

<template>
  <div class="snow-page">
    <div class="snow-inner">
      <a-space direction="vertical" fill>
        <!-- 波形繪製區域 -->
        <div style="display: inline-block; vertical-align: bottom; border: 1px solid #cccccc">
          <div style="width: 300px; height: 100px" ref="recwave"></div>
        </div>
        <a-space>
          <a-button type="primary" @click="recOpen">打開錄音權限</a-button>
          <a-button type="primary" @click="recStart">開始錄音</a-button>
          <a-button @click="recStop">結束錄音</a-button>
          <a-button @click="recPlay">本地試聽</a-button>
        </a-space>
      </a-space>
    </div>
  </div>
</template>

<script setup lang="ts">
//必須引入的核心
import Recorder from "recorder-core";

//引入mp3格式支持文件;如果需要多個格式支持,把這些格式的編碼引擎js文件放到後面統統引入進來即可
import "recorder-core/src/engine/mp3";
import "recorder-core/src/engine/mp3-engine";
//錄製wav格式的用這一句就行
import "recorder-core/src/engine/wav";

//可選的插件支持項,這個是波形可視化插件
import "recorder-core/src/extensions/waveview";
//ts import 提示:npm包內已自帶了.d.ts聲明文件(不過是any類型)

let rec: any;
let recBlob: any;
let wave: any;
const recwave = ref(null);
// 打開錄音
const recOpen = () => {
  //創建錄音對象
  rec = Recorder({
    type: "mp3", //錄音格式,可以換成wav等其他格式
    sampleRate: 16000, //錄音的採樣率,越大細節越豐富越細膩
    bitRate: 16, //錄音的比特率,越大音質越好
    onProcess: (buffers: any, powerLevel: any, bufferDuration: any, bufferSampleRate: any, newBufferIdx: any, asyncEnd: any) => {
      //錄音實時回調,大約1秒調用12次本回調,可實時繪製波形,實時上傳(發送)數據
      console.log("實時回調", buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd);

      if (wave) {
        wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate);
      }
    }
  });
  if (!rec) {
    alert("當前瀏覽器不支持錄音功能!");
    return;
  }
  //打開錄音,獲得權限
  rec.open(
    () => {
      console.log("錄音已打開");
      if (recwave.value) {
        //創建音頻可視化圖形繪製對象
        wave = Recorder.WaveView({ elem: recwave.value });
      }
    },
    (msg: any, isUserNotAllow: any) => {
      //用户拒絕了錄音權限,或者瀏覽器不支持錄音
      console.log((isUserNotAllow ? "UserNotAllow," : "") + "無法錄音:" + msg);
    }
  );
};
// 開始錄音
const recStart = () => {
  if (!rec) return console.error("未打開錄音");
  rec.start();
  console.log("已開始錄音");
};
// 結束錄音
const recStop = () => {
  if (!rec) return console.error("未打開錄音");
  rec.stop(
    (blob: any, duration: any) => {
      recBlob = blob;
      const localUrl = (window.URL || webkitURL).createObjectURL(blob);
      console.log("錄音成功", blob, localUrl, "時長:" + duration + "ms");
      upload(blob);
      rec.close(); //關閉錄音,釋放錄音資源,當然可以不釋放,後面可以連續調用start
      rec = null;
    },
    (err: any) => {
      console.error("結束錄音出錯:" + err);
      rec.close(); //關閉錄音,釋放錄音資源,當然可以不釋放,後面可以連續調用start
      rec = null;
    }
  );
};
// 上傳錄音
const upload = (blob: any) => {
  console.log("上傳錄音", blob);
};
// 本地播放錄音
const recPlay = () => {
  const localUrl = URL.createObjectURL(recBlob);
  const audio = document.createElement("audio");
  audio.controls = true;
  document.body.appendChild(audio);
  audio.src = localUrl;
  audio.play();
  //注意不用了時需要revokeObjectURL,否則霸佔內存
  setTimeout(function () {
    URL.revokeObjectURL(audio.src);
  }, 5000);
};
</script>
user avatar chendongyuan 头像 zhuweitao 头像 shoyuf 头像 axui 头像
点赞 4 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.