AS3: Воспроизведение звуков в AdobeFlash

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

В уроке рассмотрены следующие темы:

  1. Классы звуков в AdobeFlash
  2. Воспроизведение внутреннего звука
  3. Воспроизведение внешнего звука
  4. Остановка воспроизведения звука
  5. Приостановка звука на паузу
  6. Изменение громкости звука

Классы звуков в AdobeFlash

Звуки в ActionScript 3 управляются через совместную работу нескольких классов. Это структура сложнее, чем в предыдущей версии ActionScript, но утверждается, что такой формат обеспечивает наилучший контроль и способность к микроменеджменту звуков. Ниже приведены соответствующие классы для звуков:

  1. Класс Sound — это основной класс, в котором фактически будет находиться звук. Этот класс является отправной точкой любого звука, связанного с программой, и используется для начала воспроизведения звука.
  2. Класс SoundChannel — звук может быть воспроизведен через звуковой канал, который предоставляет дополнительное управление над звуковым объектом, основное назначение этого управления — возможность останавливать воспроизведение звука.
  3. Класс SoundTransform — этот класс отвечает за изменение громкости звука и панорамирование (управление балансом между левым и правым динамиками).
  4. Класс SoundMixer — этот класс имеет глобальное управление над всеми звуками в Flash player’е. Его основная функция — останавливать все воспроизведения звуков вне зависимости от источника.

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

Воспроизведение внутреннего звукового файла

Flash способен воспроизводить только mp3-файлы и никакой другой формат. Воспроизведение mp3-файла является простой задачей, которая может быть выполнена при помощи класса Sound. Класс Sound может проигрывать внутренние звуки (mp3-файлы, импортированные в fla-файл) или внешние звуки (mp3-файлы, загружаемые в SWF во время выполнения). Мы начнем с воспроизведения внутреннего mp3-файла, импортированного во флэш-приложение.

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

Импортирование файла в библиотеку в Adobe Flash

Как только у вас будет готовый mp3-файл, откройте Flash и создайте новый FLA-документ в формате AS3, а затем перейдите в главном меню File -> Import -> Import to Library, найдите нужный mp3-файл и нажмите на «Open».

После того, как файл будет импортирован, откройте библиотеку (Ctrl + L) и найдите там звуковой файл. Сделаем этот файл доступным для ActionScript, отредактировав его свойство Linkage, правой кнопкой мыши нажмите на звуковой файл, выберите Properties…, чтобы открыть окно свойств. Установите флажок на «Export for ActionScript» и измените имя класса в поле Class на MyFavSong. Нажмите OK, вы должны будете получить такое же сообщение, которое появляется при создании любого класса с внешним файлом определения класса. Просто нажмите OK , чтобы продолжить. Будет экспортирован звуковой файл в качестве класса ActionScript с именем MyFavSong.

Связывание и экспортирование файла в ActionScript

Теперь есть готовый mp3-файл доступный для ActionScript. Пришло время начать программирование на ActionScript. Нажмите правой кнопкой мыши на один кадр на временной шкале и выберите Actions, чтобы открыть панель Actions.

Чтобы воспроизвести звук, нужно создать новый экземпляр звукового класса, а затем использовать метод .play() класса Sound для воспроизведения. Приведенный ниже код вполне понятный:

var mySound:Sound = new MyFavSong();
mySound.play();

Примечание: метод .play() класса Sound используется для воспроизведения звука. По умолчанию он воспроизводит звук с самого начала, однако вы можете начать воспроизведение с любой другой позиции, указав ее в миллисекундах (например: mySound.play(150)).

Протестируйте пример (Ctrl + Enter), чтобы услышать воспроизведение файла.

Воспроизведение внешнего звукового файла

Воспроизведение внешнего звукового файла выполнить намного легче, чем воспроизведение внутреннего звукового файла, так как не нужно импортировать файл и создавать класс на его основе.

Вы можете создать новый FLA-документ, сохранить где-нибудь файл на рабочем столе, затем поместить mp3-файл в ту же папку, переименуйте звуковой файл на myFavSong.mp3 .

Документ AdobeFlash и звуковой файл

Теперь вернитесь к FLA-документу, откройте панель Actions для создания кода. Просто создадим новый сгенерированный экземпляр класса Sound, а затем используем метод .load() чтобы загрузить внешний файл. Теперь будем использовать метод .play() , чтобы воспроизвести звук.

var mySound:Sound = new Sound();
mySound.load(new URLRequest("myFavSong.mp3"));
mySound.play();

Примечание: метод .load() класса Sound используется для загрузки внешнего mp3-файла. URL должен быть указан в качестве экземпляра класса URLRequest. Обратитесь к справочнику ActionScript для большей информации о классе URLRequest.

Протестируйте пример (Ctrl + Enter), чтобы услышать воспроизведение звука.

Остановка воспроизведения звука

В дополнение к возможности воспроизведения звука, очевидно, что вы захотите знать, как остановить звук после воспроизведения. Класс Sound не имеет метода для остановки звука. Для этой задачи следует использовать класс SoundChannel. SoundChannel — это класс, который используется для хранения необработанного звукового объекта, а затем для управления им при помощи методов и свойств класса SoundChannel. Методы и свойства, о которых вам необходимо знать:

  • .stop() — метод останавливает звук, воспроизводимый через канал.
  • .position — это свойство используется для получения текущей позиции воспроизведения звука, воспроизводимого через канал.
  • .soundTransform() — это свойство используется для установки и получения преобразований звука, таких как громкость и панорамирование.

Продолжим работу с FLA-файлом, который загружает внешний звуковой файл и создает кнопку, которая останавливает воспроизведение звука при нажатии. В этом же FLA-файле перейдите на панель компонентов (Window -> Components) и перетащите от туда экземпляр кнопки Button Component из категории User Interface. Перейдите на панель инспектора свойств Properties Inspector и назначьте в поле instance name (имя экземпляра) stop_btn на этой кнопке. Вы можете изменить метку label кнопки, скажем, на «Stop» используя поле Parameters.

Панель компонентов Components в AdobeFlash

Настройка компонента Button в AdobeFlash

Теперь сделаем так, чтобы при нажатии на кнопку останавливалось воспроизведение звука. Нажмите правой кнопкой мыши на любой кадр на временной шкале и выберите Actions, чтобы открыть панель Actions. У вас должен быть этот код из предыдущего примера:

var mySound:Sound = new Sound();
mySound.load(new URLRequest("myFavSong.mp3"));
mySound.play();

Сначала создадим новую переменную для хранения нового экземпляра канала SoundChannel:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
mySound.load(new URLRequest("myFavSong.mp3"));
mySound.play();

Нам необходим экземпляр SoundChannel для захвата звука при начале его воспроизведения так, чтобы мы смогли управлять им через этот канал. Чтобы сделать это, замените строку кода, которая указывает на воспроизведение звука, строкой, которая выделена ниже:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

Теперь звуковой канал содержит звук, который воспроизводится в нем. Нужно зарегистрировать прослушиватель события для кнопки, чтобы канал останавливал звук при нажатии на нее при помощи метода .stop() .

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

stop_btn.addEventListener(MouseEvent.CLICK, onClickStop);

function onClickStop(e:MouseEvent):void{
  myChannel.stop();
}

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

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

Приостановка звука на паузу

ActionScript не предоставляет метод .pause , возможность приостанавливать звук и воспроизводить его снова с определенной позиции требует извлечения звука перед тем, как его остановить, а затем воспроизвести с этой же позиции. Мы говорили о свойстве .posistion класса SoundChannel, а также о возможности воспроизведения звука с определенной позиции при помощи метода .play(). Мы используем их вместе.

Начните с добавления новой кнопки на сцену. Перейдите на панель компонентов (Components Panel) и добавьте кнопку на сцену, установите имя экземпляру play_btn и измените метку на Play. Обновите метку предыдущей кнопки так, чтобы она называлась «Pause» вместо «Stop» , а также измените имя экземпляра stop_btn на pause_btn.

Добавление двух компонентов Button в AdobeFlash

Теперь вернемся к ActionScript. Первое, что нужно сделать, это удалить весь код, относящийся к stop_btn. Удалите код, который выделен ниже.

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

stop_btn.addEventListener(MouseEvent.CLICK, onClickStop);

function onClickStop(e:MouseEvent):void{
  myChannel.stop();
}

Для того, чтобы кнопка паузы заработала нужно создать переменную для хранения предыдущей позиции звукового файла. Можно легко создать эту переменную и установить ей «0» в качестве начального значения, назовем переменную lastPosition:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

Теперь настроим кнопку Pause, получим ее значение при нажатии и сразу остановим воспроизведение звука после этого. Будем использовать обработчик события похожий на тот, что использовали для кнопки остановки воспроизведения звука.

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

Теперь сделаем так, чтобы кнопка воспроизводила звуковой файл с последней позиции. Вам следует помнить о том, что метод .play() это экземпляр класса Sound и должен быть снова внедрен в SoundChannel:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void{
  myChannel = mySound.play(lastPosition);
}

Проверьте пример (Ctrl + Enter) с кнопками паузы и воспроизведения звука.

Изменение громкости звука

В этой теме урока мы рассмотрим, как изменить громкость звукового канала SoundChannel. Для этого необходимо использовать класс SoundTransform и свойство .soundTransform класса SoundChannel.

Класс SoundTransform имеет различные свойства, самое важное из которых свойство .volume . Использование класса SoundTransdorm довольно простое, все, что нужно это создать экземпляр этого класса, настроить его свойства, а затем установить его в качестве значения свойства .soundTransform целевого звукового канала SoundChannel.

Сейчас мы это и сделаем. Начнем с создания нового экземпляра класса SoundTransform:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var myTransform = new SoundTransform();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void{
  myChannel = mySound.play(lastPosition);
}

Теперь давайте установим значение для свойства .volume этого экземпляра. Свойство volume (громкость) может быть любыми значением с плавающей точкой между 1 и 0, где 1 означает максимальный показатель громкости звука, а 0 — отключение громкости звука. Установим громкость на среднюю, используя 0.5 в качестве значения:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var myTransform = new SoundTransform();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();
myTransform.volume = 0.5;

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void{
  myChannel = mySound.play(lastPosition);
}

Теперь установим это изменение в качестве свойства .soundTransform звукового канала SoundChannel:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var myTransform = new SoundTransform();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();
myTransform.volume = 0.5;
myChannel.soundTransform = myTransform;

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void{
  myChannel = mySound.play(lastPosition);
}

Вы должны не забывать о том, что устанавливать свойство .soundTransform нужно после того, как внедрили звуковой объект в звуковой канал, но не перед этим. Запустите пример, чтобы услышать пониженную громкость звука. Тем не менее, вы заметите, что при нажатии на паузу, а затем при воспроизведении, звук будет снова высоким. Это происходит, потому что когда вы внедряете новый звук в канал, все звуковые преобразования стираются. Можно поправить это, установив свойство .soundTransform заново внутри обработчика события onClickPlay следующим образом:

var mySound:Sound = new Sound();
var myChannel:SoundChannel = new SoundChannel();
var myTransform = new SoundTransform();
var lastPosition:Number = 0;
mySound.load(new URLRequest("myFavSong.mp3"));
myChannel = mySound.play();
myTransform.volume = 0.5;
myChannel.soundTransform = myTransform;

pause_btn.addEventListener(MouseEvent.CLICK, onClickPause);

function onClickPause(e:MouseEvent):void{
  lastPosition = myChannel.position;
  myChannel.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, onClickPlay);

function onClickPlay(e:MouseEvent):void{
  myChannel = mySound.play(lastPosition);
  myChannel.soundTransform = myTransform;
}

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

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

Один комментарий на “AS3: Воспроизведение звуков в AdobeFlash

  1. Спасибо!!!!!! Долго искал то что хотел, все никак не мог понять почему звук такой стремный, а тут раз раз и готово! Спасибо!!!!

Комментировать

Почта не публикуется.Обязательные поля отмечены *