2010-01-20 5 views
-1

J'ai codé un simple lecteur MP3 piloté par XML. J'ai utilisé des objets et des méthodes Sound et SoundChannel mais je ne trouve pas de moyen de faire une barre de progression.Barre de progression dans un lecteur MP3 Flash

Je n'ai pas besoin d'une progression de chargement J'ai besoin d'une barre d'état de progression de morceau.

Canbd quelqu'un m'aider?

Merci.

MISE À JOUR:

Theres est le code.

 
var musicReq: URLRequest; 
var thumbReq: URLRequest; 
var music:Sound = new Sound(); 
var sndC:SoundChannel; 
var currentSnd:Sound = music; 
var position:Number; 
var currentIndex:Number = 0; 
var songPaused:Boolean; 
var songStopped:Boolean; 
var lineClr:uint; 
var changeClr:Boolean; 
var xml:XML; 
var songList:XMLList; 

var loader:URLLoader = new URLLoader(); 
loader.addEventListener(Event.COMPLETE, Loaded); 

loader.load(new URLRequest("musiclist.xml")); 

var thumbHd:MovieClip = new MovieClip(); 
thumbHd.x = 50; 
thumbHd.y = 70; 
addChild(thumbHd); 

function Loaded(e:Event):void{ 
    xml = new XML(e.target.data); 
    songList = xml.song; 
    musicReq = new URLRequest(songList[0].url); 
    thumbReq = new URLRequest(songList[0].thumb); 
    music.load(musicReq); 
    sndC = music.play(); 
    title_txt.text = songList[0].title + " - " + songList[0].artist; 

    loadThumb(); 
    sndC.addEventListener(Event.SOUND_COMPLETE, nextSong); 
} 

function loadThumb():void{ 
    var thumbLoader:Loader = new Loader(); 
    thumbReq = new URLRequest(songList[currentIndex].thumb); 
    thumbLoader.load(thumbReq); 
    thumbLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbLoaded); 
} 

function thumbLoaded(e:Event):void { 
    var thumb:Bitmap = (Bitmap)(e.target.content); 
    var holder:MovieClip = thumbHd; 
    holder.addChild(thumb); 
} 

prevBtn.addEventListener(MouseEvent.CLICK, prevSong); 
nextBtn.addEventListener(MouseEvent.CLICK, nextSong); 
playBtn.addEventListener(MouseEvent.CLICK, playSong); 

function prevSong(e:Event):void{ 
    if(currentIndex > 0){ 
     currentIndex--; 
    } 
    else{ 
     currentIndex = songList.length() - 1; 
    } 

    var prevReq:URLRequest = new URLRequest(songList[currentIndex].url); 
    var prevPlay:Sound = new Sound(prevReq); 
    sndC.stop(); 
    title_txt.text = songList[currentIndex].title + " - " + songList[currentIndex].artist; 
    sndC = prevPlay.play(); 
    currentSnd = prevPlay; 
    songPaused = false; 
    loadThumb(); 
    sndC.addEventListener(Event.SOUND_COMPLETE, nextSong); 
} 

function nextSong(e:Event):void { 
    if(currentIndex

Et voici le code pour la longueur et la position. C'est dans un MovieClip. C'est pourquoi j'utilise un chemin absolu pour trouver l'objet Sound.



this.addEventListener(Event.ENTER_FRAME, moveSpeaker); 

var initWidth:Number = this.SpkCone.width; 
var initHeight:Number = this.SpkCone.height; 
var rootObj:Object = root; 

function moveSpeaker(eventArgs:Event) 
{ 
    var average:Number = ((rootObj.audioPlayer_mc.sndC.leftPeak + rootObj.audioPlayer_mc.sndC.rightPeak)/2) * 10; 
// trace(average); 
// trace(initWidth + ":" + initHeight); 
    trace(rootObj.audioPlayer_mc.sndC.position + "/" + rootObj.audioPlayer_mc.music.length); 
    this.SpkCone.width = initWidth + average; 
    this.SpkCone.height = initHeight + average; 
} 


Répondre

2

Vous pouvez obtenir une valeur à virgule flottante normalisée (pourcentage achevé) en utilisant: SoundChannel.position/Sound.length. Ensuite, vous pouvez utiliser cette valeur comme un scalaire pour votre indicateur de progression de lecture sonore.

code Psuedo:

// -- set the x scale of the progress bar to the percent complete 
progbar.scaleX = channel.position/sound.length; 
+0

Merci Jeremy, je l'ai essayé mais la valeur de longueur est toujours plus grande que la valeur de la position même lorsque la chanson a été fini. Par exemple: Position à 100%: 5944.308390022676 Durée: 7392.65306122449 Savez-vous comment résoudre ce problème? Merci. – DeryckOE

+0

Comment surveillez-vous la lecture ... via enter-frame ou un autre événement? – JeremyFromEarth

+0

Oui, via ENTER_FRAME. – DeryckOE

0

La classe Sound possède une propriété propriété "longueur" indiquant la longueur du son et la SoundChannel a une "position" indiquant la position du son en cours de lecture. Utilisez ces 2 propriétés en tant que données pour un composant ProgressBar.

+0

Merci Christophe J'ai essayé mais la valeur de la longueur est toujours plus grande que la valeur de la position même quand la chanson a b een fini. Par exemple: Position à 100%: 5944.308390022676 Longueur: 7392.65306122449 Savez-vous comment résoudre ce problème? Merci. – DeryckOE

+0

Etes-vous sûr que ces propriétés correspondent au même son? Comment jouez-vous votre fichier mp3? –

+0

Oui, pareil. Mais j'utilise un XML avec une liste de chansons. Peut-être y a-t-il une raison. Toute suggestion? Toute alternative? – DeryckOE

0

vous devez écouter l'événement complet, et à l'intérieur de cet ensemble scaleX à 1.