04. februar 2003 - 15:22Der er
90 kommentarer og 1 løsning
Hjælp til streamer actionscript
Dette script streamer 9 numre random i en session. Med session mener jeg at ét nummer IKKE kan afspilles 2 gange i løbet af afspilningen af alle 9 munre. Også selv om numrerne vælges og afspilles random.
Men.. problemet er at når en session er overstået (når alle 9 numre hver især er afspillet én gang i tilfældig rækkefølge) .. da stopper afspilleren komplet. Hvordan får jeg den til at starte helt forfra igen?
playedSongs = new Array(); songCounter = 1; numberOfSounds = 9; mySoundObjectPosition = 0; ranSound = Math.floor(Math.random()*numberOfSounds+1); mySoundObject = new Sound(); mySoundObject.loadSound("http://windweaver.dk/musik/"+ranSound+".mp3", true); playedSongs.push(ranSound); mySoundObject.setVolume(100); mySoundObject.start(mySoundObjectPosition, 0); _root.mySoundObject.onSoundComplete = function() { playlist(); _root.mySoundObject.loadSound("http://windweaver.dk/musik/"+ranSound+".mp3", true); _root.mySoundObject.start(mySoundObjectPosition, 0); }; function playlist() { ranSound = Math.floor(Math.random()*numberOfSounds+1); if (songCounter == numberOfSounds+1) { playedSongs = new Array(); playedSongs.push(ranSound); songCounter = 1; } else { for (i=0; i<=playedSongs.length-1; i++) { if (playedSongs[i] == ranSound) { ranSound = Math.floor(Math.random()*numberOfSounds+1); i = -1; } } playedSongs.push(ranSound); } }
Hmm... paask har lavet lidt ekstra features... Det skal jo huskes... :o)
Skal dit script blot modificeres, så vil jeg da gætte på at du bare mangler at incrementere songCounter (med mindre dette sker et andet sted):
Du er her : Eksperten : Programmer : Flash : Generelt : Hjælp til streamer actionscript :
Sidste nyt fra Eksperten : Køb og salg -> Papkassen Eksperten vil om 14 dage fjerne de kategorier, der handler om køb og salg. Eksperten er et forum for udveksling af viden og holdninger, og vi foretrækker at holde tingene adskilt. Vi har i forvejen we... læs mere
Hjælp til streamer actionscript Spørgsmålet er ikke besvaret. 30 point fra theselfimages
Dette script streamer 9 numre random i en session. Med session mener jeg at ét nummer IKKE kan afspilles 2 gange i løbet af afspilningen af alle 9 munre. Også selv om numrerne vælges og afspilles random.
Men.. problemet er at når en session er overstået (når alle 9 numre hver især er afspillet én gang i tilfældig rækkefølge) .. da stopper afspilleren komplet. Hvordan får jeg den til at starte helt forfra igen?
playedSongs = new Array(); songCounter = 1; numberOfSounds = 9; mySoundObjectPosition = 0; ranSound = Math.floor(Math.random()*numberOfSounds+1); mySoundObject = new Sound(); mySoundObject.loadSound("http://windweaver.dk/musik/"+ranSound+".mp3", true); playedSongs.push(ranSound); mySoundObject.setVolume(100); mySoundObject.start(mySoundObjectPosition, 0); _root.mySoundObject.onSoundComplete = function() { playlist(); _root.mySoundObject.loadSound("http://windweaver.dk/musik/"+ranSound+".mp3", true); _root.mySoundObject.start(mySoundObjectPosition, 0); }; function playlist() { ranSound = Math.floor(Math.random()*numberOfSounds+1); if (songCounter == numberOfSounds+1) { playedSongs = new Array(); playedSongs.push(ranSound); songCounter = 1; } else { songCounter++; for (i=0; i<=playedSongs.length-1; i++) { if (playedSongs[i] == ranSound) { ranSound = Math.floor(Math.random()*numberOfSounds+1); i = -1; } } playedSongs.push(ranSound); } }
Men det ville nu have bedst af, at blive skrevet om... Det kræver dog, at du også lige fortæller hvilket script der ligger på de enkelte knapper...
Du kan iøvrigt teste scriptet som det er vist øverst. Her: www.vespertine.dk ... prøv at lad nummeret (der kun ét) spille ud og vent og se hvad der sker. Flash kommer med en ALERT BOX ... meget forunderligt. (Playeren virker kun med den nyeste Flash 6 player)
Jeg kan ikke teste det og jeg forstår godt alert-boksen, da dit script går i endless loop på grund af den noget ringe implementering af en "randomizer" :o)
Ok.. kan jeg evt. maile dig hele scriptet? Den udgave jeg henviser til med linket: www.vespertine.dk skal kun afspille ét nummer (9 sættes til 1), men jeg bruger selv scriptet på mit eget site i en anden udgave med PLAY, PAUSE og STOP knap. Her afspilles 9 numre. Det er den version jeg vil maile dig.
vil du bemærke at der gjort brug af et sæt varibler der styrer korrekt afspilning i forhold til Pause og Play og Stop. Disse varibler er IKKE incrementeret i mit eget script, hvilket gør at dette spørgsmål er oprettet: http://www.eksperten.dk/spm/311685
med en PAUSE funktion + en holdbar Random afspilningsfunktion? Det skal nævnes at mit eget nuværende script IKKE har en start knap, men at det afspiller første random nummer ved onLoad.
Jeg har ikke flash ej heller en flash player... Derfor kan jeg ikke bruge kildefiler eller links, men kun rå kode... Hvilket også er The True Flash Way :o)
Mit egen version af scriptet bruges her: www.theselfimages.dk (klik til en underside) Det afspiller 9 numre og har som sagt i modsætning til den version på www.vespertine.dk er sæt funktionsknapper.
Hele scriptet på The Self Images ser således ud, inkl. funktionsknapperne:
playedSongs = new Array(); songCounter = 1; numberOfSounds = 9; mySoundObjectPosition = 0; ranSound = Math.floor(Math.random()*numberOfSounds+1); mySoundObject = new Sound(); mySoundObject.loadSound("http://domæne.dk/musik/"+ranSound+".mp3", true); playedSongs.push(ranSound); mySoundObject.setVolume(100); mySoundObject.start(mySoundObjectPosition, 0); _root.mySoundObject.onSoundComplete = function() { playlist(); _root.mySoundObject.loadSound("http://domæne.dk/musik/"+ranSound+".mp3", true); _root.mySoundObject.start(mySoundObjectPosition, 0); }; function playlist() { ranSound = Math.floor(Math.random()*numberOfSounds+1); if (songCounter == numberOfSounds+1) { playedSongs = new Array(); playedSongs.push(ranSound); songCounter = 1; } else { for (i=0; i<=playedSongs.length-1; i++) { if (playedSongs[i] == ranSound) { ranSound = Math.floor(Math.random()*numberOfSounds+1); i = -1; } } playedSongs.push(ranSound); } }
Okay men så må ovenstående være hvad du har brug for :) Det er i hvert fald hele scriptet som det bruges pt. på The Self Images (mit personlige portfolio).
Hmm! faktisk skulle det være sådan, at lige så snart flashfilen loades begynder den at spille. Så denne: mySongPlayer = new SongPlayer("http://domæne.dk/musik/",9); skal vel både sidde på PLAY knappen og på selve scriptet, ikke?
kan jeg med dit script uden videre ha' den til at afspille KUN ét nummer? Altså ved at ændre denne: mySongPlayer = new SongPlayer("http://domæne.dk/musik/",9); til ",1 i stedet for ",9 ... ?
Vil den da afspille nummeret og starte det forfra efter det slutter?
Som det ser ud nu kan jeg ikke få den til at afspille/streame noget musik. Det skal nævnes at jeg i min Flash fil har 2 lag.
På det første lag, ligger i frame1 en keyframe forpå selve script lægges. På det andet lag, ligger i frame1 de 3 knapper der hver især pålægges script for Play, Stop, Pause...
Jaja... Jeg har jo heller ikke påstået, at det virker... Virkede det før, hvis du bare testede inden fra flash's eget test-miljø? for så kan vi debugge der...
At den skriver nogle variabler ud til dit output vindue... Det gør trace()-funktionen jo...
Hvad sker der, når du står i flash og trykker Ctrl+enter for at teste din film. Sker der noget? Kommer der ikke et output vindue, hvori der står noget med "about to play..." og noget mere?
Det handler om, at jeg ikke selv har flash, så derfor prøver jeg på at finde ud af, hvad der er galt med ovenstående script via dig. Har du overhovedet arbejdet i flash før, for ovenstående proces med at tilføje traces for at finde sine fejl er helt almindelig og nødvendig, da man sjældent laver det rigtigt i første forsøg...
Så nej, at jeg tilføjer en lille med trace() for det ikke til at virke, men giver mig en lille ide om, hvor fejlen er...
Hvis ovenstående script med din seneste tilføjelse er rigtig, ved jeg ikke. For den viser ingen intet Output (jeg kender godt til metoden) men der sker altså som sagt intet. Hvad med at downloade den gratis 30 dages version af Flash?
Desværre kan jeg intet prej give dig om hvor vi står.. :(
Det kan ikke passe... Som du kan se, så står der "trace(mySongPlayer is ...)" uden for nogen funktion, altså direkte i frame-scriptet... Denne trace vil blive kørt, med mindre der er en fejl i scriptet (hvilket vil stå i et trace-vindue)... Ergo bliver dit script enten ikke kørt eller også er dit output vindue uden for skærmen...
Prøv efter du har trykket Ctrl-enter at tryke Ctrl+Alt+V - det skal sende alle variabler i filmen til dit output-vindue...
Okay... ja det hjalp.. men jeg skal altså trykke Ctrl+Alt+V for at se den Outputbox.. men det er vel fordi der ikke er deciderede fejl at den ikke kommer frem. Med Ctrl+Alt+V udskrev alt dette:
Prøv en gang at åbne dine publish settings (vist nok Ctrl+Shift+F12) og under "flash" skal du sikre dig, at der ikke er et hak i "omit traces"... Derudover er der en anden fejl i mit script, så prøv følgende:
SongPlayer = function(path,number,autoplay) { trace("initialized with ("+path+", "+number+", "+autoplay+")"); this.path = path; this.number = number; this.nextSong(); this.sound = new Sound(this); if (autoplay) { trace("autoplaying... via "+typeof this.play); this.play(); } } SongPlayer.prototype.initList = function() { this.unused = new Array(); var i; for (i = 1; i <= this.number; i++) this.unused.push(i); this.unused.sort(function(a,b){ return random(3)-1; }); } SongPlayer.prototype.playSong = function(num,time) { trace("streaming "+this.path+num+".mp3 at "+time); this.sound.loadSound(this.path+num+".mp3", true); this.sound.play(time); this.sound.onSoundComplete = this.nextSong; } SongPlayer.prototype.play = function() { trace("about to play "+this.currentSong); this.playSong(this.currentSong,0); } SongPlayer.prototype.nextSong = function() { if (!this.unused.length) this.initList(); this.currentSong = this.unused.pop(); } SongPlayer.prototype.stop = function() { this.sound.stop(); } SongPlayer.prototype.pause = function() { this.isPaused = true; this.position = this.sound.position; this.sound.stop(); } SongPlayer.prototype.resume = function() { this.isPaused = false; this.playSong(this.currentSong, this.position); } SongPlayer.prototype.isPaused = function() { return this.isPaused; } mySongPlayer = new SongPlayer("http://www.theselfimages.dk/images/music/", 9, true); trace("mySongPlayer is "+typeof mySongPlayer+", made by "+typeof SongPlayer);
I ovenstående output er det jo outputtet fra Ctrl+Alt+V, hvilket ikke er interessant... Prøv istedet blot at køre din film (uden Omit Traces) og fortæl, hvilket output der kommer af dette - du skal eventuelt clear'e dit outputvindue først...
Et andet problem er at Playeren faktisk IKKE fortsætter med at spille, når første random nummer er slut. Meningen er jo at den skal spille næste nummer og næste igen, osv. men IKKE det samme nummer mere end én gang inden for en runde.
Okay.. hehe! Det ser ud til at virke fint med at fortsætte random afspilningen. Men der er stadig det problem med, at den starter nummeret forfra efter PAUSE, i stedet for at fortsætte nummeret hvorfra det blev Paused.
Når første random nummer starter automatisk skrives: (hvorfor "playing song" 2 gange?)
running next song playing song playing song
Klikkes PAUSE er der intet OUTPUT før PLAY igen klikkes. Ved første PAUSE/PLAY blev skrevet:
a call to isPaused returning true resuming at 5512
Ved anden PAUSE/PLAY blev skrevet:
a call to isPaused returning true resuming at 25051
I begge tilfælde er der den del forsinkelse når PLAY klikkes efter et nummer har været PAUSED. Begge gange starter nummeret fra start, selv om den i OUTPUT skriver at den RESUMER fra et specifikt sted i nummeret.
Når man henter position ud af nummeret, får man positionen i millisekunder, men når man angiver, hvor den skal starte, så er det i sekunder (fandt det via din oprindelige kode):
Den burde loade lyden og starte efter 10 sekunder - men det gør den ikke!
Når man loader en streaming lyd, så begynder den helt automatisk at spille lyden fra starten. Stopper man lyden, så er den helt væk, og man kan ikke fortsætte den uden at loade den forfra...
Og man kan slet ikke bestemme, hvornår den skal starte med at spille - altså hvilken position...
Så du kan ikke lave det, som du vil - med mindre det er i orden, at brugerne først skal downloade lyden 100% før de kan afspille den!
Iøvrigt virker Pause/Play funktionen også i det Paask har lavet. Den kan bare ikke holde styr på hvilket nummer der skal Pauses, når man når forbi det første afspillede nummer.
The syntax for dynamically loading a sound object with an instance name of "myMusic" is as follows:
myMusic.loadSound("url", isStreaming)Commonly, the sound object method, "loadSound", is used as follows:
myMusic.loadSound("sample.mp3", true) In the above example, the MP3 file, sample.mp3, is loaded from the same folder that contains the SWF file. It loads into the sound object "myMusic", and it is loading as a streaming sound object. Concerning loading as streaming or as an event, loading as an event is the default. If neither true or false is specified for streaming, the sound object will load as an event.
Som jeg kan se i det oprindelige indlæg er det vist et spørgsmål om player-version, så jeg prøver lige at hente den seneste og derefter tjekke igen...
De har nok lavet en player-release, hvor man kunne stoppe en loadSound uden at den blev "glemt", men hvor den blot loadede videre på filen, så man kunne afspille den igen ved en bestemt position...
Men jeg vil lave en mental note (som jeg vil gøre digital når jeg får tilpas meget af actionscript.dk til at virke) om denne feature, der først virker fra flash-version flash6r40 (som er kendt som airwolf-versionen, da man også her kunne læse id3-tags i mp3-filer :o)
Jeg har lukket spørgsmålet da jeg gik ud fra at dette problem var løst med dette nyskrevne script. Jeg er villig til at åbne spørgsmålet igen, da du jo reelt har løst dette "Hjælp til streamer actionscript" spørgsmål.
problemet burde ikke opstå, gør det, så må det være en fejl i playeren... For der bliver kun loadet et nyt nummer, når en sang er slut... Det er så dette nyligt loadede som den afspiller og den kan ikke "komme til" at afspille et tidligere nummer, da den jo har "unloaded" det gamle...
Jeg laver det første nummer der starter automatisk spille ud. Når det næste nummer starter i forlængelse af det første, PAUSER jeg det. Klikker jeg herefter Play, starten den for det meste et helt NYT nummer eller det aktuelle nummer fra starten. Nøjagtig dette samme der skete med Paask's gamle Player.
Jeg kan godt gøre det, men jeg kan ikke fortælle dig hvorfor.
Som jeg skrev tidligere, så aner scriptet ikke, hvilken fil den afspillede før, så det er ikke scriptet, der "kommer til" at genspille den forrige. Det er en fejl i playeren simpelthen... Jeg skal prøve at høre rundt omkring, om dette er et kendt problem, men umiddelbart har jeg ingen ide om en løsning...
Se! ... nu virker det. Helt perfekt med random afspilningen af de 9 munre + at den KUN spiller hvert nummer ÉN gang for hver runde. Det ser nu også ud til at virke helt PERFEKT med Pause/Play funktionen.
Så en kæmpe TAK! for din enorme indsats og viljestyrke til at løse dette.. snart meget langvarige projekt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.