Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

[Resolvido] load sound no AS3

Recommended Posts

Bom pessoal, estou tentando carregar um fundo musical com AS3.

Estou apanhando mas estou indo. Porem, agora preciso de uma força;

 

Seguinte:

 

Bom. Consegui em partes.

 

Para carregar o som foi fazer isso:

var soundClip:Sound=new Sound();
//Create a new SoundChannel Object
var sndChannel:SoundChannel=new SoundChannel();
//Load sound using URLRequest
soundClip.load(new URLRequest("sons/dingo.mp3"));
//Create an event listener that wll update once sound has finished loading
soundClip.addEventListener(Event.COMPLETE,onComplete,false,0,true);
function onComplete(evt:Event):void {
//Play loaded sound
sndChannel=soundClip.play();
}

Agora tenho outros dois problemas:

 

1)Como faço agora para dar play e pause nesse som usando as3?

Essa pergunta é porque : nome_do_botao.onRelease = function........... não funcionou no as3.

 

2) Nao sei o que foi que eu fiz, mas agora meu painel de AS em todas a linhas aparece o carcter PI. É o do matemática mesmo. Como faz para tirar isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

poderia colocar um checkbox para on/off e um slider para percentual do volume

 

var canal:SoundChannel = new SoundChannel();
var _som:Sound = new Sound();
var _vol:SoundTransform = new SoundTransform();
var _arq:URLRequest = new URLRequest("nomeArquivo.mp3");

//
_som.load(_arq);
canal = _som.play(0,int.MAX_VALUE);
//
slider.addEventListener(Event.ENTER_FRAME, _volume);
chk.addEventListener(Event.CHANGE, _chk);
//
function _volume(e:Event):void
{
_vol.volume = (e.target.value/100);
canal.soundTransform = _vol;
txt_som.text = e.target.value + "%";
}
function _chk(e:Event):void
{
if (e.target.selected)
{
	slider.value = 30;
}
else
{
	slider.value = 0;
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, consegui assim:

stop();
   import flash.display.MovieClip;        
import flash.events.Event;   
import flash.media.Sound;   
import flash.media.SoundChannel;   
import flash.net.URLRequest

       var sound:Sound;
       var channel:SoundChannel;

       sound = new Sound(new URLRequest('sons/dingo.mp3'));



       function tocar(e:Event = null) 
          {
           channel = sound.play();
           channel.addEventListener(Event.SOUND_COMPLETE, tocar);
           }

       function parar(e:Event = null) 
          {
               channel.stop();
               channel.removeEventListener(Event.SOUND_COMPLETE, parar);
           }

       function carregar (e:Event = null) 
          {
           channel = sound.play();
           channel.addEventListener(Event.SOUND_COMPLETE, carregar);
           }

carregar();
toca.addEventListener(MouseEvent.CLICK, tocar);
para.addEventListener(MouseEvent.CLICK, parar);

Agora preciso saber como fazer uma condiçao que diga: se o som já estive tocando, o botão play não execute açao. ou seja, não starte o som novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

 

Como eu faço para verificar se o som esta tocando sem ter que usar uma variavel booleana?

 

Existe algo do tipo

 

if(!playng)

{

}

?

 

Porque se eu usar boleano, depois que o som acabar, caso eu queira tocar ele de novo não daria. A não ser que eu clikasse no stop para virar a booleana. E eu não queria isso pois o visitante pode pensar que é defeito do site e não é.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, antes de mais nada, um Feliz Ano Novo a todos.

 

Bom.

 

       function tocar(e:Event = null) 
          {
 if (isPlaying==false)
 {
 var channel = sound.play();

 var totalBytes:Number = sound.bytesTotal;
                var loadeBytes:Number = sound.bytesLoaded;

                channel.addEventListener(Event.SOUND_COMPLETE, carregar);
 txtBl.text =String(loadeBytes);
if(loadeBytes/totalBytes<1)
 {
isPlaying=true; 
}				 
 else
 {
 isPlaying=false;
 }
 }
           }

Aqui estou tentando fazer duas coisas e não esta dando certo.

 

1) imprimir no campo de texto, a quantidade de bytes carregados do audio

2) setar a varfiavel booleana isPlayng para false assim que a divisão de bystes caRREGADOS pelo totalk de bytes der 1.

 

Onde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendi essa ultima alteração que você fez, porque "if(loadeBytes/totalBytes<1)" ??

 

 

não bastaria você fazer isso:

 

function tocar(e:Event = null) 
{
   channel = sound.play();
   channel.addEventListener(Event.SOUND_COMPLETE, tocar);
   isPlaying=true;
}

function parar(e:Event = null) 
{
   channel.stop();
   channel.removeEventListener(Event.SOUND_COMPLETE, parar);
   isPlaying=false;
}

 

 

 

e pelo que vi, ao executar o tocar(), o som já esta carregado, então para que

saber a quantidade de bytes nessa hora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu estou precisando saber é se o som esta ou não em execuçao.

 

Mas não pode ser com variavel booleana, porque se for com booleana, na hora que o som para, não tem como começar ele de novo sem clikar no baotão stop

 

Deu pra entender mais ou menos o que eu estou precisando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum, não entendi....

 

 

você fala do som para quando o usuario clicar em 'parar' ou quando ele acabou a musica e executa o evento SOUND_COMPLETE? explica melhor

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte\:

 

A musica começa a tocar.

duas coisas estão acontecendo:

 

1) o carregamento do audio (load até o complete).

 

2) O som saindo na caixa de som (aqui, a medida que o audio vai sendo carregado, o som vai sendo tocado.

 

Certo?

 

Eu preciso saber o momento certo em que a musica para de tocar e não o momento em que o arquivo termina de carregar.,

 

Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, para isso você já esta usando o channel.addEventListener(Event.SOUND_COMPLETE, tocar);

 

esse evento serve para isso mesmo, e continuando, onde esta o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eder, não há erro.

 

Eu só preciso saber, atraves de codigo AS3 se o som esta sendo executado e não se ele esta sendo carregado ou se ja carregou.

 

Preciso disso para impossibilitar o usuario de fazer o som tocar um em cima do outro ou ainda de, ao terminar de tocar o som e o usuario terminar de ouvir a musica, ele clikar em play novamente por causa de que a varivel isPlayng booleano esta com true ainda.

 

o Event.SOUND_COMPLETE, mostra que o download do som já se completou.

 

O sound.bytesTotal, mostra quantos bytes tem o som baxado.

 

O sound.bytesLoaded, mostra, a cada instante, quantos bytes foram baixados do som em questão.

 

Agora eu pergunto: Qual é o código que me retorna se o som esta saindo na caixa de som? Ou seja, se o som esta sendo executado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, para evitar que o som toque mais de uma vez, faça isso:

 

 

function tocar(e:Event = null) 
{
    if(channel){
         channel.stop();
    }
    channel = sound.play();
    channel.addEventListener(Event.SOUND_COMPLETE, tocar);
    isPlaying=true;
}
function parar(e:Event = null) 
{
   channel.stop();
   channel.removeEventListener(Event.SOUND_COMPLETE, parar);
   isPlaying=false;
}

 

 

e a variável isPlaying deve servir para saber se a musica esta tocando ou não

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é.

O código ficou assim:

stop();
   import flash.display.MovieClip;        
import flash.events.Event;   
import flash.media.Sound;   
import flash.media.SoundChannel;   
import flash.net.URLRequest;

       var isPlaying:Boolean = false;
       var sound:Sound;
       var channel:SoundChannel;

       sound = new Sound(new URLRequest('sons/dingo.mp3'));      

       function tocar(e:Event = null) 
          {
		 if (isPlaying==false)
		 {
                if(channel)
			 {          
			    channel.stop();     
			  }				 
			 channel = sound.play();
                channel.addEventListener(Event.SOUND_COMPLETE, tocar);
			 isPlaying=true;
		 }
           }

       function parar(e:Event = null) 
          {
		 if (isPlaying==true)
		 {
               channel.stop();
               channel.removeEventListener(Event.SOUND_COMPLETE, parar);
			isPlaying=false;

		 }
           }

tocar();
isPlaying = true;
toca.addEventListener(MouseEvent.CLICK, tocar);
para.addEventListener(MouseEvent.CLICK, parar);

Mas ainda não é isso que eu preciso.

 

Quando o som começo a tocar, assim que terminou a reproduçao do audio, eu clickei no botão play e a musica nõ tocou de novo porque a variavel boolena isPlayng estava setada como true. Daí, não toca novamente o som pois, sgundo a booleana, mesmo que o som não esteje mais tocando, ele não toca de novo pois ja carregou todo.

 

Entendeu? Esse é o problema.

 

Há uma diferenã entre o som sendo carregado e o som sendo reproduzido. Preciso saber se ele esta sendo reproduzido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu faço para pegar o valor de channel.position?

 

Eu sei que vai de 0 até 1 mas não achei no tutoriais como recuperar essew numero.

 

Tentei assim mas da erro:

var sound:Sound;
       var channel:SoundChannel;
       var posicao:Number = channel.position;
       sound = new Sound(new URLRequest('sons/dingo.mp3'));      
if ( posicao==0.8)
{
parar();	// esse parar(), é só paara testar se seta funcionando o if
}

Da o seguinte erro:

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at index_fla::MainTimeline/frame2()

Como corrijo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

antes de tentar resolver de outra forma, é bom verificar pq ele não executa o Event.SOUND_COMPLETE quando a musica termina sozinha

 

se você colocar um trace() dentro da função parar(), ele executa quando o som termina de tocar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.

 

O SOUND_COMPLETE acontece quando o som acaba de carregar (loadedbytes =100%) ou quando a musica acaba de tocar(sair o som na caixa-reproduzir)?

 

Eis o meu codigo completo.

Talvez eu possa estar errando em alguma coisa:

 

stop();
   import flash.display.MovieClip;        
import flash.events.Event;   
import flash.media.Sound;   
import flash.media.SoundChannel;   
import flash.net.URLRequest;

       var isPlaying:Boolean = false;
       var sound:Sound;
       var channel:SoundChannel;

       sound = new Sound(new URLRequest('sons/dingo.mp3'));      

       function tocar(e:Event = null) 
          {
		 if (isPlaying==false)
		 {
                if(channel)
			 {          
			    channel.stop();     
			  }				 
			 channel = sound.play();
                channel.addEventListener(Event.SOUND_COMPLETE, tocar);
			 isPlaying=true;
		 }
           }

       function parar(e:Event = null) 
          {
		 if (isPlaying==true)
		 {
               channel.stop();
               channel.removeEventListener(Event.SOUND_COMPLETE, parar);
			isPlaying=false;

		 }
           }

tocar();
isPlaying = true;
toca.addEventListener(MouseEvent.CLICK, tocar);
para.addEventListener(MouseEvent.CLICK, parar);


stop();// Declação de Variáveis e Incialização da página HOME
var link:URLRequest=new URLRequest("inicio.swf");
mcCarrega.gotoAndPlay(2);

// Eventos dos Botões
inicio.addEventListener(MouseEvent.CLICK, clique);
empresa.addEventListener(MouseEvent.CLICK, clique);
produtos.addEventListener(MouseEvent.CLICK, clique);
infuteis.addEventListener(MouseEvent.CLICK, clique);
ambiental.addEventListener(MouseEvent.CLICK, clique);
atuacao.addEventListener(MouseEvent.CLICK, clique);
contato.addEventListener(MouseEvent.CLICK, clique);

// Função clique que troca o valor da variável LINK
function clique(evt:MouseEvent):void {
switch (evt.currentTarget) {
	case (inicio):
		link=new URLRequest("inicio.swf");
		break;
	case (empresa):
		link=new URLRequest("empresa.swf");
		break;
	case (produtos):
		link=new URLRequest("produtos.swf");
		break;
	case (infuteis):
		link=new URLRequest("infuteis.swf");
		break;
	case (ambiental):
		link=new URLRequest("ambiental.swf");
		break;
	case (atuacao):
		link=new URLRequest("atuacao.swf");
		break;
	case (contato):
		link=new URLRequest("contato.swf");
		break;
}
mcCarrega.gotoAndPlay(2);
}

Caso queira testar, ai vai o link.

http://gapde.com.br/bateriasadvance.com.br/

Se voce deixar a musica terminar de tocar (cerca de 2 minutos) e depois, clikar em play novamnente, ela não vai tocar.

 

Só se voce clikar em stop e depois em play.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.

 

consegui

 

Acontece que eu estava pensando que o SOUND_COMPLETE, se referia ao som terminado seu download e não o som em execuçao ao seu termino.

 

Então, fiz assim na funçao toca:

       function tocar(e:Event = null) 
          {
		 if (isPlaying==false)
		 {
                if(channel)
			 {          
			    channel.stop();     
			  }				 
			 channel = sound.play();
                channel.addEventListener(Event.SOUND_COMPLETE, parar); (AQUI ESTVA PONDO REFERENCIA A FUNÇÃO TOCAR EM VEZ DE A FUNÇAO PARAR. AQUI O ERRO.)
			 isPlaying=true;
		 }
           }

Bom obrigado a todos que ajudarma e um Feliz Ano Novo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.