Импортирование внешних МР3-файлов

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

Трудно спорить с тем, что хорошее озвучивание делает ресурс более привлекательным. Однако нужно не забывать и о том, что даже очень сжатые МР3-файлы весьма «тяжеловесные». Поэтому присутствие музыки на сайте может увеличить его размер в несколько раз. А так как звуковое оформление для многих пользователей является второстепенной деталью, не стоит делать его загрузку обязательной.

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

Подобные внешние библиотеки мелодий разработчики активно создавали уже во времена Flash 5.


Тогда для этого приходилось помещать каждый звук в отдельный фильм, который затем импортировался при помощи метода loadMovie(). Подобный подход имеет определенные преимущества, из-за которых его применяют даже сейчас (например, для клипа проще создать качественный пред загрузчик, чем для звука). Но техничным его назвать вряд ли можно, так как звуками, которые импортированы внутри SWF-файла, не так уж просто манипулировать. Главное, обновить подобную библиотеку звуков сможет лишь пользователь, владеющий Flash, что чрезвычайно осложняет поддержку сайта. Поэтому во Flash MX в класс Sound был введен новый метод loadSound(), который позволяет импортировать МР3-файлы напрямую, не помещая предварительно их в фильмы. Были добавлены вспомогательные методы getBytesLoaded() и getBytesTotal(), а также событие onLoad.

Метод loadSound()
Метод loadSound() служит для импортирования МР3-звуков с удаленного сервера в процессе проигрывания фильма. Данный метод имеет следующий синтаксис:

snd.loadSound(URL, isStreaming); где:

• snd — объект класса Sound, с которым должен быть связан загруженный звук. Звуки, импортированные посредством метода loadSound(), во многом схожи со звуками, присоединенными к клипу при помощи метода attachSound().


Поэтому очень многое из того, что мы говорили о последних в предыдущем разделе, может быть автоматически перенесено на звуки, загруженные методом loadSound(). Особенно важно отметить, что с одним объектом класса Sound может быть связан только один динамически присоединенный звук, независимо от того, был использован для его импорта метод loadSound() или он был «перетянут» из библиотеки методом attachSound();

• url — строка с адресом МР3-файла, подлежащего импорту. Адрес может быть как абсолютным (в этом случае необходимо обязательно указывать протокол), так и относительным. Ограничений на расположение импортируемых звуков политика сетевой безопасности Flash 7 не накладывает (в отличие от клипов или текстовых данных). По умолчанию вы можете загрузить файл только из той же директории сервера, откуда поступил сам SWF-фильм.

Для загрузки МР3-файла по умолчанию используется протокол HTTP. Поэтому абсолютный адрес необходимо начинать с префикса http://. Но если фильм будет проигрываться в браузере, то можно применить и протокол FTP. В этом случае ссылка должна быть начата префиксом ftp://. Автономный проигрыватель (в том числе и в режиме тестирования среды разработки) протокол FTP не поддерживает;

• ioStreaming — параметр, определяющий тип загрузки звука.


Возможны два варианта:

1. Непотоковая загрузка (isStreaming=faise). В этом режиме Flash-плейер требует, чтобы звук был полностью загружен, прежде чем начнется его воспроизведение. Если вы не уверены, что все ваши потенциальные посетители имеют достаточно стабильный Интернет-канал или звук может понадобиться воспроизводить несколько раз, то всегда лучше применять именно этот тип загрузки. В идеале же (который сложно представить в России, но довольно реально, если проект создается для заказчиков из США) непотоковая загрузка должна использоваться для закачки небольших звуков, а потоковая — для закачки объемных музыкальных фрагментов (нельзя заставлять пользователя слишком долго ждать).

Звук, закачанный в непотоковом режиме, ведет себя точно так же, как звук, динамически присоединенный при помощи метода attachSound(). To есть он сохраняется в памяти до тех пор, пока объект класса Sound не будет удален или к нему повторно не будет применен метод loadSound() или attachSound(). Такой звук можно проигрывать любое количество раз, начиная воспроизведение с любого фрагмента (в отличие отзвука, загруженного в потоковом режиме). Вообще же к нему может быть применен любой инструмент класса Sound.

2. Потоковая загрузка (isStreaming=true). Особенностью этого режима является то, что воспроизведение звука начинается автоматически еще до окончания его закачки. По умолчанию проигрывание запускается, когда будет закачано 5 секунд звука. Потоковая загрузка имеет преимущество при импорте больших звуков, таких как полноценные песни. При ее использовании посетителю ресурса не приходится ждать окончания загрузки, что делает сайт более привлекательным для него. Однако у потоковой загрузки имеются и очень серьезные недостатки. Так, чтобы при проигрывании звука не возникало пауз, обмен данными с сервером должен происходить с достаточной скоростью и высокой стабильностью. Естественно, что это условие может быть соблюдено далеко не всегда. Дополнительный минус потоковой загрузки в том, что при этом можно использовать МР3-файлы лишь с очень низким битрейтом (8-24 Кбит/с), а соответственно, с невысоким качеством звучания.

Теоретически МР3-файл, загружаемый в потоковом режиме, может быть бесконечно большого размера (например, это может быть МР3-поток сетевого радио). Поэтому способ хранения в памяти потокового аудио радикально отличается оттого, как сохраняются mp3-файлы, импортированные в непотоковом режиме. Буферизуется лишь не проигранная часть закачанного звука. Данные же, соответствующие уже воспроизведенному звуковому фрагменту, тут же выгружаются из памяти. Это означает, что нельзя прослушать музыкальный фрагмент в потоковом режиме, а затем дать команду прокрутить его повторно с произвольного фрагмента при помощи метода start(). В лучшем случае такая команда вызовет загрузку потокового звука заново.

Возможности программного управления звуками, импортируемыми в потоковом режиме, скромнее, чем закачанными в обычном режиме. Их нельзя повторно воспроизводить, по отношению к ним бессмысленно использовать свойства duration и position, а также методы getBytesLoaded() и getBytesTotal(). Если остановить проигрывание потокового звука при помощи метода stop(), то его загрузка все равно продолжится. Начать же его воспроизведение заново будет нельзя (то есть большой объем данных закачается впустую). Кстати, прервать начатый импорт средствами ActionScript практически невозможно. Это серьезная проблема, из-за которой нужно чрезвычайно осторожно вводить в проект элементы, требующие загрузки больших объемов данных.

Несмотря на использование для их обозначения одинакового прилагательного, между потоковыми звуками и звуком, загруженным при помощи метода loadSound() B потоковом режиме, мало сходства. Но кое-что общее все же есть.

Потоковый звук разбивается на небольшие пакеты, которые хранятся в связке с кадрами, и звук, импортируемый в потоковом режиме, также разделяется на маленькие фрагменты, которые удаляются из памяти после проигрывания. Однако первый зависит от состояния временной диаграммы, а второй — нет. Также их объединяет то, что по умолчанию для того, чтобы плейер начал воспроизведение (с «нуля» или после паузы, возникшей из-за недостаточной скорости Интернет-соединения), должно быть закачано не менее 5 секунд звука. Это стандартное время буферизации, которое можно изменить, используя глобальное свойство _soundbuftime.

Увеличить время буферизации стоит, чтобы сделать проигрывание звука менее зависящим от стабильности Интернет-соединения. Если в «запасе» имеется несколько десятков секунд звука, то временная пауза в обмене данными вполне может быть пройдена без остановки звучания. Например, чтобы время буферизации было равно минуте, нужно набрать
_soundbuftime=60;

Звуки, загружаемые Flash-плейером как в обычном, так и в потоковом режиме, кэшируются браузером. Это означает, что повторный импорт звука может потребовать гораздо меньше времени, чем первый. Впрочем, рассчитывать на эту особенность не стоит, так как, например, браузер может быть настроен таким образом, что все временные файлы будут удаляться по окончании работы.

Завершая обсуждение метода loadSound(), приведем интересный пример его использования. В Сети имеется немало радиостанций, которые вещают в формате МР3-потока. Еще больше сайтов, которые просто транслируют таким образом музыку. Зная это, вы можете создать своего рода сетевой радиоприемник. Так, набрав следующие две строки, вы сможете послушать радиостанцию «Эхо Европы»:

var sound:Sound=new Sound(this);
sound.loadSound("http://harms.mtu.ru:9000/", true);

Отслеживание окончания загрузки. Событие onLoad
Событие onLoad класса Sound аналогично одноименному событию класса MovieClip. Оно происходит по завершении загрузки МР3-файла методом loadSound() независимо оттого, потоковый или обычный режим закачки применялся. В зависимости от успешности импортирования звука обработчику onLoad передается определенный параметр: если загрузка была выполнена, то true, если же по какой-то причине ее провести не удалось (скорее всего, был задан неверный адрес или не ответил сервер), то в качестве аргумента передается false.

Для примера приведем код, который начинает воспроизведение звука, если импортирование прошло успешно, и выводит сообщение о сбое загрузки, если в качестве параметра обработчику onLoad поступило false:

var sound:Sound=new Sound(this);
sound.loadSound("music.mp3", false};
sound.onLoad=function(succ:Boolean):Void {
if (succ) {
sound.start();
} else {
trace("Импорт МР3-файла не может быть проведен");
}
};

Создание предзагрузчиков для импортируемых звуков
Хорошо проработанный интерфейс любого сетевого Flash-проекта подразумевает, что пользователь должен быть в курсе всех происходящих процессов. Если импортируется какой-то компонент (в том числе звук), то этот процесс должен отображаться предзагрузчиком. Пользователю необходимо знать, сколько ему осталось ждать. Если он не будет видеть ход загрузки, то вероятность того, что он не дождется ее конца и покинет ресурс, куда выше, чем если он будет наблюдать непрерывно удлиняющуюся шкалу или число, постепенно приближающееся к 100 %.

В случае звуков у нас нет таких совершенных средств для создания предзагрузчиков, как те, которые предоставляет класс MovieClipLoader. Нов реализации предзагрузчика для звука все равно нет ничего сложного. Для решения этой задачи у класса Sound имеется два метода, полностью аналогичных одноименным методам класса MovieClip: getBytesLoaded() и getBytesTotal(). Первый возвращает количество уже загруженных байтов информации, а второй определяет размер импортируемого МР3-файла в байтах.

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

Приведем пример элементарного предзагрузчика:

var sound:Sound=new Sound(this); // Даем команду начала загрузки звука
sound.loadSound("music.mp3", false);
// Создаем поле, в котором будет отображаться степень загрузки звука
this.createTextField("preloader", 0, 200, 150, 30, 30);
preloader.border=true, preloader.text="0 %";
// Функция, обновляющая вид предзагрузчика и удаляющая его
// по окончании загрузки
function updatePrel():Void {
var proс:Number=(sound.getBytesLoaded()/sound.getBytesTotal())*100;
if (proc<100 &&!isNaN(proc)) {
preloader.text=Math.round(proc)+" %";
} if (proc==100) {
clearInterval(time);
preloader.removeTextField();
sound.start();
}
}
// Предзагрузчик будет обновляться два раза в секунду
var time:Number=setInterval(updatePrel, 500);

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Динамическое присоединение звука. Метод attachSound()
Операции со звуком без использования программирования
Основные понятия теории цифрового звука
Свойства position и duration
Событийный (event) и потоковый (stream) звук

Вернуться в раздел: Action Script / 15. Работа со звуком