Carga de archivos de sonido externos

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Cada instancia de la clase Sound existe para cargar y activar la reproducción de un recurso de sonido específico. Una aplicación no puede reutilizar un objeto Sound para cargar más de un sonido. Para cargar un nuevo recurso de sonido, debe crear otro objeto Sound.

Si se carga un archivo de sonido pequeño, como un sonido de clic que se asociará a un botón, la aplicación puede crear un nuevo objeto Sound y cargar automáticamente el archivo de sonido, tal como se muestra a continuación:

var req:URLRequest = new URLRequest("click.mp3"); 
var s:Sound = new Sound(req);

El constructor Sound() acepta un objeto URLRequest como primer parámetro. Cuando se proporciona un valor del parámetro URLRequest, el nuevo objeto Sound empieza a cargar automáticamente el recurso de sonido especificado.

En todos los casos, excepto en los más sencillos, la aplicación debe prestar atención al progreso de carga del sonido y detectar los posibles errores. Por ejemplo, si el sonido del clic tiene un tamaño bastante grande, es posible que no esté completamente cargado cuando el usuario haga clic en el botón que activa dicho sonido. Si se intenta reproducir un sonido no cargado, puede producirse un error en tiempo de ejecución. Resulta más seguro esperar a que se cargue totalmente el sonido antes de permitir que los usuarios realicen acciones que puedan iniciar la reproducción de sonidos.

El objeto Sound distribuye varios eventos distintos durante el proceso de carga del sonido. La aplicación puede detectar estos eventos para hacer un seguimiento del progreso de carga y asegurarse de que el sonido se carga por completo antes de reproducirse. En la tabla siguiente se enumeran los eventos que puede distribuir un objeto Sound.

Evento

Descripción

open ( Event.OPEN )

Se distribuye antes de que se inicie la operación de carga del sonido.

progress ( ProgressEvent.PROGRESS )

Se distribuye periódicamente durante el proceso de carga del sonido cuando se reciben datos del archivo o del flujo.

id3 ( Event.ID3 )

Se distribuye cuando hay datos ID3 disponibles para un sonido MP3.

complete ( Event.COMPLETE )

Se distribuye cuando se han cargado todos los datos del recurso de sonido.

ioError ( IOErrorEvent.IO_ERROR )

Se distribuye cuando no se puede encontrar un archivo de sonido, o bien cuando el proceso de carga se interrumpe antes de que se puedan recibir todos los datos de sonido.

El código siguiente ilustra la manera de reproducir un sonido una vez cargado:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(Event.COMPLETE, onSoundLoaded); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}

En primer lugar, el código de ejemplo crea un nuevo objeto Sound sin asignarle un valor inicial para el parámetro URLRequest. A continuación, detecta el evento Event.COMPLETE del objeto Sound, que provoca la ejecución del método onSoundLoaded() cuando se cargan todos los datos de sonido. Después, llama al método Sound.load() con un nuevo valor URLRequest para el archivo de sonido.

El método onSoundLoaded() se ejecuta cuando se completa la carga de sonido. La propiedad target del objeto Event es una referencia al objeto Sound. La llamada al método play() del objeto Sound inicia la reproducción de sonido.

Supervisión del proceso de carga del sonido

Los archivos de sonido pueden tener un tamaño muy grande y tardar mucho tiempo en cargarse. Aunque Flash Player y AIR permiten que la aplicación reproduzca sonidos incluso antes de que se carguen completamente, es posible que se desee proporcionar una indicación al usuario de la cantidad de datos de sonido que se han cargado, así como de la cantidad de sonido que ya se ha reproducido.

La clase Sound distribuye dos eventos que hacen relativamente fácil la visualización del proceso de carga de un sonido: ProgressEvent.PROGRESS y Event.COMPLETE . En el ejemplo siguiente se muestra cómo utilizar estos eventos para mostrar la información de progreso del sonido que se carga:

import flash.events.Event; 
import flash.events.ProgressEvent; 
import flash.media.Sound; 
import flash.net.URLRequest; 
 
var s:Sound = new Sound(); 
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); 
s.addEventListener(Event.COMPLETE, onLoadComplete); 
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onLoadProgress(event:ProgressEvent):void 
{ 
    var loadedPct:uint =         Math.round(100 * (event.bytesLoaded / event.bytesTotal)); 
    trace("The sound is " + loadedPct + "% loaded."); 
} 
 
function onLoadComplete(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
} 
function onIOError(event:IOErrorEvent) 
{ 
    trace("The sound could not be loaded: " + event.text); 
}

En este código se crea primero un objeto Sound y luego se añaden detectores a dicho objeto para los eventos ProgressEvent.PROGRESS y Event.COMPLETE . Una vez que el método Sound.load() se ha llamado y que el archivo de sonido recibe los primeros datos, se produce un evento ProgressEvent.PROGRESS , que activa el método onSoundLoadProgress() .

El porcentaje de datos de sonido cargados equivale al valor de la propiedad bytesLoaded del objeto ProgressEvent dividido entre el valor de la propiedad bytesTotal . Las mismas propiedades bytesLoaded y bytesTotal también están disponibles en el objeto Sound. El ejemplo anterior muestra mensajes relativos al progreso de carga del sonido, aunque se pueden utilizar fácilmente los valores bytesLoaded y bytesTotal para actualizar los componentes de barra de progreso, como los que se incluyen en la arquitectura Adobe Flex o en la herramienta de edición Adobe Flash.

En este ejemplo también se muestra la forma en que una aplicación puede reconocer un error y responder a él durante la carga de archivos de sonido. Por ejemplo, si no se puede encontrar un archivo de sonido con un nombre determinado, el objeto Sound distribuye un evento Event.IO_ERROR . En el código anterior, se ejecuta el método onIOError() , que muestra un breve mensaje de error cuando se produce un error.