sviluppo web
Tutte le Attività
May 09, 2024

Componente React Audio Motion con analisi visuale

Introduzione al nuovo componente React: Audio Motion con Analisi Visuale. Questo componente non solo permette la riproduzione di audio da diverse sorgenti, ma include anche una visualizzazione dinamica e accattivante grazie all'uso di audioMotion-analyzer.



Funzionalità principali

Il nostro Audio Motion include le seguenti funzionalità:

  • Riproduzione di live streaming: Puoi riprodurre flussi audio in diretta.
  • Riproduzione di file audio statici: Carica e riproduci file audio locali.
  • Visualizzazione dinamica: Mostra un’analisi visiva dell’energia audio in diverse bande di frequenza.

Implementazione del componente

Installazione delle dipendenze

Per iniziare, è necessario installare il pacchetto audiomotion-analyzer tramite npm. Apri il terminale nella directory del tuo progetto e esegui:

npm install audiomotion-analyzer

Codice del componente React

import React, { useEffect, useRef } from 'react';
import AudioMotionAnalyzer from 'audiomotion-analyzer';

const AudioPlayer = () => {
  const audioRef = useRef(null);
  const containerRef = useRef(null);
  const versionRef = useRef(null);

  useEffect(() => {
    // instantiate analyzer
    const audioMotion = new AudioMotionAnalyzer(containerRef.current, {
      source: audioRef.current,
      showBgColor: false,
      onCanvasDraw: energyMeters,
      gradient: "orangered",
      overlay: true
    });

    // display module version
    versionRef.current.innerText = `v${AudioMotionAnalyzer.version}`;

    // play stream
    document.getElementById('live').addEventListener('click', () => {
      audioRef.current.src = 'https://icecast2.ufpel.edu.br/live';
      audioRef.current.play();
    });

    // file upload
    document.getElementById('upload').addEventListener('click', () => {
      const fileBlob = "/better-day.mp3";
      if (fileBlob) {
        audioRef.current.src = fileBlob;
        audioRef.current.play();
      }
    });

    // callback function
    function energyMeters() {
      const canvas = audioMotion.canvas,
            ctx = audioMotion.canvasCtx,
            pixelRatio = audioMotion.pixelRatio,
            baseSize = Math.max(20 * pixelRatio, canvas.height / 27 | 0),
            centerX = canvas.width >> 1,
            centerY = canvas.height >> 1;

      // helper function
      const drawLight = (posX, color, alpha) => {
        const width = 50 * pixelRatio,
              halfWidth = width >> 1,
              doubleWidth = width << 1;

        const grad = ctx.createLinearGradient(0, 0, 0, canvas.height);
        grad.addColorStop(0, color);
        grad.addColorStop(.75, `${color}0`);

        ctx.beginPath();
        ctx.moveTo(posX - halfWidth, 0);
        ctx.lineTo(posX - doubleWidth, canvas.height);
        ctx.lineTo(posX + doubleWidth, canvas.height);
        ctx.lineTo(posX + halfWidth, 0);

        ctx.save();
        ctx.fillStyle = grad;
        ctx.shadowColor = color;
        ctx.shadowBlur = 40;
        ctx.globalCompositeOperation = 'screen';
        ctx.globalAlpha = alpha;
        ctx.fill();
        ctx.restore();
      }

      // bass, midrange and treble meters
      ctx.fillStyle = '#fff8';
      ctx.textAlign = 'center';
      const growSize = baseSize * 4;

      const bassEnergy = audioMotion.getEnergy('bass');
      ctx.font = `bold ${baseSize + growSize * bassEnergy}px sans-serif`;
      ctx.fillText('BASSI', canvas.width * .15, centerY);
      drawLight(canvas.width * .15, '#f00', bassEnergy);

      drawLight(canvas.width * .325, '#f80', audioMotion.getEnergy('lowMid'));

      const midEnergy = audioMotion.getEnergy('mid');
      ctx.font = `bold ${baseSize + growSize * midEnergy}px sans-serif`;
      ctx.fillText('MEDI', centerX, centerY);
      drawLight(centerX, '#ff0', midEnergy);

      drawLight(canvas.width * .675, '#0f0', audioMotion.getEnergy('highMid'));

      const trebleEnergy = audioMotion.getEnergy('treble');
      ctx.font = `bold ${baseSize + growSize * trebleEnergy}px sans-serif`;
      ctx.fillText('ALTI', canvas.width * .85, centerY);
      drawLight(canvas.width * .85, '#0ff', trebleEnergy);
    }

    // cleanup event listeners on unmount
    return () => {
      document.getElementById('live').removeEventListener('click', () => {});
      document.getElementById('upload').removeEventListener('click', () => {});
    };
  }, []);

  return (
    <div id="audioMotionContainer">
      <div id="container" ref={containerRef}></div>
      <audio id="audio" ref={audioRef} src="https://icecast2.ufpel.edu.br/live" controls crossOrigin="anonymous"></audio>
      <button id="upload">Riproduci audio statico</button>
      <button id="live">Riproduci live streaming</button>
      <div className="info">
        <a href="https://audiomotion.dev">audioMotion-analyzer</a> <span id="version" ref={versionRef}></span>
      </div>
    </div>
  );
};

export default AudioPlayer;

Utilizzo del componente

Per utilizzare questo componente, basta importarlo e includerlo nel render di un altro componente o direttamente nel render della tua applicazione principale:


import React from 'react';
import ReactDOM from 'react-dom';
import AudioPlayer from './AudioPlayer'; // Assicurati che il percorso sia corretto

const App = () => (
  <div>
    <h1>Audio Player con Visualizzazione</h1>
    <AudioPlayer />
  </div>
);

ReactDOM.render(<App />, document.getElementById('root'));

Utilizzi potenziali

Il componente React Audio Motion può essere utilizzato in una varietà di contesti, tra cui:

  • Per aggiungere un tocco di dinamicità e interattività ai tuoi progetti web che coinvolgono audio.

  • Per creare effetti visivi personalizzabili e accattivanti basati sul suono.

  • Per sperimentare con le possibilità creative offerte dalle API Web Audio e Canvas.

Il nostro nuovo componente React Audio Motion con Analisi Visuale offre un modo semplice e visivamente accattivante per integrare la riproduzione audio e la visualizzazione dell’energia audio nella tua applicazione. Speriamo che questo componente sia utile per i tuoi progetti e ti invitiamo a esplorare ulteriori personalizzazioni per adattarlo alle tue esigenze specifiche.

Per ulteriori informazioni, visita il sito ufficiale di audioMotion-analyzer.