Un lecteur MP3 en AS3 (avec classes)
Publié par Arnaud le 10 juil 2009 dans Développement, Réalisations
Même si nous avons eu que très peu de cours de Flash cette année, nous devions rendre à la fin du trimestre un lecteur MP3 codé en AS3 avec des classes.
Celui-ci devait prendre en compte une playlist gérée par à un fichier xml et pleins d’option que l’on trouve sur un tas de player identique. Je mets mes sources à disposition car j’ai bien commenté le code et je me dis que ça pourra peut être servir à quelqu’un.
Si vous voulez tester mon lecteur, c’est par là
Pour télécharger mes sources, (fichiers .as, .fla,…) c’est par ici
Les sources sont aussi dispo dans la suite…
- Fichier Main.as :
package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.net.URLRequest.*; public class Main extends Sprite { public static var largeur:int; public static var hauteur:int; public static var scene:Stage; public function Main():void { largeur = stage.stageWidth; hauteur = stage.stageHeight; scene = stage; var chargeurXML:URLLoader = new URLLoader(); chargeurXML.dataFormat = URLLoaderDataFormat.TEXT; chargeurXML.load(new URLRequest("../XML/listeMusic.xml")); chargeurXML.addEventListener(Event.COMPLETE, gestionXml); } private function gestionXml(e:Event):void { try { var donneesLues:XML = new XML(e.target.data); var nbElt:int = donneesLues.elements("titre").length(); var listeURL:Array = new Array(nbElt); //trace(nbElt); for(var i:int=0; i
- Fichier LecteurV2.as :
package { import flash.display.*; import flash.events.*; import flash.media.*; import flash.net.*; import flash.geom.*; import fl.events.ListEvent; import fl.controls.List; public class LecteurV2 extends Sprite { //______________________________________________________le controleur (nom du controleur en clip) private var lecteurMP3:ControleurClp; private var reflet:Reflet; private var music:Sound; private var gestion_music:SoundChannel; private var changeVolume:SoundTransform; private var infoSon:String; private var music_time:Number = 0; private var initX:Number; private var initY:Number; private var longueur:Number; private var volumeSonore:Number = 1; private var cptrMusic:int = 0; private var listeMusic:Array; private var arepeter:Boolean = false; //______________________________________________________le constructeur public function LecteurV2(liste:Array) { lecteurMP3 = new ControleurClp; listeMusic = liste; //On ajoute notre constructeur puis on le place : addChild(lecteurMP3); lecteurMP3.x = 250; lecteurMP3.y = 145; //On initialise l'affichage des boutons, des événements associés et on trace la playlist initialisation(false, true); gestionListener(); tracePlaylist(); //On charge le son par rapport à l'indice 'cptrMusic' du tableau 'liste' infoSon=listeMusic[cptrMusic]; chargerSon(infoSon); } private function tracePlaylist():void { //On parcours le tableau listeMusic for (var i:int = 0; i (listeMusic.length-1)) { cptrMusic=0; } //On charge et on initialise la lecture infoSon = listeMusic[cptrMusic]; lecteurMP3.playList.selectedIndex = cptrMusic; initialisation(false, true); music_time = 0; initialisationBarreProgression(); chargerSon(infoSon); } private function lancerPrecedent(e:MouseEvent):void { cptrMusic--; if (cptrMusic < 0) { cptrMusic=listeMusic.length-1; } infoSon = listeMusic[cptrMusic]; lecteurMP3.playList.selectedIndex = cptrMusic; initialisation(false, true); music_time = 0; initialisationBarreProgression(); chargerSon(infoSon); } private function lancerRepetition(e:MouseEvent):void { //Si on clique sur le bouton répétition, on place le booléen a vrai et on affiche active le bouton repeat arepeter = true; //trace('repeter la chanson'); lecteurMP3.repeat.visible = false; lecteurMP3.repeaton.visible = true; } private function stopperRepetition(e:MouseEvent):void { arepeter = false; //trace('ne plus répeter'); lecteurMP3.repeaton.visible = false; lecteurMP3.repeat.visible = true; } private function lancerLecture(e:MouseEvent):void { //On initialise les boutons de lecture initialisation(false, true); // On reprend la musique au moment du music_time gestion_music = music.play(music_time); lecteurMP3.bulleProgress.addEventListener(Event.ENTER_FRAME, progresser); gestion_music.addEventListener(Event.SOUND_COMPLETE, chansonsuivante); changeVolume.volume = volumeSonore; gestion_music.soundTransform = changeVolume; } private function lancerPause(e:MouseEvent):int { //On initialise les boutons et on stope la musique en placant la valeur temps dans music_time initialisation(true, false); music_time = gestion_music.position; gestion_music.stop(); } private function progresser(e:Event):void { //On calcule l'estimation et on l'applique à l'échelle var estimation:int = Math.ceil(music.length/(music.bytesLoaded/music.bytesTotal)); lecteurMP3.bulleProgress.scaleX = gestion_music.position/estimation; } private function chansonsuivante(e:Event):void { //Si la chanson n'est pas à réperter alors on incrémente et on passe donc à la chanson suivante if (!arepeter) { cptrMusic++; } else{ //Sinon on répète la chanson en n'incrémentant notre indice arepeter = false; lecteurMP3.repeaton.visible = false; lecteurMP3.repeat.visible = true; } //Si on dépasse la taille du tableau alors on repart sur la première chanson if (cptrMusic > (listeMusic.length-1)) { cptrMusic=0; } //On charge la musique qui doit être infoSon = listeMusic[cptrMusic]; initialisation(false, true); music_time = 0; initialisationBarreProgression(); chargerSon(infoSon); lecteurMP3.playList.selectedIndex = cptrMusic; } private function reinitialiser(e:Event):void { //On réinitialise tous les boutons et la barre de progression initialisation(true, false); initialisationBarreProgression(); } private function deplacerCurseur(e:MouseEvent):void { //On définit une zone de déplacement de curseur en fonction de la longeur var zone:Rectangle = new Rectangle(initX, initY, longueur-lecteurMP3.curseur.width, 0); lecteurMP3.curseur.startDrag(false, zone); lecteurMP3.curseur.addEventListener(MouseEvent.MOUSE_MOVE, surMove); } private function arreterCurseur(e:MouseEvent):void { //Quand on arrete le curseur, on appelle la fonction surMove lecteurMP3.curseur.stopDrag(); lecteurMP3.curseur.removeEventListener(MouseEvent.MOUSE_MOVE, surMove); } private function surMove(e:MouseEvent):void { //On calcule le volume sonore en fonction du ratio volumeSonore = (lecteurMP3.curseur.x - initX) / longueur; changeVolume.volume = volumeSonore; gestion_music.soundTransform = changeVolume; } private function lancerMute(e:MouseEvent):void { // On met le volume sonore à 0 et place le curseur le plus à gauche possible initX = lecteurMP3.niveau.x; initY = lecteurMP3.niveau.y; changeVolume.volume = 0; gestion_music.soundTransform = changeVolume; lecteurMP3.curseur.x = initX; lecteurMP3.curseur.y = initY; //On met le bouton mute comme visible lecteurMP3.muteon.visible = true; lecteurMP3.muteoff.visible = false; } private function stopperMute(e:MouseEvent):void { initX = lecteurMP3.niveau.x; longueur = lecteurMP3.niveau.width; changeVolume.volume = 1; gestion_music.soundTransform = changeVolume; lecteurMP3.curseur.x = initX+1*longueur - lecteurMP3.curseur.width; lecteurMP3.muteoff.visible = true; lecteurMP3.muteon.visible = false; } } //Fin de la class } //Fin du package




SAlut
Simple , propre , bien commenté , j’aime bien… manque juste la possibilité de pouvoir se déplacer dans la barre de progression
A toute.
Génial, ton code est propre, simple est bien commenté.
Il m’a bien aider à réaliser mon propre lecteur (encore plus simple).
Merci
Il manque un curseur pour controler le déroulé de la musique en lecture…peux-tu nous apporter ces quelques lignes à ton code…?
Je n’ai vraiment pas le temps de me repencher dessus.
Désolé, je l’aurais fait avec plaisir sinon.
Salut,
b’en tu vois , ça bug ton code… comme le mien .. le bouton pause qui ne fonctionne pas ..
les anciens sons, son relu en même temps que le sons encours, amuse toi avec le bouton pause et tu verras .. => pause + nouvelle lecture + pause à nouveau + play .. => Bug..
pour l’instant , je n’ai trouvé de solution .. idem.. (attention hein ! ça marche bien en local, mais pas en ligne … ) . => est ce que c’est un bug pour les utilisateur de pc ?
Pour le bug concernant la pause, c’est étrange.
J’ai pas trop le temps de regarder ça en détail mais à regarder au premier coup d’oeil, c’est surement un souci au niveau de la variable « music_time » dans la fonction « Lancerlecture »