Pull to refresh

Загрузка, воспроизведение звука, использование микрофона в ActionScript 3.0

Reading time5 min
Views8.7K
Пакет Flash Builder 4.5 и, собственно, язык ActionScript 3.0 предоставляет программистам широкие возможности по использованию в своих flex-программах и обычных флешках звука в целом и микрофона в частности. Зачем же это нужно? В первую очередь, это может пригодиться в создании таких программ, как всевозможные голосовые чаты. Также свое применение эти элементы могут найти и в сфере защиты информации — например, в системах распознавания голоса. Но в данном примере и в данной конкретной статье будет говориться не столько об этом, сколько об общих правилах использования этих элементов. Также следует отметить, что работа будет вестись c flex-приложением.

Подключение микрофона


Начнем работу с микрофоном, для чего откроем, например, Flash Builder 4.5 и создадим проект Flex на платформе AIR (специальная платформа, позволяющая создавать не «флешки» с форматом .swf, а полноценные приложения — при желании, даже с установочным файлом и цифровой подписью). После чего мы можем начинать работу. Чтобы программа опознала микрофон, подключенный к компьютеру, необходимо прописать следующий код:
public var micro:Microphone = Microphone.getMicrophone();

После выполнения этой строчки кода, программой будет выбрано первое обнаруженное устройство записи звука. Если же ни одного устройства не было подключено, то метод getMicrophone() вернет значение null. Может быть так, что к одному компьютеру будет подключено несколько звукозаписывающих устройств, в этом случае к любому из них можно обратиться. Следующий код выбирает второе из подключенных устройств:
public var micro:Microphone = Microphone.getMicrophone(2);

Если второго устройства не будет существовать, будет также возвращено значение null. Само свойство index, указывающее на номер запрашиваемого устройства, имеет тип int, то есть целочисленный тип.
Следует отметить, что, если микрофон еще ни разу не использовался во flash-программах на Вашем компьютере, проигрыватель Flash Player выведет специальное окно с запросом на разрешение или блокировку данного микрофона. При выборе пользователем одного из вариантов, запустится событие типа STATUS, которое можно отследить. Сначала нужно привязать к данному типу событий функцию, которая будет срабатывать во время появления этих событий.
micro.addEventListener(StatusEvent.STATUS, onStatus);

Эту строчку кода можно, например, вписать в обработчик события нажатия какой-либо кнопки, а можно записать ее в функцию onCreationComplete — тогда обработчик будет привязываться к событиям сразу по включении программы.
import mx.controls.Alert;
protected function onStatus(e:StatusEvent):void{
if(e.code == "Microphone.Unmuted") Alert.show("Микрофон разрешен.");
else if(e.code == "Microphone.Muted") Alert.show("Микрофон был запрещен.");
}

В данном коротком примере мы создаем прослушиватель событий типа STATUS, который, при получении сигнала о соответствующем событии, выполняет тело функции onStatus. При этом e.code — это значение, которое передается обработчику после нажатия одной из кнопок — разрешить или запретить.
Теперь попробуем записать что-нибудь, говоря в микрофон. Когда в микрофон поступают какие-либо звуки, активируется событие типа SAMPLE_DATA. Чтобы записать звук с микрофона, создадим сначала некое хранилище для него. В этом нам поможет создание переменной такого типа данных, как ByteArray.
public var bArr:ByteArray = new ByteArray;

Теперь, как и в предыдущем примере, добавим прослушиватель событий к нашей переменной micro.
micro.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleC);

После этого запишем функцию-обработчик для события SAMPLE_DATA.
protected function onSampleC(e:SampleDataEvent):void{
var sample:Number;
bArr.clear();
while(e.data.bytesAvailable){
sample = e.data.readFloat();
bArr.writeFloat(sample);
}
}

В данном примере мы сначала очищаем наш массив байтов bArr с той целью, чтобы при повторном применении программы вторая запись не записывалась после первой в один и тот же массив. После этого мы считываем в виде байтов звук в наш массив, пока он не прекратится.
У класса Microphone есть также еще один интересный метод. Он позволяет посылать звук с микрофона на звуковоспроизводящее устройство (то есть, колонки). Выглядит это следующим образом:
micro.setLoopBack(true);

Но вместе с этим методом обязательно нужно использовать и еще один:
mic.setUseEchoSuppression(true);

Этот метод включает использование специальной технологии подавления эха. Даже с ней звук может немного искажаться, а без нее при использовании micro.setLoopBack(true); можно даже повредить свои колонки.
Также возможно регулировать уровень громкости звука, идущего через микрофон. Для этого служит параметр gain. Например, создав на форме объект HSlider, можно написать функцию-обработчик события передвижения ползунка, создав простой регулятор громкости. Для этого напишем функцию:
protected function onSlCh():void {
micro.gain = sl.value;
}
где sl — значения параметра id объекта HSlider.

Воспроизведение звука


Основным объектом звука в ActionScript 3.0 служит экземпляр класса Sound. Именно он обладает таким методом, как play(), позволяющим проиграть звук через колонки или наушники. Первой нашей задачей станет загрузка и воспроизведение звука в формате mp3. Перво-наперво, для загрузки какого-либо mp3-файла в объект класса Sound, необходимо создать так называемый URLRequest — задать путь к файлу. Например:
public var urlr:URLRequest = new URLRequest("sample.mp3");

В данном примере звук загружается из папки созданного проекта приложения и называется sample.mp3. Если необходимо загрузить звуковой файл с другого локального диска, то следует создать переменную типа URLRequest так:
public var urlr:URLRequest = new URLRequest("C:/sample.mp3");

После этого можно сразу прописать следующий код:
public var snd:Sound = new Sound(urlr);

И запустить метод
snd.play();
повесив его на обработчик, например, нажатия кнопки.

Можно сделать и по-другому, воспроизведя звук тогда, когда он будет загружен и готов к использованию. Для этого снова стоит воспользоваться функциями-обработчиками событий. Создадим обработчик события, активизирующегося при окончании загрузки аудио файла в программу:
snd.addEventListener(Event.COMPLETE, onSndReady);

При этом переменную snd следует создавать не так, как в прошлом примере, а следующим образом:
public var urlr:URLRequest = new URLRequest("C:/sample.mp3");
public var snd:Sound = new Sound();

В функцию-обработчик какого-нибудь события нажатия кнопки следует записать
snd.load();

Этот метод будет загружать звуковой файл, указанный в urlr, а по завершении загрузки отправит событие COMPLETE.
Сначала мы не будем передавать в конструктор класса Sound никаких переменных.
После этого создадим указанную функцию onSndReady:
function onSndReady(e:Event):void {
var lsnd:Sound = e.target as Sound;
lsnd.play();
}

В итоге, как только звуковой файл, указанный в urlr, будет загружен в программу, он будет воспроизведен.
Довольно просто также написать функцию, которая будет отслеживать загрузку звука во время его подготовки к воспроизведению. Для этого на форме программы следует создать, например, объект TextArea. Установив значение его свойства id = txt, напишем по уже знакомой схеме подключение прослушивателя события загрузки:
snd.addEventListener(ProgressEvent.PROGRESS, onLoading);

После чего напишем функцию, которая в наш импровизированный текстовый лог txt будет выводить значение загруженных данных в процентах:
function onLoading(e:ProgressEvent):void {
var loaded:int = Math.round(100 *(e.bytesLoaded / e.bytesTotal));
txt.text += "Звук загружен на "+loaded+"%.";
}

В итоге в логе под названием txt будет отображаться процент загрузки аудио файла.

Напоследок следует рассказать о некоторых дополнительных параметрах метода play().
У него их два — это параметр startTime, указываемый в миллисекундах, и параметр loops, указывающий, сколько раз следует повторить загруженный звук.
Например, snd.play(1000,3) воспроизведет звук, загруженный в snd, начиная с 1 секунды, а затем повторит его три раза.
На этом заканчивается статья о загрузке и воспроизведении звука, а также использовании микрофона в ActionScript 3.0 и наиболее общих их применениях. Спасибо за внимание и удачи вам в написании собственных программ.
Tags:
Hubs:
Total votes 15: ↑9 and ↓6+3
Comments5

Articles