Comunidad de diseño web y desarrollo en internet online

Cargar audio mp3 para reproducir

Citar            
MensajeEscrito el 16 Dic 2013 02:53 pm
Hola amigos, tengo un código muy básico para reproducir dos archivos mp3, toda la pelicula tiene un solo boton btnsiguiente el cual al ser presionado empieza a reproducir el siguiente audio.

Código ActionScript :

import flash.external.ExternalInterface;
var sonido:Sound;
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
var mycontext: SoundLoaderContext = new SoundLoaderContext(5000);
btnsiguiente.addEventListener(MouseEvent.CLICK, fsig);

var i:Number = 0;
var arreglo:Array =new Array();
arreglo[0]="flash/01.mp3";
arreglo[1]="flash/02.mp3";

//myTimer.start();
function prim(){
   sonido=new Sound();
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}
prim();
tema.text=arreglo[0];

function alfinal(e:Event){
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

function fsig(evt:MouseEvent):void{
   channel.stop();
   //sonido.close();//con esta linea da error
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

El problema es de este código no se nota de manera local pero en la web he comprobado que cuando presiono el boton siguiente el primer archivo mp3 sigue descargándose.¿como puedo hacer para parar esa descarga del primero?. Ya he probado con esa linea sonido.close(); y me sale error:
Error: Error #2029: Este objeto URLStream no tiene una secuencia abierta.
at flash.media::Sound/close()
at close_fla::MainTimeline/fsig()

Cual es la manera correcta de cargar otro audio mp3.

Gracias de antemano

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Dic 2013 04:15 pm
Utilizas la misma variable (sonido) para ambos sonidos, intenta usar distintas para evitar que la referencia se haga confusa y pueda generar error

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Dic 2013 05:08 pm
Gracias Jorge pero si por ejemplo quiero reproducir 30 canciones no voy a crear 30 objetos Sound.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Dic 2013 05:16 pm
Si la idea es reutilizar, ahora no lo estas haciendo

sonido=new Sound();

Esto se ejecuta cada vez que llamas a prim, en donde una misma variable se referencia a nuevos objetos Sound. Si la idea es reutilizar, inicializa un objeto Sound, luego cuando cambias lo limpias, le asignas nueva URL, etc

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Dic 2013 06:24 pm
No entiendo :( , debo crear el objecto Sound solo una vez? y fuera de prim? por que no funciona el close().

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Dic 2013 06:33 pm
Correcto, pruebalo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 12:47 pm
Listo, no funciona fuera de prim, pero si fuera de prim. Lo que me sigo preguntando por que no funciona close();

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Dic 2013 01:43 pm
Listo, no funciona fuera de prim, pero si fuera de prim


Mmm ... entiendo que ahora funciona?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 02:49 pm
El problema es que al cambiar al segundo audio el primero sigue descargándose, eso lo comprobé en la web, lo que quiero es detener esa descarga, lo intenté con close() pero no funciona.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Dic 2013 03:00 pm
Es lo que preguntaste al principio. Ya hiciste lo que te sugerí en el 3er POST, como? que paso?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 03:51 pm
Si lo hice, esta en mi 4º POST.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Dic 2013 04:10 pm
Listo, no funciona fuera de prim, pero si fuera de prim.


Codigo?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 04:34 pm

Código ActionScript :

import flash.external.ExternalInterface;
//var sonido:Sound;
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
var mycontext: SoundLoaderContext = new SoundLoaderContext(5000);
btnsiguiente.addEventListener(MouseEvent.CLICK, fsig);

var i:Number = 0;
var arreglo:Array =new Array();
arreglo[0]="flash/01.mp3";
arreglo[1]="flash/02.mp3";

//myTimer.start();
function prim(){
   var sonido:Sound = new Sound();
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}
prim();
tema.text=arreglo[0];

function alfinal(e:Event){
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

function fsig(evt:MouseEvent):void{
   channel.stop();
   //sonido.close();//con esta linea da error
   i=i+1;
   prim();
   tema.text=arreglo[i];

}

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Dic 2013 04:47 pm
Estas declarando sonido como variable local de la funcion prim, lo que digo es que la declares global y la reutilizes, haciendo un close + load dentro de la funcion prim

Asi como lo tienes, sonido no está definido.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 06:25 pm
var sonido:Sound=new Sound(); esto? ya lo prové al principio

Código ActionScript :

import flash.external.ExternalInterface;
var sonido:Sound=new Sound();
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
No funciona

close dentro de prim??¡¡

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Dic 2013 07:14 pm
Esta es la idea

Código ActionScript :

var sonido:Sound = new Sound();
var channel: SoundChannel = new SoundChannel();

function reproducir(url:String):void{
  try{
      sonido.close();
  } catch(e:Exception){
    trace(e.message) 
 }
 sonido.load(new URLRequest(uri),new SoundLoaderContext(5000));
  channel = sonido.play(0,0,new SoundTransform(0.1));
}


La función intenta cerrar el stream (que en la primera llamada no existe), luego carga y reproduce el sonido. Dado que es el mismo contenedor, una carga reemplaza la otra (quizás ni siquiera el close es necesario)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Dic 2013 07:38 pm
umm.. lo probaré gracias.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Dic 2013 02:51 pm
Cuando declaro el objeto sonido de manera global, al pasar al siguiente audio se ejecutaría la función prim() el cual contiene la linea:
sonido.load(new URLRequest(arreglo[i]),mycontext);
mycontext también es global por lo que los parámetros están bien pero sale este error:

Error: Error #2037: Se llamó a las funciones en una secuencia incorrecta o la llamada anterior no se produjo correctamente.
at flash.media::Sound/flash.media:Sound::_load()
at flash.media::Sound/load()

Que podría ser? en ese load() esta mi problema, pero al iniciar se llama a prim() y no se atasca en el load(), se atasca en la segunda llamada.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Dic 2013 04:12 pm
Postea el codigo como lo has cambiado

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Dic 2013 06:24 pm
Simplemente cambié esa linea, este seria el total:

Código ActionScript :

import flash.external.ExternalInterface;
var sonido:Sound = new Sound();
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
var mycontext: SoundLoaderContext = new SoundLoaderContext(5000);
btnsiguiente.addEventListener(MouseEvent.CLICK, fsig);

var i:Number = 0;
var arreglo:Array =new Array();
arreglo[0]="flash/01.mp3";
arreglo[1]="flash/02.mp3";

//myTimer.start();
function prim(){
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}
prim();
tema.text=arreglo[0];

function alfinal(e:Event){
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

function fsig(evt:MouseEvent):void{
   channel.stop();
   //sonido.close();//con esta linea da error
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Dic 2013 06:38 pm
Te saltaste el close que te puse en el try/catch

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Dic 2013 01:02 am
Creo que vuelvo a lo mismo, si lo pongo asi:

Código ActionScript :

function fsig(evt:MouseEvent):void{
   channel.stop();
    try{
          sonido.close();
         } catch(e:Error){
          trace("error");
         }
   i=i+1;
   primero();
   tema.text=arreglo[i];
}

El cambio seria que se imprimiria "error"

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Dic 2013 01:08 am
No en fsig, switch a modo copy/paste

Código ActionScript :

function prim(){
 try{
          sonido.close();
         } catch(e:Error){
           trace(e.message);
         }
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Dic 2013 04:19 am
Este es el codigo:

Código ActionScript :

import flash.external.ExternalInterface;
var sonido:Sound = new Sound();
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
var mycontext: SoundLoaderContext = new SoundLoaderContext(5000);
btnsiguiente.addEventListener(MouseEvent.CLICK, fsig);

var i:Number = 0;
var arreglo:Array =new Array();
arreglo[0]="flash/01.mp3";
arreglo[1]="flash/02.mp3";

//myTimer.start();
function prim(){
        try{
          sonido.close();
         } catch(e:Error){
           trace(e.message);
         }
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}
prim();
tema.text=arreglo[0];

function alfinal(e:Event){
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

function fsig(evt:MouseEvent):void{
   channel.stop();
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

En la ejecucion se reproduce el primer audio y en la pestaña salida dice esto:
Error #2029: Este objeto URLStream no tiene una secuencia abierta.
Y al apretar el boton siguiente se calla el audio y aparece esto:
Error #2029: Este objeto URLStream no tiene una secuencia abierta.
Error: Error #2037: Se llamó a las funciones en una secuencia incorrecta o la llamada anterior no se produjo correctamente.
at flash.media::Sound/flash.media:Sound::_load()
at flash.media::Sound/load()
at close_fla::MainTimeline/prim()
at close_fla::MainTimeline/fsig()

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Dic 2013 04:20 am
Este es el codigo:

Código ActionScript :

import flash.external.ExternalInterface;
var sonido:Sound = new Sound();
var indicador:Boolean = true;
var sTransform:SoundTransform = new SoundTransform(0.1);//0.1 es el volumen
var channel: SoundChannel = new SoundChannel();
var mycontext: SoundLoaderContext = new SoundLoaderContext(5000);
btnsiguiente.addEventListener(MouseEvent.CLICK, fsig);

var i:Number = 0;
var arreglo:Array =new Array();
arreglo[0]="flash/01.mp3";
arreglo[1]="flash/02.mp3";

//myTimer.start();
function prim(){
        try{
          sonido.close();
         } catch(e:Error){
           trace(e.message);
         }
   sonido.load(new URLRequest(arreglo[i]),mycontext);
   if(indicador){
      channel = sonido.play(0,0,sTransform);
   }
   channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}
prim();
tema.text=arreglo[0];

function alfinal(e:Event){
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

function fsig(evt:MouseEvent):void{
   channel.stop();
   i=i+1;
   prim();
   tema.text=arreglo[i];
}

En la ejecucion se reproduce el primer audio y en la pestaña salida dice esto:
Error #2029: Este objeto URLStream no tiene una secuencia abierta.
Y al apretar el boton siguiente se calla el audio y aparece esto:
Error #2029: Este objeto URLStream no tiene una secuencia abierta.
Error: Error #2037: Se llamó a las funciones en una secuencia incorrecta o la llamada anterior no se produjo correctamente.
at flash.media::Sound/flash.media:Sound::_load()
at flash.media::Sound/load()
at close_fla::MainTimeline/prim()
at close_fla::MainTimeline/fsig()

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Dic 2013 07:27 pm
Ok, en este punto recien llegamos al meollo. Cuando abro y miro la ayuda veo que no se puede reusar sonidos que ya han empezado a reproducirse, asi que cambio de estrategia. Para poder hacer el close, necesito un pool de sonidos. Aqui va el código simplificado. Puedes probarlo aqui, http://flash-db.org/temp/musica.html , si lo sniffas, verás que se corta la descarga al pasar.

Código ActionScript :

var current:Number = 0;
var channel: SoundChannel = new SoundChannel();
btnsiguiente.addEventListener(MouseEvent.CLICK, alfinal);
var soundPool:Array = new Array();
var arreglo:Array = ["tema1.mp3", "tema2.mp3"];

function reproduce(uri:String):void{
   if(soundPool.length>0){
      soundPool[0].close();
      soundPool.splice(0,1);
      channel.stop();
    } 
   var sonido:Sound = new Sound();
   soundPool.push(sonido)
   sonido.load(new URLRequest(uri),new SoundLoaderContext(5000));
   channel = sonido.play(0,0, new SoundTransform(0.1));
   tema_txt.text = uri;
  if(!channel.hasEventListener(Event.SOUND_COMPLETE))
     channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}

function alfinal(e:Event){
   if(current==(arreglo.length-1)) current = -1
  reproduce(arreglo[++current])
}
reproduce(arreglo[current])


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 20 Dic 2013 02:54 pm
Parece resuelto el problema, mil gracias.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Dic 2013 02:11 am
Lo estuve pensando, el objeto sonido no permite ser aplicado el método close(),tampoco permite ser eliminado. Pero todo eso cambia al meterlo dentro de un array.

Yo intente eliminar el objeto sonido con delete pero me dice que "solo pueden ser eliminados propiedades creadas dinamicamente ". y con el close me dice "Este objeto URLStream no tiene una secuencia abierta".

¿Al estar en un array se vuelven dinamicas? ya que lograste cerrar y eliminar el objeto sonido del primer audio con soundPool[0].close() y soundPool.splice(0,1) respectivamente.

Saludos y gracias otra vez.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 Dic 2013 11:40 pm
Probé el código que pusiste de manera local y me di cuenta que no funciona, :o al apretar el boton dice
Error: Error #2029: Este objeto URLStream no tiene una secuencia abierta.
at flash.media::Sound/close()
Sigue el problema en el close

Código ActionScript :

var current:Number = 0;
var channel: SoundChannel = new SoundChannel();
btnsiguiente.addEventListener(MouseEvent.CLICK, alfinal);
var soundPool:Array = new Array();
var arreglo:Array = ["flash/csbu.mp3", "flash/making.mp3"];

function reproduce(uri:String):void{
if(soundPool.length>0){
soundPool[0].close();
soundPool.splice(0,1);
channel.stop();
} 
var sonido:Sound = new Sound();
soundPool.push(sonido);
sonido.load(new URLRequest(uri),new SoundLoaderContext(5000));
channel = sonido.play(0,0, new SoundTransform(0.1));
tema_txt.text = uri;
if(!channel.hasEventListener(Event.SOUND_COMPLETE))
channel.addEventListener(Event.SOUND_COMPLETE, alfinal);
}

function alfinal(e:Event){
if(current==(arreglo.length-1)) current = -1;
reproduce(arreglo[++current]);
}
reproduce(arreglo[current]);

Pero el de la web si funciona de maravilla en el link que pusiste.

Por edavio

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Dic 2013 01:20 pm
Mira si te funciona en el servidor, que es donde realmente va a estar

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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