Загрузка внешних звуковых файлов

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Каждый экземпляр класса Sound предназначен для загрузки и запуска воспроизведения определенного аудиоресурса. Приложение не может повторно использовать объект Sound для загрузки другого звука. Если приложению требуется загрузить новый ресурс, то нужно создать новый объект Sound.

Если загружается небольшой звуковой файл, например звук щелчка для кнопки, приложение может создать новый объект Sound, чтобы он автоматически загрузил аудиофайл, как показано ниже.

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

Конструктор Sound() принимает в качестве первого параметра объект URLRequest. Когда передается значение для параметра URLRequest, новый объект Sound автоматически начинает загрузку указанного аудиоресурса.

Во всех случаях, кроме самых простых, приложение должно контролировать прогресс загрузки и отслеживать ошибки во время ее выполнения. Например, если звук щелчка имеет достаточно большой размер, он может не загрузиться полностью к тому моменту, как пользователь нажмет кнопку, запускающую воспроизведение звука. При попытке воспроизвести незагруженный звук может возникнуть ошибка выполнения. Во избежание таких ошибок следует дождаться завершения загрузки звука, прежде чем разрешать пользователям выполнять действия, в результате которых может начаться воспроизведение звуков.

Объект Sound отправляет несколько разных событий в процессе загрузки звука. Приложение может прослушивать эти события, чтобы отслеживать прогресс загрузки и разрешать воспроизведение звука только после полной загрузки. В следующей таблице перечислены события, которые может отправлять объект Sound.

Событие

Описание

open (Event.OPEN)

Отправляется непосредственно перед началом загрузки звука.

progress (ProgressEvent.PROGRESS)

Отправляется периодически в ходе загрузки звука по мере получения данных из файла или потока.

id3 (Event.ID3)

Отправляется, когда для звука в формате mp3 доступны данные ID3.

complete (Event.COMPLETE)

Отправляется после завершения загрузки всех данных аудиоресурса.

ioError (IOErrorEvent.IO_ERROR)

Отправляется, когда не удается найти аудиофайл или когда процесс загрузки прерывается до получения всех аудиоданных.

Следующий код демонстрирует воспроизведение звука после завершения его загрузки.

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

Сначала код создает новый объект Sound, не передавая исходного значения для параметра URLRequest. Затем прослушивается событие Event.COMPLETE, которое отправляется объектом Sound и запускает выполнение метода onSoundLoaded() после завершения загрузки всех данных звука. Далее вызывается метод Sound.load() с новым значением параметра URLRequest для аудиофайла.

Метод onSoundLoaded() выполняется после завершения загрузки звука. Свойство target объекта Event является ссылкой на объект Sound. После этого вызывается метод play() объекта Sound, который запускает воспроизведение.

Отслеживание процесса загрузки звука

Звуковые файлы могут быть очень большими и требовать много времени на загрузку. Хотя проигрыватели Flash Player и AIR позволяют начинать воспроизведение звуков еще до завершения загрузки, возможно, пользователю нужно сообщить, сколько аудиоданных уже загружено и сколько из них уже воспроизведено.

Класс Sound отправляет два события, с помощью которых можно относительно просто отображать прогресс загрузки звука: ProgressEvent.PROGRESS и Event.COMPLETE. В следующем примере демонстрируется использование этих событий для отображения сведений о прогрессе загрузки звука.

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

Этот код сначала создает объект Sound, а затем добавляет прослушиватели для его событий ProgressEvent.PROGRESS и Event.COMPLETE. После вызова метода Sound.load() и получения первых данных аудиофайла отправляется событие ProgressEvent.PROGRESS, которое запускает метод onSoundLoadProgress().

Процент загруженных звуковых данных равен значению свойства bytesLoaded объекта ProgressEvent, деленному на значение свойства bytesTotal. Те же свойства bytesLoaded и bytesTotal есть и у объекта Sound. Приведенный выше пример наглядно показывает сообщения о ходе загрузки звука, но значения свойств bytesLoaded и bytesTotal можно легко использовать для обновления компонентов хода выполнения, таких как компоненты, доступные в среде Adobe Flex или инструменте разработки Adobe Flash.

Этот пример также демонстрирует, как приложение может распознавать ошибки при загрузке аудиофайлов и реагировать на них. Например, если не удается найти звуковой файл с заданным именем, объект Sound отправляет событие Event.IO_ERROR. В предыдущем коде выполняется метод onIOError(), который отображает краткое сообщение в случае возникновения ошибки.