Curso AS3

Manipulando MP3s com a classe Sound

Para manipularmos MP3s no Flash, utilizaremos a classe Sound. Para iniciar, deve-se criar um objeto Sound, e desta forma poderemos utilizar os seus métodos, propriedades e eventos.

var meuSom:Sound = new Sound();

Os métodos disponíveis na classe Sound

  • attachSound(): chama um arquivo de áudio da biblioteca, através do parâmetro id (identifier), e o une ao objeto Sound.
  • getBytesLoaded(): retorna o número de bytes carregados do objeto Sound específicado.
  • getBytesTotal(): retorna o número em bytes total do objeto Sound especificado.
  • getPan(): retorna o último valor setado pelo método setpan(), que é de -100 a +100.
  • getTransform(): retorna o último valor da chamada setTransform().
  • getVolume(): retorna o volume do som de 0 a 100.
  • loadSound(): carrega um arquivo MP3 no objeto Sound.
  • setPan(): determina o balanço do som da direita para a esquerda.
  • setTransform(): define as opções de transformação do som. Pode-se usá-lo para reproduzir o som de mono como estéreo, e estéreo como mono, além de adicionar alguns efeitos.
  • setVolume(): ajusta o volume do som.
  • start(): inicia o som, pode-se iniciar do início ou através do parâmetro secondOffset é possível especificar o ponto onde deve começar.
  • stop(): para todos os sons em execução, ou especifique o som a ser parado através do parâmetro idName.

Eventos

  • onID3: invocado quando novos dados ID3 de um arquivo MP3 estão disponíveis.
  • onLoad: invocado quando o som é carregado.
  • onSoundComplete: invocado quando o som chega ao fim.

Propriedades

  • duration: retorna em milissegundos a duração total do som.
  • id3: fornece o acesso aos metadados, parte de um arquivo MP3.
  • position: retorna em milissegundos a posição atual do som.

Chamando um arquivo de som da biblioteca

Após importar (CTRL+R) um arquivo de áudio para o Flash, é necessário o instanciar para poder chamá-lo via actionscript, abra a biblioteca (F11), clique com o botão direito do mouse sobre o arquivo na biclioteca e selecione a opção “Linkage…”, marque a caixa “Export for Actionscript” e “Export in first frame”, e em “Identifier” coloque libSound.

No código abaixo foi utilizado o método attachSound() para anexar o som ao objeto Sound.

var meuSom:Sound = new Sound();
meuSom.attachSound("libSound");

Chamando um arquivo de som externo

Através do método loadSound(), é carregado um arquivo de som externo, o segundo parâmetro, um valor boolean, indica se o áudio é streaming ou não. Setado como true, o áudio é executado enquanto este é baixado, como false, o som é iniciado apenas quando o áudio for carregado completamente.

var meuSom:Sound = new Sound();
meuSom.loadSound("som.mp3", false);

Exibindo o status de carregamento de um arquivo MP3

Para exibir o status da porcentagem do carregamento de um arquivo MP3, utilizaremos os métodos getBytesLoaded() e getBytesTotal(), e o evento onLoad.

Para testar o código abaixo, crie uma barra, dimensões de 200×5, converta-a em um movieClip e a alinhe a esquerda, a instância desta barra deve ser barraCarregados. Crie também uma caixa de texto dinâmica de instância de caixaCarregados.

function carregarSom(){
	var carregado:Number = meuSom.getBytesLoaded();
	var total:Number = meuSom.getBytesTotal();
	var porcent:Number = Math.floor((carregado/total)*100);
	barraCarregados._xscale = porcent;
	caixaCarregados.text = porcent + " %";
}
interval = setInterval(carregarSom, 100);
meuSom.onLoad = function(){clearInterval(interval);}

No código acima, primeiramente foram criadas duas variáveis, carregado e total, para armazenarem respectivamente o valor carregado e o total do arquivo. A variável porcent, responsável por armazenar a porcentagem carregada, o valor carregado dividido pelo valor total, multiplicado por 100, para obtermos uma escala de 0 a 100, para que fosse exibido valores inteiros, foi utilizado o método floor, da classe Math. Os valores da variável porcent foram atribuídos a escala da barra, e adicionados a caixa de texto dinâmica.

Todo o código está inserido na função carregarSom, para que desta forma, pudéssemos verificar e atualizar os valores a cada um décimo de segundo, por meio da função setInterval(). Foi utilizado também o evento onLoad, para que assim que o carregamento se conclua, o setInterval() seja finalizado.

Para testar pressione as teclas “CTRL + Enter”, no menu “View > Download Setting”, selecione a velocidade da conexão e em seguida, menu “View > Simulate Download”.

Botões Stop, Play e Pause

Crie três botões no palco e os instancie de btnStop, btnPlay e btnPause.

var meuSom:Sound = new Sound();
meuSom.attachSound("libSound");
btnStop.onRelease = function(){meuSom.stop();}
btnPlay.onRelease = function(){meuSom.start();}

No código acima foi utilizado os métodos stop() para parar o áudio, e o método start() para iniciar o áudio.

Para criar o botão para pausar o som, a classe Sound não dispõe de um método do tipo “pause”, portanto para se pausar um arquivo de áudio, é necessário resgatar o valor da posição atual do som e armazená-la em uma variável, quando o botão play for acionado, é feita uma verificação para definir se o áudio começará do início ou da posição em que foi pausado.

Para resgatar o valor da posição atual do áudio antes que este seja parado, utilizaremos a propriedade position, que retorna o valor em milissegundos da posição atual do áudio.

var meuSom:Sound = new Sound();
meuSom.attachSound("libSound");
btnStop.onRelease = function(){
	valorPause = 0;
	meuSom.stop();
	}
btnPlay.onRelease = function(){
	if(valorPause != null){meuSom.start(valorPause);}
	else{meuSom.start();}
	}
btnPause.onRelease = function(){
	valorPause = meuSom.position/1000;
	meuSom.stop();
	}

No código do botão pause, quando este for acionado, é criada a variável valorPause, responsável por armazenar a posição em que o som foi pausado, através da propriedade position, além disso o valor foi dividido por 1000, porque o valor vem em milissegundos e precisa-se do valor em segundos.

No botão play foi necessário adicionar uma estrutura condicional para verificar se a variável valorPause é diferente de zero (nulo), para que o som continue de onde foi pausado, caso contrário o áudio é iniciado.

No botão stop foi necessário adicionar uma linha de código, para que caso o botão stop fosse pressionado após o botão pause, o valor da variável valorPause passasse a ser zero, para que na verificação do botão play o áudio comece do início.

Criando controles deslizantes de volume e balanço do som

Controle de balanço

Crie uma pequena bola de 10×10, transforme-a em símbolo (F8), tipo botão, e a instancie de btnBola, em seguida converta (F8) este botão em um movieClip e o instancie de mcBalanco. Desenhe um retângulo de 110×5 e alinhe o mcBalanco a esquerda do retângulo.

O código abaixo adicionará as funcionalidades a barra de balanço.

mcBalanco.top = mcBalanco._y;
mcBalanco.bottom = mcBalanco._y;
mcBalanco.left = mcBalanco._x;
mcBalanco.right = mcBalanco._x + 100;
mcBalanco._x += 50;
 
mcBalanco.btnBola.onPress = function(){
	startDrag(this._parent, false, this._parent.left, this._parent.top, this._parent.right, this._parent.bottom);
	}
mcBalanco.btnBola.onRelease = function(){
	stopDrag();
	var meuBalanco:Number = Math.ceil((this._parent._x - this._parent.left - 50)*2);
	meuSom.setPan(meuBalanco);
	}
mcBalanco.btnBola.onReleaseOutside = mcBalanco.btnBola.onRelease;

Primeiramente foi definido o topo e a base do mcBalanco, que são exatamente a posição deste na vertical, isto fará com que o controle não se mova na vertical, em seguida foi definido o início (left), sendo-a posição inicial do objeto, e o final (right) de 100pixel adiante, por fim, foi definido o valor inicial do controle de 50, desta forma o áudio será distribuído igualmente entre as caixas de som.

Na linha 7 foi definido que quando o botão btnBola for pressionado, a função startDrag(), que nos possibilita mover o botão, seja chamada, a sintaxe do função startDrag() é a seguinte:

startDrag(destino:Object, [lock:Boolean, esquerda:Number, topo:Number, direita:Number, base:Number])
  • destino: a instancia do movieClip para o drag. No exemplo acima this._parent, o pai do botão btnBola, o mcBalanco.
  • lock: valor boolean, true para que o botão a ser arrastado seja centralizado ao ponteiro do mouse, e false para que centralize do local onde foi clicado.
  • esquerda, topo, direita, base: com estes parâmetros pode-se limitar a área em que o botão será arrastado. No exemplo, utilizou-se os valores do movieClip mcBalanco, que foram definidos no início.

Na linha 10, assim que o botão deixar de ser pressionado, é finalizado o drag, através da função stopDrag(), e armazenado na variável meuBalanco a nova posição do botão, subtrai o valor da esquerda do mcBalanco para zerar a partir do ponto da esquerda, até aqui a barra esta de 0 a 100. Mas o balanço do som, vai de -100 a 100, então foi subtraido 50 do resultado, ficando agora de -50 a 50, bastando multiplicar o resultado por 2, para obtermos uma escala de -100 a 100. Este valor é passado ao método setPan(), mas o método aceita apenas valores inteiros, por este motivo o resultado da variável meuBalanco, é passada para o método ceil, da classe Math, que retorna o valor mais próximo e maior ou igual ao número.

Na linha 15, foi utilizado o onReleaseOutside, para caso o botão deixe de ser pressionado com o ponteiro do mouse fora do botão, as mesmas ações definidas para o onRelease, sejam chamadas.

Controle de volume

Com o mesmo código acima, com algumas pequenas alterações, pode-se criar um controle de volume. A modificação mais significativa é alteração do método setPan() por setVolume(). Ao evento onRelease foi adicionado uma linha que atualiza uma caixa de texto dinâmica, instanciada de volumeText, com o volume atual, para isto foi utilizado o método getVolume(), o valor é de 0 a 100.

Duplique o controle criado para o balaço, e troque a instancia de mcBalanco para mcVolume. Crie uma caixa de texto dinâmica com a instância de volumeText.

mcVolume.top = mcVolume._y;
mcVolume.bottom = mcVolume._y;
mcVolume.left = mcVolume._x;
mcVolume.right = mcVolume._x + 100;
mcVolume._x += 100;
volumeText.text = meuSom.getVolume();
 
mcVolume.btnBola.onPress = function(){
	startDrag(this._parent, false, this._parent.left, this._parent.top, this._parent.right, this._parent.bottom);
	}
 
mcVolume.btnBola.onRelease = function(){
	stopDrag();
	var meuVolume:Number = Math.ceil(this._parent._x - this._parent.left);
	meuSom.setVolume(meuVolume);
	volumeText.text = meuSom.getVolume();
	}
mcVolume.btnBola.onReleaseOutside = mcVolume.btnBola.onRelease;

Exibindo a duração total e a contagem progressiva

Para exibir a duração total, é utilizada a propriedade duration, e para exibir o status progressivo, é utilizada a propriedade position.

Exibindo a duração total

A propriedade duration nos retorna o valor em milissegundos, portanto, a primeira tarefa a ser realizada é passar os valores para segundos.

Para começar crie uma caixa de texto dinâmico, e o instancie como duracaoText.

function tempo(metodo:String, caixaTexto:String){
	var tempo:Number = meuSom[metodo]/1000;
	var minutos:Number = Math.floor(tempo/60);
		minutos = minutos<10 ? "0"+minutos : minutos;
	var segundos:Number = Math.floor(tempo%60);
		segundos = segundos<10 ? "0"+segundos : segundos;
	_root[caixaTexto].text = minutos + ":" + segundos;
	}
tempo("duration","duracaoText");

Primeiramente o código foi adicionado dentro de uma função, pois o código para exibir a contagem progressiva é o mesmo, alterando, apenas dois parâmetros, a propriedade para position ou duration, e a variável da caixa de texto que receberá os valores.

Sabendo que 1 segundo é igual a 1000 milissegundos, então basta dividir o valor por 1000 para se obter o valor em segundos, esta é a variável tempo. Para o minuto foi dividido o tempo total por 60, para segundos foram resgatados o resto da divisão(%) do tempo total dividido por 60. Os valores foram arredondados pelo método floor, da classe Math.

Além disto, para uma melhor apresentação das informações, tanto a variável minutos, quanto a variável segundos, foram colocadas diante de uma condição, para que quando o valor for menor que 10, seja adicionado um zero a esquerda. Para que se entenda melhor, a sintaxe da condicional usada é a seguinte:

condição : respota 1 (true) ? respota 2 (false);

Exibindo a contagem progressiva

interval = setInterval(tempo, 1000, "position","posicaoText");
meuSom.onSoundComplete = function(){clearInterval(interval);}

Como foi já dito acima, o código é praticamente o mesmo, o código acima utiliza a função tempo, criado no exemplo acima para exibir a duração total do som.

a principal diferença aqui, além das citas acima, é que a função foi chamada pelo setInterval(), para que o valor fosse atualizado a cada 1 segundo. Também foi utilizado o evento onSoundComplete, para que assim que o som chegue ao final o setInterval seja finalizado.

One Response to “Manipulando MP3s com a classe Sound”

  1. Sergio Beatle Says:

    Excelente!!!, nunca encontrei tutoriais tão “entendiveis” como aqui, Parabens!

Leave a Reply