Howler.js est une bibliothèque JavaScript puissante et populaire pour gérer l’audio sur le web, permettant une manipulation des sons avec précision et efficacité. Ce tutoriel vous guidera dans la création d’un lecteur audio complet en React avec Howler.js, intégrant les fonctionnalités de lecture, pause, navigation entre les pistes et ajustement du volume.

Introduction à Howler.js

Howler.js est conçue pour faciliter la gestion audio dans les applications JavaScript, en apportant de nombreuses fonctionnalités :

  • Chargement et gestion des fichiers audio ;
  • Prise en charge des événements de fin et d’erreurs ;
  • Contrôle précis du volume et des options de boucle ;
  • Fonctionnalités avancées de spatialisation audio et de gestion multi-sons.

L’utilisation de Howler.js dans une application React rend la création d’un lecteur audio personnalisable très intuitive et réactive.

Configuration initiale du projet

Installation des dépendances : Commencez par installer React, Howler.js, et des icônes utiles comme Lucide React pour une interface esthétique.

npx create-react-app audio-player
cd audio-player
npm install howler lucide-react

Création des composants : Dans notre exemple, nous allons construire un composant AudioPlayer contenant notre logique de gestion de pistes, les boutons de lecture et de navigation, et le contrôle de volume.

Configuration de la structure : Voici le fichier de départ pour notre lecteur audio en utilisant les bibliothèques installées.

Création d’une interface de lecteur audio en React

Pour commencer, créons une interface réactive en définissant nos pistes audio dans un tableau et en initialisant l’état pour gérer la piste en cours, le volume et l’état de lecture.

"use client";import { useState, useEffect } from 'react';
import { Howl } from 'howler';
import { Play, Pause, SkipBack, SkipForward, Disc, CirclePlay, Minus, Plus } from 'lucide-react';interface Track {
src: string;
nom: string;
}const tracks: Track[] = [
{ src: '/audio/audio-1.mp3', nom: 'Instrumental 1' },
{ src: '/audio/audio-2.mp3', nom: 'Instrumental 2' },
{ src: '/audio/audio-3.mp3', nom: 'Instrumental 3' },
{ src: '/audio/audio-4.mp3', nom: 'Instrumental 4' },
];const AudioPlayer = () => {
const [currentTrackIndex, setCurrentTrackIndex] = useState(0);
const [isPlaying, setIsPlaying] = useState(false);
const [howl, setHowl] = useState<Howl | null>(null);
const [volume, setVolume] = useState(1);

Gestion des pistes audio

Les pistes audio sont définies dans un tableau contenant chaque source de fichier et nom. Cela permet de naviguer facilement d’une piste à l’autre en fonction de l’index.

useEffect(() => {
const newHowl = new Howl({
src: [tracks[currentTrackIndex].src],
onend: handleNextTrack,
volume: volume,
});setHowl(newHowl);
setIsPlaying(false);return () => {
newHowl.unload();
};
}, [currentTrackIndex]);

Cet useEffect réinitialise le lecteur chaque fois que la piste change. À chaque modification de currentTrackIndex, une nouvelle instance de Howl est créée pour la piste en cours, et la précédente est déchargée.

Fonctionnalités avancées : Lecture, Pause, Volume, et Navigation

Lecture et pause : Le bouton de lecture bascule l’état de isPlaying et utilise Howler.js pour jouer ou mettre en pause le fichier audio.

const handlePlayPause = () => {
if (howl) {
if (isPlaying) {
howl.pause();
} else {
howl.play();
}
setIsPlaying(!isPlaying);
}
};

Navigation entre les pistes : Deux boutons permettent de passer à la piste suivante ou précédente, en gérant le cycle de l’index pour revenir à la première ou dernière piste lorsque nécessaire.

const handleNextTrack = () => {
setCurrentTrackIndex((prevIndex) =>
prevIndex === tracks.length - 1 ? 0 : prevIndex + 1
);
setIsPlaying(false);
};const handlePrevTrack = () => {
setCurrentTrackIndex((prevIndex) =>
prevIndex === 0 ? tracks.length - 1 : prevIndex - 1
);
setIsPlaying(false);
};

Ajustement du volume : Utilisez deux boutons pour augmenter et diminuer le volume de la piste en cours.

const adjustVolume = (delta: number) => {
setVolume((prevVolume) => {
const newVolume = Math.min(Math.max(prevVolume + delta, 0), 1);
return newVolume;
});
};

Enfin, nous créons une interface utilisateur pour naviguer facilement entre les pistes et ajuster le volume :

return (
<div className="flex flex-col items-center justify-center p-6 bg-white text-white rounded-xl shadow-lg">
<div className="relative w-full h-full rounded-xl flex flex-col items-center justify-between p-4">
<div className="border p-4 rounded-md bg-[#f1f1f1] text-gray-400">
<ul className="space-y-2">
{tracks.map((track, index) => (
<li key={index} onClick={() => handleTrackSelect(index)} className={`flex items-center justify-between p-3 rounded-lg cursor-pointer transition-colors ${currentTrackIndex === index ? 'text-gray-900' : ''}`}>
<div className="flex items-center space-x-3">
{currentTrackIndex === index ? <CirclePlay size={24} /> : <Disc size={24} />}
<span>{track.nom}</span>
</div>
</li>
))}
</ul>
</div>
<div className="relative mt-6 rounded-full border-4 border-gray-600 flex items-center justify-center bg-gray-300">
<div className="w-[150px] h-[150px] flex items-center justify-center relative">
<button onClick={handlePrevTrack} className="absolute left-2 text-gray-800 hover:text-gray-900 transition-colors" aria-label="Previous track"><SkipBack size={24} /></button>
<button onClick={handlePlayPause} className="p-4 bg-black text-white rounded-full shadow-lg hover:bg-gray-900 transition-all focus:outline-none" aria-label={isPlaying ? 'Pause' : 'Play'}>{isPlaying ? <Pause size={32} /> : <Play size={32} />}</button>
<button onClick={handleNextTrack} className="absolute right-2 text-gray-800 hover:text-gray-900 transition-colors" aria-label="Next track"><SkipForward size={24} /></button>
<button onClick={() => adjustVolume(-0.1)} className="absolute bottom-2 text-gray-800 hover:text-gray-900 transition-colors" aria-label="Decrease volume"><Minus size={24} /></button>
<button onClick={() => adjustVolume(0.1)} className="absolute top-2 text-gray-800 hover:text-gray-900 transition-colors" aria-label="Increase volume"><Plus size={24} /></button>
</div>
</div>
</div>
</div>
);

Conclusion

Grâce à Howler.js et React, nous avons mis en place un lecteur audio fonctionnel et personnalisable. Ce lecteur inclut la navigation entre plusieurs pistes, le contrôle de lecture/pause, et l’ajustement de volume. Ce projet démontre comment intégrer une bibliothèque JavaScript comme Howler.js dans un environnement React pour créer des applications audio intuitives et modernes.

Pour approfondir vos connaissances en React et maîtriser ces nouvelles fonctionnalités, n’hésitez pas à rejoindre ma formation dédiée à React JS, où vous apprendrez à créer des applications performantes et réactives.

Newsletter

Vous souhaitez maîtriser les langages et outils du web ? Ne manquez aucune opportunité avec nos tutoriels, astuces et offres exclusives ! Inscrivez-vous dès maintenant pour recevoir des contenus de qualité, soigneusement sélectionnés pour vous, et boostez vos compétences. En vous inscrivant, vous recevrez une formation offerte ! 

Confirmez votre inscription via l'email qui vient de vous être envoyé. Vérifiez vos spams.