Riproduzione dell'audio

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

La riproduzione dell'audio caricato può consistere semplicemente nella chiamata al metodo Sound.play() di un oggetto Sound, come indicato di seguito:

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

Quando riproducete l'audio mediante ActionScript 3.0, potete effettuare le operazioni seguenti:

  • Riprodurre un file audio da una posizione iniziale specifica

  • Sospendere la riproduzione di un file audio e riprenderla dalla stessa posizione

  • Sapere esattamente quando termina la riproduzione di un file audio

  • Tenere traccia dell'avanzamento del caricamento di un file audio

  • Modificare il volume o la panoramica dell'audio durante la riproduzione

Per eseguire queste operazioni durante la riproduzione, utilizzate le classi SoundChannel, SoundMixer e SoundTransform.

La classe SoundChannel controlla la riproduzione di un singolo suono. La proprietà SoundChannel.position può essere considerata una sorta di indicatore di riproduzione, che specifica il punto all'interno dei dati audio che sono attualmente in corso di riproduzione.

Quando un'applicazione chiama il metodo Sound.play() , viene creata una nuova istanza SoundChannel per controllare la riproduzione.

L'applicazione può riprodurre un suono da una posizione iniziale specifica passando tale posizione (sotto forma di millisecondi) come parametro startTime del metodo Sound.play() . Inoltre, può specificare un numero prefissato di ripetizioni del suono in rapida successione passando un valore numerico nel parametro loops del metodo Sound.play() .

Quando viene chiamato il metodo Sound.play() utilizzando sia un parametro startTime che un parametro loops , l'audio viene riprodotto ripetutamente ogni volta dallo stesso punto iniziale, come mostrato nel codice seguente:

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

In questo esempio, l'audio viene riprodotto da un punto che si trova un secondo dopo l'inizio del suono, per tre volte in successione.

Sospensione e ripresa della riproduzione dell'audio

Se l'applicazione è destinata a riprodurre audio di una certa durata (ad esempio, canzoni o podcast), è consigliabile fornire agli utenti la possibilità di sospendere e riprendere la riproduzione. In ActionScript, un suono non può essere letteralmente sospeso: può solo essere interrotto. Tuttavia, un suono può essere riprodotto a partire da qualunque punto. È possibile registrare la posizione del suono nel momento in cui viene interrotto e successivamente riavviare la riproduzione da tale posizione.

Supponete di disporre di un codice che carica e riproduce un file audio nel modo seguente:

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

Durante la riproduzione dell'audio, la proprietà SoundChannel.position indica il punto all'interno del file audio che è in corso di riproduzione. L'applicazione può memorizzare il valore della posizione prima di interrompere la riproduzione dell'audio, come mostrato di seguito:

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

Per riprendere la riproduzione dell'audio, passate il valore della posizione precedentemente memorizzato per riavviare l'audio dallo stesso punto in cui è stato interrotto.

channel = snd.play(pausePosition);

Monitoraggio della riproduzione

Talvolta è necessario che l'applicazione sappia quando si interrompe la riproduzione di un suono per poter avviare la riproduzione di un altro suono o per eliminare le risorse utilizzate durante la riproduzione precedente. La classe SoundChannel invia un evento Event.SOUND_COMPLETE quando termina la riproduzione del relativo audio. L'applicazione può intercettare questo evento ed eseguire le operazioni appropriate, come mostrato di seguito:

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."); 
}

La classe SoundChannel non invia eventi progress durante la riproduzione. Per generare un rapporto sull'avanzamento della riproduzione, l'applicazione può impostare un proprio meccanismo di gestione temporale e tenere traccia della posizione dell'indicatore di riproduzione dell'audio.

Per calcolare la percentuale di audio che è stata riprodotta, potete dividere il valore della proprietà SoundChannel.position per la lunghezza dei dati audio in corso di riproduzione:

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

Tuttavia, questo codice riporta delle percentuali di riproduzione accurate solo se i dati audio sono stati interamente caricati prima dell'inizio della riproduzione. La proprietà Sound.length mostra le dimensioni dei dati audio in corso di caricamento, non le dimensioni finali dell'intero file audio. Per tenere traccia dell'avanzamento della riproduzione di un file audio in streaming che è ancora in fase di caricamento, l'applicazione deve stimare le dimensioni finali dell'intero file audio e utilizzare tale valore nei calcoli. Potete stimare la lunghezza finale dei dati audio mediante le proprietà bytesLoaded e bytesTotal dell'oggetto Sound, come indicato di seguito:

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

Il codice seguente carica un file audio di dimensioni maggiori e utilizza l'evento Event.ENTER_FRAME come meccanismo di gestione temporale per la visualizzazione dell'avanzamento della riproduzione. Genera un report periodico della percentuale di riproduzione, che viene calcolata dividendo il valore della posizione corrente per la lunghezza totale del file audio:

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); 
}

Una volta avviato il caricamento dei dati audio, questo codice chiama il metodo snd.play() e memorizza l'oggetto SoundChannel risultante nella variabile channel . Quindi, aggiunge un listener di eventi all'applicazione principale per l'evento Event.ENTER_FRAME e un altro listener di eventi all'oggetto SoundChannel per l'evento Event.SOUND_COMPLETE che si verifica quando la riproduzione è completata.

Ogni volta che l'applicazione raggiunge un nuovo fotogramma della propria animazione, viene chiamato il metodo onEnterFrame() . Il metodo onEnterFrame() stima la lunghezza totale del file audio in base alla quantità di dati che sono già stati caricati, quindi calcola e visualizza la percentuale di riproduzione corrente.

Quando è stato riprodotto l'intero file audio, viene eseguito il metodo onPlaybackComplete() e viene rimosso il listener di eventi per l'evento Event.ENTER_FRAME in modo che non tenti di visualizzare gli aggiornamenti sull'avanzamento dopo che la riproduzione è terminata.

L'evento Event.ENTER_FRAME può essere inviato molte volte al secondo. In determinate circostanze, non è necessario visualizzare l'avanzamento della riproduzione con tale frequenza. In questo caso, l'applicazione può impostare il proprio meccanismo di gestione temporale mediante la classe flash.util.Timer (vedete Operazioni con data e ora ).

Interruzione dell'audio in streaming

Nel processo di riproduzione dell'audio in streaming (cioè, per i file audio che sono ancora in fase di caricamento durante la riproduzione) si verifica una circostanza particolare. Quando l'applicazione chiama il metodo SoundChannel.stop() su un'istanza SoundChannel che sta riproducendo un file audio in streaming, la riproduzione si arresta per un fotogramma, quindi, in corrispondenza del fotogramma successivo, ricomincia dall'inizio del file audio. Questa situazione si verifica perché il processo di caricamento è ancora in corso. Per interrompere sia il caricamento che la riproduzione di un file audio in streaming, chiamate il metodo Sound.close() .