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日

相关文章

  • bootstrap中的导航条实例代码详解

    Bootstrap中的导航条实例代码详解 1. 导航条的基本结构 在Bootstrap中,导航条(Navbar)是一种常见的网站导航组件。它提供了丰富的样式和功能选项。以下是导航条的基本结构: <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a c…

    other 2023年6月28日
    00
  • word首行怎么缩两个字段呢?

    当我们需要在Word文档中对某一个段落进行缩进操作时,我们就可以使用Word的缩进功能。其中,首行缩进是一种常见的排版方式,即让段落的第一行向右缩进一定距离,使整个段落看起来更加整齐美观。下面是Word首行缩进的完整攻略: 方法一:使用快捷键 使用快捷键可以方便地实现首行缩进。具体步骤如下: 选中你需要进行首行缩进的段落。 按下键盘上的“Ctrl”和“T”键…

    other 2023年6月25日
    00
  • serv-u安全配置完整版

    Serv-U 是一款常用的 FTP 服务器软件,为了保证服务器的安全性,需要进行安全配置。以下为 Serv-U 完整版安全配置攻略。 1. HTTPS 连接 为了保证数据传输的安全,我们可以开启 HTTPS 连接,具体步骤如下: 在 Serv-U 管理界面选择“网站” -> “网站配置”; 在“网站配置”界面中,点击“添加”新建一个网站; 在新建的网站…

    other 2023年6月27日
    00
  • ubuntuservice说明与使用方法

    ubuntuservice 说明与使用方法 ubuntuservice 是一个 systemd 服务管理工具,它集成了 systemctl 命令,为用户提供了更加友好的服务管理体验。本篇文章将介绍 ubuntuservice 的简单介绍以及使用方法。 安装 你可以通过以下命令来安装 ubuntuservice 工具: sudo apt-get update …

    其他 2023年3月29日
    00
  • Java8新特性之方法引用的实践指南

    Java8新特性之方法引用的实践指南 简介 在Java 8中,引入了方法引用的概念,它允许我们直接通过方法的名字来引用方法,而不是调用方法。这一新特性使得代码更加简洁、可读性更高,并且支持函数式编程的方式。本文将详细介绍方法引用的用法和实践示例。 方法引用的语法 方法引用可以通过双冒号(::)符号来表示。它的语法形式如下: 类名::静态方法名 // 静态方法…

    other 2023年6月28日
    00
  • html2canvas生成的图片偏移不完整的解决方法

    下面是详细讲解“html2canvas生成的图片偏移不完整的解决方法”的完整攻略: 问题描述 在使用html2canvas进行网页截图时,有时会出现截图偏移、不完整的情况,这个问题通常是由于网页中存在定位、层叠、溢出等样式导致的。 解决方法 一、增加canvas的width和height html2canvas截图时,会将整个网页转化为一张canvas图片。…

    other 2023年6月27日
    00
  • E语言免杀之易语言程序永久去除_EL_HideOwner

    E语言免杀之易语言程序永久去除_EL_HideOwner攻略 概述 在进行E语言程序开发或分发时,为了保护知识产权和源代码的安全,我们可以使用_EL_HideOwner技术对程序进行免杀处理。本文将详细讲解如何使用_EL_HideOwner去除易语言程序的所有权标记,从而提高程序的安全性。 步骤一:安装_EL_HideOwner插件 首先,我们需要下载并安装…

    other 2023年6月28日
    00
  • Robot Framework(3)——RIDE工具详解

    Robot Framework(3)——RIDE工具详解 在前面的文章中,我们已经学习了Robot Framework的基础知识和使用方法。在实际的测试工作中,我们会遇到众多的测试用例需要编写和管理。这时候,一个好用的IDE工具可以帮助我们提高测试用例的编写效率和管理效率。今天我们要介绍的就是Robot Framework的一个非常流行的IDE工具——RID…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部