Reprodução de sons

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

A reprodução de um som carregado pode ser tão simples quanto chamar o método Sound.play() para um objeto Sound, da seguinte maneira:

var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); 
snd.play();

Ao reproduzir sons usando o ActionScript 3.0, é possível executar as seguintes operações:

  • Reproduzir um som a partir de uma posição inicial específica.

  • Pausar um som e reiniciar a reprodução a partir da mesma posição mais tarde.

  • Saber exatamente quando a reprodução de um som é concluída.

  • Rastrear o progresso da reprodução de um som.

  • Alterar o volume ou a panorâmica enquanto o som é reproduzido.

Para executar essas operações durante a reprodução, use as classes SoundChannel, SoundMixer e SoundTransform.

A classe SoundChannel controle a reprodução de um único som. A propriedade SoundChannel.position pode ser considerada como um indicador de reprodução, indicando o ponto atual nos dados do som que está sendo reproduzido.

Quando um aplicativo chama o método Sound.play() , uma nova ocorrência da classe SoundChannel é criada para controlar a reprodução.

O aplicativo pode reproduzir um som a partir de uma posição inicial específica passando aquela posição, em termos de milissegundos, como o parâmetro startTime do método Sound.play() . Ele também pode especificar o número de vezes para repetição do som em sucessão rápida passando um valor numérico no parâmetro loops do método Sound.play() .

Quando o método Sound.play() é chamado com um parâmetro startTime e um parâmetro loops , o som é reproduzido repetidamente a partir do mesmo ponto inicial, conforme mostrado no código a seguir:

var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3")); 
snd.play(1000, 3);

Neste exemplo, o som é reproduzido a partir de um ponto um segundo após o início do som, três vezes em sucessão.

Pausa e reinício de um som

Se o aplicativo reproduzir sons longos, como canções ou podcasts, talvez você queira permitir que os usuários pausem e reiniciem a reprodução desses sons. Um som não pode ser pausado literalmente durante a reprodução no ActionScript. Ele pode apenas ser interrompido. No entanto um som pode ser reproduzido a partir de um ponto qualquer. É possível registrar a posição do som na hora em que foi interrompido e, em seguida, reproduzir o som mais tarde a partir daquela posição.

Por exemplo, suponha que o código carrega e reproduz um arquivo de som como este:

var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); 
var channel:SoundChannel = snd.play();

Enquanto o som é reproduzido, a propriedade SoundChannel.position indica o ponto no arquivo de som que está em reprodução no momento. O aplicativo pode armazenar o valor da posição antes de interromper a reprodução do som, da seguinte maneira:

var pausePosition:int = channel.position; 
channel.stop();

Para reiniciar a reprodução do som, passe o valor da posição armazenado anteriormente para reiniciar o som a partir do mesmo ponto em que foi interrompido anteriormente.

channel = snd.play(pausePosition);

Monitoramento da reprodução

O aplicativo talvez queira saber quando a reprodução de um som é interrompida para que possa iniciar a reprodução de outro som ou limpar alguns recursos usados durante a reprodução anterior. A classe SoundChannel despacha um evento Event.SOUND_COMPLETE quando a reprodução do som é concluída. O aplicativo pode ouvir esse evento e tomar a ação apropriada, conforme mostrado a seguir:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new URLRequest("smallSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel = snd.play(); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
public function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
}

A classe SoundChannel não despacha eventos de progresso durante a reprodução. Para relatar o progresso da reprodução, o aplicativo pode configurar seu próprio mecanismo de controle de tempo e rastrear a posição do indicador de reprodução do som.

Para calcular qual porcentagem de um som foi reproduzida, é possível dividir o valor da propriedade SoundChannel.position pelo comprimento dos dados do som que está sendo reproduzido:

var playbackPercent:uint = 100 * (channel.position / snd.length);

No entanto esse código relatará porcentagens exatas da reprodução apenas se os dados do som foram carregados completamente antes do início da reprodução. A propriedade Sound.length mostra o tamanho dos dados do som que estão sendo carregados no momento, não o tamanho eventual do arquivo de som inteiro. Para rastrear o progresso da reprodução de um fluxo de som que ainda está sendo carregado, o aplicativo deve estimar o tamanho eventual do arquivo de som inteiro e usar esse valor em seus cálculos. É possível estimar o comprimento eventual dos dados do som usando as propriedades bytesLoaded e bytesTotal do objeto Sound, da seguinte maneira:

var estimatedLength:int =  
    Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
var playbackPercent:uint = 100 * (channel.position / estimatedLength);

O código a seguir carrega um arquivo de som maior e usa o evento Event.ENTER_FRAME como seu mecanismo de controle de tempo para mostrar o progresso da reprodução. Ele relata periodicamente a porcentagem de reprodução que é calculada como o valor da posição inicial dividido pelo comprimento total dos dados do som:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var snd:Sound = new Sound(); 
var req:URLRequest = new  
    URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3"); 
snd.load(req); 
 
var channel:SoundChannel; 
channel = snd.play(); 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 
 
function onEnterFrame(event:Event):void 
{ 
    var estimatedLength:int =  
        Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal)); 
    var playbackPercent:uint =  
        Math.round(100 * (channel.position / estimatedLength)); 
    trace("Sound playback is " + playbackPercent + "% complete."); 
} 
 
function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
    removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
}

Após o início do carregamento dos dados do som, esse código chama o método snd.play() e armazena o objeto SoundChannel resultante na variável channel . Em seguida, ele adiciona um ouvinte de eventos ao aplicativo principal para o evento Event.ENTER_FRAME e outro ouvinte de eventos ao objeto SoundChannel para o evento Event.SOUND_COMPLETE que ocorre quando a reprodução é concluída.

A cada vez que o aplicativo atinge um novo quadro em sua animação, o método onEnterFrame() é chamado. O método onEnterFrame() estima o comprimento total do arquivo de som com base na quantidade de dados que já foi carregada e, em seguida, calcula e exibe a porcentagem de reprodução atual.

Quando todo o som foi reproduzido, o método onPlaybackComplete() é executado, removendo o ouvinte do evento Event.ENTER_FRAME de forma que ele não tente exibir atualizações do progresso após a conclusão da reprodução.

O evento Event.ENTER_FRAME pode ser despachado muitas vezes por segundo. Em alguns casos, não é conveniente exibir o progresso da reprodução com tanta frequência. Nesses casos, o aplicativo pode configurar seu próprio mecanismo de controle do tempo usando a classe flash.util.Timer. Consulte Trabalho com datas e horas .

Interrupção de fluxos de som

Há uma peculiaridade no processo de reprodução de sons que estão sendo transmitidos em fluxo, isto é, sons que ainda estão sendo carregados enquanto estão sendo reproduzidos. Quando o aplicativo chama o método SoundChannel.stop() em uma ocorrência de SoundChannel que está reproduzindo um fluxo de som, a reprodução do som para em um quadro e, em seguida, no próximo quadro, ela reinicia a partir do início do som. Isso ocorre porque o processo de carregamento do som ainda está em execução. Para interromper o carregamento e a reprodução de um fluxo de som, chame a o método Sound.close() .