Detekcija zavrsenog playback-a AS 3.0

1

Detekcija zavrsenog playback-a AS 3.0

offline
  • Pridružio: 11 Maj 2007
  • Poruke: 86

Napravio sam audio MP3 player sa svim potrebnim elementima u AS 3.0 !!!

Sada me zanima kako da detektujem kraj playback-a !!!
Postoji opcija:
var song:Sound = new Sound(new URLRequest("pesma.mp3")); var sc:SoundChannel = song.play(); sc.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); function onSoundComplete(e:Event):void {     trace("Gotovo!!!"); }

Ovo radi, ali samo ako se pesma slusa od pocetka do kraja, ako kojim slucajem preskacem (ubrzavam) pesmu kreiranim seekbar-om ili ako istu pauziram u jednom trenutku, a zatim, je opet pustim, tada se ova funkcija ne izvrsava !!!???

Ima li neko ideju ???

Hvala ...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2005
  • Poruke: 5224
  • Gde živiš: Oslo

Proveri "ciji" je addEventListener. Nisam sigurna ovako napamet, ali mislim da je song.addEventListener umesto sc.addEventListener.



offline
  • Pridružio: 11 Maj 2007
  • Poruke: 86

Dosao sam do resenja nakon 3 dana razmisljanja !!! Lud je ovaj AS 3.0, treba malo da se razmislja (jos uvek sam u periodu tranzicije) !!!

Evo kako:
var song:Sound = new Sound(new URLRequest("pesma.mp3")); var sc:SoundChannel = song.play(); this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); function onEnterFrameHandler(e:Event):void {     sc.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); } function onSoundComplete(e:Event):void {     trace("Gotovo!!!"); }

Znaci, sve se radi preko handler-a, pa se pojavljuje brdo funkcija !!!
U svakom slucaju je bolji od AS 2.0 !!!

offline
  • Pridružio: 19 Maj 2005
  • Poruke: 5224
  • Gde živiš: Oslo

Pa sve ti zavisi os scope-a i sta je u tvom slucaju this. "song" bi ti isto radio posao Wink

offline
  • Pridružio: 11 Maj 2007
  • Poruke: 86

Da ...

"song" bi radio posao, ali mora event da bude ENTER_FRAME, a u toj funkciji da dodajem SoundChannel-u SOUND_COMPLETE event ("song" ne moze da sadrzi SOUN_COMPLETE event, moze - nema greske, ali se funkcija ne izvrsava) !!!

U mom slucaju "this" je "root" !!!

offline
  • stolex  Male
  • Novi MyCity građanin
  • Pridružio: 16 Jan 2008
  • Poruke: 9
  • Gde živiš: Nis

Meni se ovo resenje uopste ne svidja. Pogotovu sto se bez razloga koristi ENTER_FRAME, zasto u svakom frejmu mora da se dodaje event listener?
Mozda je bolje resenje da to uradis samo prilikom seek-a jer si reko da ti se tad gubi listener (a vrlo je moguce da sound koji je preterano izmenjen) pravi novu instancu za koju se nisi prijavio da slusas event.

offline
  • Pridružio: 11 Maj 2007
  • Poruke: 86

Citat:@stolex
(a vrlo je moguce da sound koji je preterano izmenjen) pravi novu instancu za koju se nisi prijavio da slusas event.


Ne, ne ... to nema nikakve veze,a nova instanca se ne kreira, jer je zvuk unapred definisan, "nista" se nece kreirati samo od sebe !!!

Seek i "osluskujem" ENTER_FRAME-om, ali na root-u !!!
U istom "osluskivacu" sam kreirao SOUND_COMPLETE event (i na ovaj nacin obavlja svoj posao) --- nisam kreirao milion ENTER_FRAME listener-a, vec samo jedan, ali sam zato u njega "ugradio" razna s*anja --- poziciju seekbar-a, spectrum analyzer, detekciju peek-ova na levom i desnom zvucniku, proteklo vreme, itd.

Jos jedna stvar:
ja sam mislio (vodjen znanjem iz AS 2.0) da ce ovi silni eventListener-i da uspore rad flash player-a, a isto tako i animacije, medjutim sve radi super i bez kasnjenja ... a izgleda da u AS 3.0 sve mora da se radi preko "osluskivanja", ja ne vidim drugo resenje (kompletno je objektno orijentisan) imas cak i mogucnost da, kada kreiras svoju klasu, za istu definises svoje eventListener objekte !!! Smile

offline
  • stolex  Male
  • Novi MyCity građanin
  • Pridružio: 16 Jan 2008
  • Poruke: 9
  • Gde živiš: Nis

this.addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); function onEnterFrameHandler(e:Event):void {     sc.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); }

Ovim kodom funkciju onEnterFrameHandler pozivas u svakom frejmu i njome u svakom frejmu registrujes listener za sc. Zasto to radis u nedogled?


Dalje, Nista se nece napraviti samo od sebe. TACNO. sc pravis TI. To je ono sto ti pricam. Ukoliko seek radis kao sto je lepo objasnjeno u helpu: livedocs.adobe.com/flex/3/html/help.html?co.....nd_08.html videces da svakim pozivom sound.play(position) TI pravis novu instancu soundChannel objekta, sto znaci da od sada radi on, tj da onaj prethodni vise ne radi sto znaci da taj prethodni vise ne svira, iz cega proizilazi da on nikad nece da zavrsi pesmu, iz cega dalje proizilazi da isti taj nikad nece baciti event da je pesma zavrsena. To znaci da (SAMO) kada radis seek treba ponovo da registrujes listener na novu instancu soundChannel objekta, a ne da to radis u svakom frejmu.

Citat:a izgleda da u AS 3.0 sve mora da se radi preko "osluskivanja", ja ne vidim drugo resenje (kompletno je objektno orijentisan) imas cak i mogucnost da, kada kreiras svoju klasu, za istu definises svoje eventListener objekte !!!

Ovo si imao i u AS2 ( nutrixinteractive.com/blog/?p=33 ), samo sto je u AS3 to jedino (ispravno) resenje.

E da, slazemo se u jednoj stvari: AS3 jeste mnogo bolji od AS2

offline
  • Pridružio: 11 Maj 2007
  • Poruke: 86

Ja sam zaustavljao zvuk funkcijom
SoundMixer.stopAll();
pa sam poslusao tvoj savet i zaustavljao isti funkcijom
sc.stop();
to sam radio kada treba da prebacim "poziciju" pesme seekbar-om ili da je pauziram, a zatim ponovo pustim.

Zatim sam listener "izbacio" iz ENTER_FRAME-a
sc.addEventListener(Event.SOUND_COMPLETE, onSoundCompleteHandler); function onSoundCompleteHandler(e:Event):void {     trace("Gotovo!"); }
ali opet ne radi prilikom "preskakanja" pozicije pesme i pauziranja, vec samo ako se pesma preslusa od pocetka do kraja !!!

Ja bih te zamolio da pokusas da kreiras kod koji ce raditi ... nista specijalno ... samo da imas opciju da pauziras zvuk i da opet pustis, a da pritom SOUND_COMPLETE radi kako treba, bez ENTER_FRAME-a !!!

Hvala ...

offline
  • stolex  Male
  • Novi MyCity građanin
  • Pridružio: 16 Jan 2008
  • Poruke: 9
  • Gde živiš: Nis

import flash.events.Event; import flash.media.Sound; import flash.media.SoundChannel; import flash.net.URLRequest; import flash.utils.setTimeout; var sound:Sound, channel:SoundChannel, request:URLRequest; var onComplete:Function = function(evt:Event):void{    trace("gotovo"); } var onTimer:Function = function():void{    channel.stop();    channel.removeEventListener(Event.SOUND_COMPLETE, onComplete);    channel = sound.play(187000);    channel.addEventListener(Event.SOUND_COMPLETE, onComplete); } request = new URLRequest("palacinka.mp3"); sound = new Sound(request); channel = sound.play(); channel.addEventListener(Event.SOUND_COMPLETE, onComplete); setTimeout(onTimer, 4000);

znaci startujes sound sa sound.play() settimeout nakon 4 sec pozove funkciju onTimer u kojoj odem na 2 sekunde pred kraj moje pesme (ti unesi ovde vrednost koja tebi odgovara). Skinem stari listener, napravim novi soundChannel objekat i opet registrujem event na njega.

Ko je trenutno na forumu
 

Ukupno su 854 korisnika na forumu :: 30 registrovanih, 7 sakrivenih i 817 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Andrija357, Apok, babaroga, Battlehammer, Denaya, DonRumataEstorski, DPera, dragoljub11987, Duh sa sekirom, GandorCC, Georgius, ivica976, Karla, Koridor, lucko1, milimoj, nemkea71, Nikolaa11, Nobunaga, rodoljub, Rogan33, Shinobi, Sumadija34, suton, Toper, vlvl, YU-UKI, šumar bk2, 79693