Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab11_Java_Vkazivky_2010_Mutimedia in Java_ Ima....doc
Скачиваний:
1
Добавлен:
17.04.2019
Размер:
863.23 Кб
Скачать

15.14. Звук

Як було указано в попередньому уроці, в аплетах реалізується інтерфейс AudioСlip. Екземпляр обєкта, реалізуючого цей інтерфейс можна отримати методом getAudioClip(), котрий, крім того, завантажує звуковий файл, а потім користуватися методами play(), loop() і stop() цього інтерфейса для програвання музики. Для застосування даного ж прийому в додатках в класс Applet введено статичний метод newAudioclіp(URL address), завантажуючий звуковий файл, що знаходиться по адресу address, і повертаючий обєкт, реалізуючий інтерфейс AudioСlip. Його можна використовувать для програвання звуку в додатку, якщо звичайно звукова система компютера уже настроєна.

В лістинзі 15.14 приведено найпростіший консольний додаток, нескінчено програючий звуковий файл doom.mid, що знаходиться в поточному каталозі. Для завершення додатку треба застосувати засоби операційної системи, наприклад, комбінацію клавіш <Ctrl>+<C>.

Лістинг 15.14. Найпростіший аудіододаток

Import java.Applet.* ;

Import java.Net.*;

class SimpleAudio{

SimpleAudio () {

try{

AudioClip ac = Applet.newAudioClip(new URL("file:doom.mid"));

ac.loop();

}catch(Exception e){}

}

public static void main(String[] args){

new SimpleAudio();

}

}

Таким способом можна пргравати звукові файли типів AU, WAVE, AIFF, MIDI без стискання. В склад віртуальної машины Java, що входить в SUN J2SDK починаючи з версії 1.3, включено пристрій, програваючий звук, записаний в одному із форматів AU, WAVE, AIFF, MIDI, перетворюючий, мікшуючий і записуючий звук в тих же форматах. Для роботи з цим пристроєм створені класи, зібрані в пакети javax.sound.sampled, javax.sound.midi, javax.sound.sampled.spi і javax.sound.midi.spi. Перечислений набір класів для роботи із звуком отримав назву Java Sound API.

15.15. Програвання звуку в Java 2

Програвач звуку, вбудований в JVM, розрахований на два способи запису звуку: моно і стерео оцифровку (digital audio) з частотою дискретизації (sample rate) від 8 000 до 48 000 Гц і апроксимацією (quantization) 8 і 16 бітів, і MIDI-послідовності (sequences) типу 0 і 1. Оцифрований звук повинен зберігатися в файлах типу AU, WAVE і AIFF. Його можна програвати двома способами. Перший спосіб описаний в інтерфейсі clip. Він розрахований на відтворення невеликих файлів або неодноразового програвання файла і заключається в тому, що весь файл цілком завантажується в оперативну память, а потім проигррається. Другий спосіб описаний в інтерфейсі SourceDataLine. Згідно цьому способу файл завантажується в оперативну память по частинах в буфер, розмір якого можна задати довільно. Перед завантаженням файла треба задати формат запису звуку в обєкті класу AudioFormat. Конструктор цього класу:

AudioFormat(float sampleRate, int sampleSize, int channels, boolean signed, boolean bigEndian)

вимагає знання частоти дискретизації sampleRate (по замовчуванню 44 100 Гц), аппроксимації sampleSize, заданої в бітах (по замовчуванню 16), числа каналів channels (1 — моно, по замовчуванню 2 — стерео), запис чисел із знаком, signed == true, або без знака, і порядка розташування байтів в числі bigEndian. Такі дані звичайно невідомі, тому їх отримують із самого файла. Це відбувається в два кроки. На першому кроці отримуємо формат файла статичним методом getAudioFiІeFormat() класу AudioSystem, на другому — формат запису звуку методом getFormat() класу AudioFiІeFormat. Це описано в лістинзі 15.15. Після того як формат запису визначено і занесено в обєкт класу AudioFormat, в обєкті класу DataLine.infо збирається інформація про вхідну лінію (line) і способі програвання clip або SourceDataLine. Далі треба перевірити, чи зможе проигравач обслуговувати лінію з таким форматом. Потім треба звязати лінію з програвачем статичним методом getLine() класу AudioSystem. Потім створюємо потік даних із файла — обєкт класу AudioІnputstream. Із цього потоку теже можна отримати обєкт класу AudioFormat методом getFormat(). Даний варіант вибраний в лістинзі 15.16. Відкриваємо створений потік методом ореn(). У-фф! Все готово, тепер можна почати програвання методом start(), завершити методом stop(), "перемотать" в початок методом setFramePosition(0) або setMillisecondPosition(0).

Можна задати пргравання n раз підряд методом loop(n) або нескінчене число раз методом loop (Clip.LOOP_CONTINUOUSLY) . Перед цим необхідно установити початкову n і кінцеву m позиції повторення методом setLoopPoints(n, m). По закінченню програвання треба закрити лінію методом close (). Вся ця послідовність дій показана в лістинзі 15.15.

Лістинг 15.15. Програвання аудіокліпа

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]