vue实现录音功能js-audio-recorder带波浪图效果的示例

当需要在Vue中展示录音并且需要带有波浪效果时,我们可以使用js-audio-recorder这个JavaScript库。下面将详细讲解如何在Vue中使用js-audio-recorder来实现录音功能,并带有波浪图效果的示例。

准备工作

在开始之前,我们需要进行准备工作:

  1. 在Vue项目中安装js-audio-recorder
    npm install js-audio-recorder --save

  2. 在main.js中全局引入js-audio-recorder

import AudioRecorder from 'js-audio-recorder';
window.AudioRecorder = AudioRecorder;

准备工作完成之后,我们就可以在Vue组件中使用js-audio-recorder来实现录音功能。

示例1 - 基础录音

下面是一个基础的录音示例,可以录制10秒钟的音频,录音完成后,可以通过播放按钮来播放录制的音频。

<template>
  <div>
    <div>
      <button @click="startRecording">开始录音</button>
      <button @click="stopRecording">停止录音</button>
    </div>
    <div>
      <button @click="playRecordedAudio">播放录制的音频</button>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        audioRecorder: null,
        recording: false,
        recordedAudioBlob: null
      }
    },
    mounted() {
      this.audioRecorder = new AudioRecorder();
      this.audioRecorder.onError = (err) => {
        console.error('Error:', err);
      }
      this.audioRecorder.onDataAvailable = (data) => {
        console.log('Data:', data);
        this.recordedAudioBlob = data;
      }
    },
    methods: {
      startRecording() {
        this.audioRecorder.start();
        this.recording = true;
        setTimeout(() => {
          this.stopRecording();
        }, 10000);
      },
      stopRecording() {
        this.audioRecorder.stop();
        this.recording = false;
      },
      playRecordedAudio() {
        const audioUrl = URL.createObjectURL(this.recordedAudioBlob);
        const audio = new Audio(audioUrl);
        audio.play();
      }
    }
  }
</script>

示例2 - 加入波浪效果

下面是一个加入波浪效果的示例。在这个示例中,我们使用了canvas来绘制波浪图,通过requestAnimationFrame方法来不断重绘波浪图。

<template>
  <div>
    <div>
      <button @mousedown.prevent="startRecording" @touchstart.prevent="startRecording">开始录音</button>
      <button @click="stopRecording">停止录音</button>
    </div>
    <div>
      <button @click="playRecordedAudio">播放录制的音频</button>
    </div>
    <div>
      <canvas ref="canvas" width="500" height="100"></canvas>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        audioRecorder: null,
        recording: false,
        recordedAudioBlob: null,
        animationId: null,
        canvasContext: null
      }
    },
    mounted() {
      this.audioRecorder = new AudioRecorder();
      this.audioRecorder.onError = (err) => {
        console.error('Error:', err);
      }
      this.audioRecorder.onDataAvailable = (data) => {
        console.log('Data:', data);
        this.recordedAudioBlob = data;
      }

      this.canvasContext = this.$refs.canvas.getContext('2d');
      this.drawWaveform();
    },
    methods: {
      startRecording() {
        this.audioRecorder.start();
        this.recording = true;
        this.animationId = requestAnimationFrame(this.drawWaveform);
      },
      stopRecording() {
        this.audioRecorder.stop();
        this.recording = false;
        cancelAnimationFrame(this.animationId);
      },
      playRecordedAudio() {
        const audioUrl = URL.createObjectURL(this.recordedAudioBlob);
        const audio = new Audio(audioUrl);
        audio.play();
      },
      drawWaveform() {
        this.canvasContext.clearRect(0, 0, this.$refs.canvas.width, this.$refs.canvas.height);
        if (this.recording) {
          const analyser = this.audioRecorder.getAnalyser();
          const bufferLength = analyser.fftSize;
          const dataArray = new Float32Array(bufferLength);
          analyser.getFloatTimeDomainData(dataArray);
          let maxValue = 0;
          for (let i = 0; i < dataArray.length; i++) {
            const value = Math.abs(dataArray[i]);
            if (value > maxValue) {
              maxValue = value;
            }
          }
          const waveformHeight = this.$refs.canvas.height * 0.6;
          const coef = waveformHeight / maxValue;
          this.canvasContext.beginPath();
          this.canvasContext.lineWidth = 3;
          this.canvasContext.strokeStyle = 'blue';

          const sliceWidth = this.$refs.canvas.width * 1.0 / bufferLength;
          let x = 0;
          for (let i = 0; i < bufferLength; i++) {
            const value = dataArray[i];
            const y = (value * coef) + waveformHeight / 2;
            if (i === 0) {
              this.canvasContext.moveTo(x, y);
            } else {
              this.canvasContext.lineTo(x, y);
            }
            x += sliceWidth;
          }
          this.canvasContext.stroke();
          this.animationId = requestAnimationFrame(this.drawWaveform);
        } else {
          this.canvasContext.beginPath();
          this.canvasContext.lineWidth = 3;
          this.canvasContext.strokeStyle = 'black';
          this.canvasContext.moveTo(0, this.$refs.canvas.height / 2);
          this.canvasContext.lineTo(this.$refs.canvas.width, this.$refs.canvas.height / 2);
          this.canvasContext.stroke();
        }
      }
    }
}
</script>

<style scoped>
  canvas {
    border: 1px solid black;
  }
</style>

以上两个示例可以较好地解释如何使用js-audio-recorder来在Vue中实现录音功能,同时加入波浪效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现录音功能js-audio-recorder带波浪图效果的示例 - Python技术站

(0)
上一篇 2023年6月20日
下一篇 2023年6月20日

相关文章

  • iOS 把图片保存到相册,并获取图片文件名的实例

    现在我来为您讲解一篇完整的攻略,如何在iOS中把图片保存到相册,并获取图片文件名。 步骤1:导入相册库 首先,我们需要导入Photos框架来操作相册库。在你的ViewController文件中添加如下导入语句: import Photos 步骤2:保存图片到相册 接下来,我们需要使用PHPhotoLibrary类来保存图片到相册。具体的操作步骤如下: fun…

    other 2023年6月26日
    00
  • Javascript 普通函数和构造函数的区别

    区别1:调用方式不同 Javascript普通函数和构造函数的最大区别在于它们在代码中被调用的方式不同。 普通函数是通过函数名加括号的方式调用的,例如: function calculateArea(width, height){ return width * height; } let area = calculateArea(10, 20); 而构造函数…

    other 2023年6月26日
    00
  • MyBatis一对多嵌套查询的完整实例

    MyBatis一对多嵌套查询的完整实例攻略 简介 MyBatis是一个流行的Java持久化框架,它提供了一种简单而强大的方式来与数据库进行交互。在一些场景中,我们需要进行一对多的嵌套查询,即查询一个实体对象及其关联的多个子对象。本攻略将详细介绍如何在MyBatis中实现一对多嵌套查询,并提供两个示例说明。 步骤 步骤1:创建数据库表和实体类 首先,我们需要创…

    other 2023年7月28日
    00
  • Android应用程序签名步骤及相关知识介绍

    下面我将为你讲解一下“Android应用程序签名步骤及相关知识介绍”的完整攻略。内容如下: 什么是Android应用程序签名 在Android中,每个应用程序都必须经过签名才能在手机上安装和运行。签名的目的是确保应用程序是由合法的开发者构建的,并且没有被篡改。 Android应用程序签名步骤 Android应用程序签名的步骤如下: 生成私钥 在签名应用程序之…

    other 2023年6月25日
    00
  • 7zip在dos命令行用法总结

    7zip在DOS命令行用法总结 7zip 是一款压缩/解压缩工具,安装完成后可以在命令行窗口中使用。本篇文章将详细讲解7zip在DOS命令行中的用法。 安装7zip 首先需要安装7zip,可以从官网下载最新版本的安装文件。 安装完成后,打开命令行窗口,输入“7z”命令,如果命令行窗口中出现7zip的说明,说明7zip已经安装成功。 常用命令 7zip最常用的…

    other 2023年6月27日
    00
  • windows server 2008 r2服务器系统安装及配置全过程

    下面是Windows Server 2008 R2服务器系统安装及配置全过程的完整攻略。 准备工作 首先需要准备一台计算机作为使用Windows Server 2008 R2的服务器。在购买前,有几种要注意: CPU的架构必须是64位,不能是32位; 内存大小建议是至少8GB; 网卡型号需要驱动支持。 接下来需要下载Windows Server 2008 R…

    其他 2023年4月16日
    00
  • vs提示无法连接到已配置的开发web服务器的解决方法

    以下是“VS提示无法连接到已配置的开发web服务器的解决方法”的完整攻略: 什么是“VS提示无法连接到已配置的开发web服务器”? 当使用Visual Studio进行Web开发时,时会遇到“无法连接到已配置的开发Web服务器”的错误提示。这通常是由于配置错误或网络问题导致的。 步骤1:检查Web服务器配置 首先,检查Web服务器配置是否正确。确保已正确配置…

    other 2023年5月6日
    00
  • 完美解决浏览器跨域的几种方法(汇总)

    完美解决浏览器跨域的几种方法(汇总) 在本攻略中,我们将详细讲解几种解决浏览器跨域问题的方法,并提供两个示例说明。 什么是跨域? 跨域是指在浏览器中,当一个网页的脚本试图访问另一个网页的内容时,由于浏览器的同源略,会出现访问被拒绝的情况。同源策略是浏览器的一种安全机制,它限制了一个网页的脚本只能访问同源的内容,即协议、域名和端口号都相同的网页。 解决跨域的几…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部