Comunidad de diseño web y desarrollo en internet online

problemas con sound delay :/

Citar            
MensajeEscrito el 21 Abr 2008 11:32 pm
Hola, estoy programando una clase que maneja un sonido, y le aporta una funcionalidad de play, pause y stop, hasta ahi todo bien, pero despues de darle mil vueltas, no consigo hacer que el pause me funcione bien :( y ya estoy empezando a pensar que se trata de un bug de flash AS3, he probado en maquinas distintas, con soluciones alternativas (usando un timer para obtener la posicion del audio ) ...

El problema esta en la propiedad position del SoundChannel, que o bien me devuelve el valor que le da la gana, o bien el Sound.play(delay), no me está funcionando como debería ...

Este es un código resumido que he creado en la linea de tiempo, y que no consigo hacer que me funcione :

Código :

// NOTA: para cargar el sonido utilizo BulkLoader de googleCode
//pero sería lo mismo que cargarlo de la forma natíva, esto no influye en el proceso

import br.com.stimuli.loading.BulkLoader;

var sonido:Sound = new Sound();
var chan:SoundChannel = new SoundChannel();
var pause_time:uint = 0;
var intervalo:Timer;

var bl:BulkLoader = new BulkLoader("principal");
   bl.add("s1.mp3",{id:"sonido"});
   bl.addEventListener(BulkLoader.COMPLETE, onCompletar);
   bl.start();
   
   function onCompletar (e:Event){
      sonido = bl.getContent("sonido");
      play_btn.addEventListener(MouseEvent.CLICK, toPlay);
      stop_btn.addEventListener(MouseEvent.CLICK, toStop);
      pause_btn.addEventListener(MouseEvent.CLICK, toPause);
   }
   
   function toPlay(e:MouseEvent){
      chan = sonido.play(pause_time);
   }
   
   function toStop(e:MouseEvent){
      chan.stop();
      pause_time = 0;
   }
   
   function toPause(e:MouseEvent){
      pause_time = chan.position;
      chan.stop();
   }




Cuando pulso mi boton de pausa, trazo la variable pause_time, y todo parece estar correcto, pero cuando utilizo este valor para volver a poner el audio en play, mi audio no va al lugar donde debería, sino x tiempo mas adelante ... si trazo en bucle (un enterframe por ejemplo) el position del mi SoundChannel, parece que está todo bien, que por ejemplo el audio se pausó en tal posicion, y que el play lo ha puesto justo en ese momento, pero ... no funciona como debería :evil:

Conocéis alguna solución a este problema??

muchas gracias de antemano ;)

saludos!

Por TIMNHE

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 22 Abr 2008 01:14 am
Ahí hay una clase de por medio donde la referencia al sonido la obtienes por get .... mmm ... prueba antes una cosa simple, planta un solo botoncito y este código:

Código :

var mySound:Sound = new Sound(new URLRequest("naranjo.mp3"))
var chan:SoundChannel = mySound.play(0)
var playing = true
var currentTime = 0
function startStop(e:MouseEvent){
   playing = !playing
   if(!playing) {
      currentTime = chan.position
      chan.stop()
   } else {
      chan = mySound.play(currentTime)
   }
}
miBoton.addEventListener(MouseEvent.CLICK, startStop)


Es de los mas simplote y debería andar perfectamente (prueba con distintos MP3 por las dudas). Si funciona, luego vuelve a tu ejemplo y si no funciona, échale un ojo al BulkLoader

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Abr 2008 11:26 am
Hola solis, gracias por tu respuesta ;)
Te comento, que el BulkLoader, lo unico que hace es precargar mi audio, este no es el problema, hasta ahí todo va bien. Pero ni mi ejemplo ni el tuyo me funcionan 'bien'.
Me puedes confirmar que tu audio hace una sincronizacion perecta??

Como te decía el problema que tengo es que cuando hago el 'restart', mi audio no va al punto a donde tenia que ir, sino que se adelanta x tiempo.

Imaginate que mi audio dice:
'palabra1 palabra2 palabra3 palabra4 palabra5 palabra6'

si yo lo paro justo despues de palabra2, se supone que lo siguiente a escuchar, sería palabra3 ... pues en mi caso, lo mas probable es que esté teminando de decir palabra4, o comenzando con palabra5 ...
Espero haberme explicado :crap:

Estube mirando por la web, y encontré a otra persona que tenía el mismo problema.
Este tipo, decia que a el, le funcionaba correctamente si cuando hacia el 'restart', ponia:

audio.play(pause_time)

en vez de

channel = audio.play(pause_time) ...

lo que pasa es que al hacerlo asi, se pierde la referencia del canal, y ya no se puede volver a poner en stop o pause el sonido ... solo te vale para 1 vez ...

¿se te ocurre alguna otra solucion a este problema?
Trabajo muchisimo con audio, y necesito controlar bien todo este tema en AS3, la verdad es que me está cosatando demasiado pasar el codigo antigo a la nueva version de flash ...

Gracias ;)

Por TIMNHE

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 22 Abr 2008 11:47 am
Bueno, lo miré rápidamente y me pareció coordinado, aunque no lo escuché a nivel palabra. Si la sincro es muy fina y encuentras un offset constante, pues corrígelo con una constante (chequea en otras máquinas por las dudas) También ten en cuenta que el time se da en milisegundos, redondea hacia abajo para no perderte nada

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Abr 2008 11:53 am
Gracias por responder tan rápido Jorge ;)
voy a intentar hacer lo que dices de restarle una cantidad ... o sino no se ... ya me queda modificar la clase soundChannel :lol:
Lo del redondeo ya lo hice, y tampoco me ha funcionado :?
sigo buscando, saludos!

Por TIMNHE

7 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 22 Abr 2008 01:08 pm
Solucionado!

El código es correcto, el problema está en la compresion del audio, en mi caso 22khz.
Con esta calidad, por lo visto flash no puede hacer el cálculo correcto de la posición en la que se encuentra el audio, pero si se sube a 44khz, parece que ya lo toma bien.

saludos y gracias por vuestra ayuda :cool:

Por TIMNHE

7 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.