BETA

vue-audio-visual

VueJS audio visualization components


544
10
20 days ago
2.1K
v3.0.2
GitHubNPM

vue-audio-visual

Node.js CI codecov Codacy Badge MIT npm

Vue HTML5 audio visualization components

UPDATE NOTES

⚠ Plugin current version is compatibale only with Vue v3. For Vue2 use plugin version 2.5.0. See install chapter for details.

Overview

An audio spectrum visualizer plugin for VueJS framework. It is built with HTML5 Web Audio API and compatible with all browsers that support HTML5 audio API. It provides several Vue components that allows to draw light and nice visualization for "audio" HTML elements.


❗ Visit DEMO page for working examples.


Usage examples:

Component AvLine. Vue template name <av-line>

    <av-line
      :line-width="2"
      line-color="lime"
      audio-src="/static/music.mp3"
    ></av-line>

This will create following element:

AvLine Intro

Component AvBars. Vue template name <av-bars>

    <av-bars
      caps-color="#FFF"
      :bar-color="['#f00', '#ff0', '#0f0']"
      canv-fill-color="#000"
      :caps-height="2"
      audio-src="/static/bach.mp3"
    ></av-bars>

This will create following element:

AvBars Intro

Component AvCircle. Vue template name <av-circle>

    <av-circle
      :outline-width="0"
      :progress-width="5"
      :outline-meter-space="5"
      :playtime="true"
      playtime-font="18px Monaco"
      audio-src="/static/bach.mp3"
    ></av-circle>

This will create following element:

AvCircle Intro

Component AvWaveform. Vue template name <av-waveform>

    <av-waveform
      audio-src="/static/bar.mp3"
    ></av-waveform>

This will create following waveform element:

AvWaveform Intro

Component will pre-load audio content and generate clickable waveform.

Component AvMedia. Vue component <AvMedia>

    <AvMedia
      :media="mediaObject" type="vbar"
    ></AvMedia>

This will create following media element:

AvMedia Intro

There are more media types. See details below.

⚙ Get started

Install

Install using npm

npm install --save vue-audio-visual

for Vue 2 install version 2.5.0

npm i -S vue-audio-visual@2.5.0

Use plugin

Install plugin in main.js:

import { createApp } from 'vue'
import App from './App.vue'
import { AVPlugin } from 'vue-audio-visual'

const app = createApp(App)
app.use(AVPlugin)

app.mount('#app')

Then anywhere is your app you can use it like this:

  <av-bars
    src="/static/bach.mp3"
    bar-color="#CCC">
  </av-bars>

Use component

Single component can be imported and used

<script setup lang="ts">
import { AVWaveform } from 'vue-audio-visual'
</script>

<template>
  <AVWaveform :src="http://foo.com/music.ogg" />
</template>

Composable functions

Plugin provides composable "use" functions for each plugin component. Actually, each component uses composable function inside. See, for example, line component.

Composable functions use audio and canvas element refs. It is handy when you need full access to audio or canvas elements. In the same time it is easy to use:

<script setup lang="ts">
import { ref } from 'vue'
import { useAVBars } from 'vue-audio-visual'

const player = ref(null)
const canvas = ref(null)
const mySource = "./symphony.mp3"

// composable function useAVBars
useAVBars(player, canvas, { src: mySource, canvHeight: 40, canvWidth: 200, barColor: 'lime' })
</script>

<template>
  <div>
    <audio ref="player" :src="mySource" controls />
    <canvas ref="canvas" />
  </div>
</template>

⚙ API

There are several components that comes with plugin. Here is the list of available plugins:

NameComponent nameComposable function
av-barsAVBarsuseAVBars
av-circleAvCircleuseAVCircle
av-lineAVLineuseAVLine
av-mediaAVMediauseAVMedia
av-waveformAVWaveformuseAVWaveform

There are props that are common for all components and special props for each component. All props for components' names follow vue specs when using wiht composable functions. Meaning when prop's name is "foo-bar" then in composable function parameter it is expected to be "fooBar".

Common props

NameTypeDefaultDescription
srcStringnull URL of Audio element src attribute. When provided creates audio element wrapped in "div".
audio-sink-device-idStringnullDeprecated. Use composable function with direct access to audio element.
Id of the audio output device to be used as sink. When provided sets audio output device.
ref-linkStringnullDeprecated
Reference to parent audio element via Vue "ref" attribute. When set, then local audio element is not created and the plugin will connect audio analyser to parent audio element. Multiple plugin instances can connect to the same audio element (see example above).
audio-controlsBooleantrue Audio element controls attribute. When provided should display audio element with controls.
cors-anonymBooleanfalseDeprecated. Use composable function with direct access to audio element.
Set CORS attribute for audio element. Set this attribute when using audio source is pointing to different host/domain. When set, parameter crossOrigin of audio element will be set to 'anonymous'.
audio-classStringnullDeprecated. Use composable function with direct access to audio element.
Audio element css class name.
canv-classStringnullDeprecated. Use composable function with direct access to audio element.
Canvas element css class name.
canv-topBooleanfalseDeprecated. Use composable function with direct access to audio element.
By default plugin creates "audio" element wrapped in "div" and puts "canvas" element below. When "canv-top" is "true" then "canvas" element is set on top. Example: :canv-top="true" or v-bind:canv-top="true"
canv-fill-colorStringnullCanvas fill background RGB color. Default is null, which makes background transperent. Examples:
canv-fill-color="#00AAFF"

Common events

Deprecated. Use composable function with direct access to audio element.

NameDescription
playing Emitted when audio starts playing.
paused Emitted when audio is paused.
ended Emitted when audio is ended.

AVLine props

NameTypeDefaultDescription
canv-widthNumber300Canvas element width. Default 300. Example: :canv-width="600"
canv-heightNumber80Canvas element height. Default 80. Example: :canv-height="120"
line-widthNumber2Graph line width in px. Integer or float number. Example: :line-width="0.5"
line-colorString, Array#9F9Graph line color. Can be string RGB color or Array of RGB color. When Array is given, plugin creates linear gradient and set it as background. Array value should be binded. Examples:
line-color="#00AAFF"
:line-color="['#FFF', 'rgb(0,255,127)', '#00f']"
fft-sizeNumber128Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="512"

Composable function:

function useAVLine<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T
)

AVBars props

NameTypeDefaultDescription
canv-widthNumber300Canvas element width. Default 300. Example: :canv-width="600"
canv-heightNumber80Canvas element height. Default 80. Example: :canv-height="120"
bar-widthNumber5Width of bars in pixels. Example: :bar-width="12"
bar-spaceNumber1Space between bars. Example: :bar-space="1.6"
bar-colorString, Array#0A0AFFBar fill color. Can be string RGB color or canvas gradients array.
Examples:
bar-color="#00AAFF"
:bar-color="['#FFF', 'rgb(0,255,127)', 'green']"
caps-heightNumber0Create caps on bars with given height in pixels. When zero no caps created. Example: :caps-height="2"
caps-drop-speedNumber0.9Caps drop down animation speed. The higher nubmer the faster caps are going down. Example: :caps-drop-speed="0.5"
caps-colorString#A0A0FFCaps rectangles RGB color. Example: caps-color="lime"
brick-heightNumber0Draw bar as bricks when height is set and not zero.
Example: :brick-height="6"
brick-spaceNumber1Space between bricks. Example: :brick-space="2"
symmetricBooleanfalseDraw bars symmetric to canvas vertical center. Example: :symmetric="true"
fft-sizeNumber1024Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="2048"

Composable function

function useAVBars<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T
)

AVCircle props

NameTypeDefaultDescription
canv-widthNumber100Canvas element width. Example: :canv-width="600"
canv-heightNumber100Canvas element height. Example: :canv-height="120"
radiusNumber0Base circle radius. If zero, then will be calculated from canvas width: (canv-width / 2) * 0.7 Example: :radius="20"
line-widthNumber1Frequency bit line width to draw. Example: :line-width="0.4"
line-spaceNumber1Space between lines to draw. Example: :line-space="2"
outline-colorString#0000FFOutline (contour) style RGB color. Example: outline-color="rgb(0,255,0)"
outline-widthNumber0.3Outline (contour) line width. Float value. Example: :outline-width="1"
bar-widthNumber1Frequency graph bar width. Example: :bar-width="1"
bar-lengthNumber0Frequency graph bar length/height. Default is a difference between radius and canvas width. Example: :bar-length="27"
bar-colorString, Array[#FFF,#00F]Bar style RGB color or radient gradient when array. Example: :bar-color="#12AA55"
progressBooleantrueDraw playtime progress meter. Example: :progress="false"
progress-widthNumber1Playtime progress meter width. Example: :progress-width="2.4"
progress-colorString#0000FFPlaytime progress meter color. Example: :progress-color="green"
progress-clockwiseBooleanfalsePlaytime progress meter arc draw direction. Example: :progress-clockwise="true"
outline-meter-spaceNumber3Space between outline and progress meter. The bigger the closer to the circle centre. Example: :outline-meter-space="1"
playtimeBooleanfalseDraw played time as text in the center of the circle. Example: :playtime="true"
playtime-fontString14px MonacoPlayed time print font. Example: playtime-font="18px monospace"
playtime-colorString#00fPlayed time font color. Example: playtime-color="green"
rotate-graphBooleanfalseRotate graph clockwise enable. Example: :rotate-graph="true"
rotate-speedNumber0.001Rotate graph speed. Example: :rotate-speed="0.2"
fft-sizeNumber1024Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.
Must be power of 2 between 25 and 215. Example: :fft-size="2048"

Composable function

function useAVCircle<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T
)

AVWaveform props

NameTypeDefaultDescription
canv-widthNumber500Canvas element width. Example: :canv-width="600"
canv-heightNumber80Canvas element height. Example: :canv-height="120"
played-line-widthNumber0.5Waveform line width for played segment of audio. Example: :playtime-line-width="0.8"
played-line-colorStringnavyWaveform line color for played segment of audio. Example: :playtime-line-color="#ABC123"
noplayed-line-widthNumber0.5Waveform line width for not yet played segment of audio Example: :noplayed-line-width="1"
noplayed-line-colorStringlimeWaveform line color for not yet played segment of audio. Example: :noplayed-line-color="grey"
playtimeBooleantrueDisplay played time next to progress slider. Example: :playtime="false"
playtime-with-msBooleantrueDisplay milliseconds in played when true. For example: 02:55.054. Example: :playtime-with-ms="false"
playtime-font-sizeNumber12Played time print font size in pixels. Example: :playtime-font-size="14"
playtime-font-familyStringmonospacePlayed time print font family. Example: :playtime-font-family="monaco"
playtime-font-colorStringgreyPlayed time print font RGB color string. Example: :playtime-font-color="#00f"
playtime-text-bottomBooleanfalsePosition playtime text bottom. Default on top. Example: playtime-text-bottom
playtime-sliderBooleantrueDraw played time slider on the waveform. Example: :playtime-slider="false"
playtime-slider-colorStringredPlayed slider color. Example: :playtime-slider-color="#fafafa"
playtime-slider-widthNumber1Played slider width. Example: :playtime-slider-width="2.5"
playtime-clickableBooleantrueAllow click on waveform to change playtime. Example: :playtime-clickable="false"
requesterObjectnew axios instanceAllow set a custom requester (axios/fetch) to be used. Example: :requester="myCustomRequesterInstance"

Composable function is using useFetch from @vueuse/core package. useAVWaveform last argument is options for useFetch function.

export function useAVWaveform<T extends object>(
  player: Ref<HTMLAudioElement | null>,
  canvas: Ref<HTMLCanvasElement | null>,
  props: T,
  fetchOpts: UseFetchOptions = {}
)

AVMedia props

Component expects MediaStream object. You can get it directly from navigator.mediaDevices or from @vueuse/core library function useUserMedia. Live example can be found in App.vue.

<script setup lang="ts">
import { AVMedia } from 'vue-audio-visual'
import { useUserMedia } from '@vueuse/core'
...
const { stream } = useUserMedia()
...
</script>

<template>
...
<AVMedia :media="stream" type="circle" />
...
</template>
NameTypeDefaultDescription
mediaMediaStreamnoneRequired property. See example above.
typeStringwformType of media visualization. Available types: 'wform', 'circle', 'frequ' and 'vbar'. If not set or not recognized then 'wform' is set. See examples in demo.
Example: type="frequ"
canv-widthNumbernull Canvas element width. Default value depends on plugin type:
  • circle: 80
  • frequ: 300
  • vbar: 50
  • wform: 200
Example: :canv-width="600"
canv-heightNumbernullCanvas element height. Default value depends on plugin type:
  • circle: 80
  • frequ: 80
  • vbar: 20
  • wform: 40
Example: :canv-height="120"
canv-classStringnullCanvas element css class name.
fft-sizeNumber1024/8192Represents the window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data. Default 8192 for the type 'wform' or 1024 for 'frequ'
Example: :fft-size="512"
frequ-lnumNumber60Number of vertical lines for 'frequ' type. Example: :frequ-lnum="30"
frequ-line-capBooleanfalseDraw lines of 'frequ' type with rounded caps. Example: :frequ-line-cap="true"
frequ-directionStringlrDirection to draw the frequency. Available values: 'lr' or 'mo' (left to right or middle out). If not set or not recognized then 'lr' is set.
Example: frequ-direction="mo"
line-colorString#9F9Graph line RGB color. Examples:
line-color="#00AAFF"
line-widthNumber0.5 / 3Graph line width in px. Integer or float number. If not set then 0.5 for 'wform' type and 3 for 'frequ' Example: :line-width="0.8"
radiusNumber0Base 'circle' radius. Example: :radius="4"
connect-destinationBooleanfalseAnalyser to connect to audio context's destination. Avoid echo during playback. Example: :connect-destination="true"
vbar-bg-colorString#e1e1e1 Background canvas color for 'vbar' type
vbar-capsBooleantrue Rounded bars for 'vbar' types
vbar-spaceNumber1 Space between bars in 'vbar' type
vbar-widthNumber4 Width of bars in 'vbar' type
vbar-fill-colorStringlime Color of bars in 'vbar' type
vbar-right-colorString#c0c0c0 Color of bars on right side in 'vbar' type

Composable function:

function useAVMedia<T extends object>(
  canvas: Ref<HTMLCanvasElement | null>,
  props: T
)

License

MIT Copyright (c) 2018-present, Stas Kobzar