Воспроизведение звуковых файлов в Java

В Java имеется возможность воспроизводить звуковые файлы форматов AU, WAV и AIFF без использования внешних библиотек.

Поддерживаются моно и стереозвук с частотой дискредитации от 8 до 48 кГц и аппроксимацией (количеством бит в семпле) 8 или 16 бит.

Существуют два основных способа воспроизведения звука.

  • Использование интерфейса Clip;
  • Использование интерфейса SourceDataLine.

Различие межу ними состоит в том, что первый способ подразумевает загрузку воспроизводимого файла в память целиком. Это удобно при воспроизведении небольших файлов или неоднократном проигрывании.

При использовании второго способа файл загружается в память частями в буфер, размер которого можно установить произвольно.

Использование интерфейса Clip

Первое, что нам потребуется при использовании интерфейса Clip это соответствующее поле класса или просто переменная.

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

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

После этого можно открыть созданную связь методом open и воспроизвести файл с помощью метода start.

Для того чтобы прекратить воспроизведение нужно воспользоваться методом stop и закрыть связь методом close.

Управление воспроизведением осуществляется с помощью методов интерфейса Clip.

Для «перемотки» записи на заданное количество семплов или миллисекунд служат методы setFramePosition и setMillisecondPosition соответственно.

Для циклического воспроизведения предназначен метод loop. При этом, файл можно воспроизводить не только бесконечное число раз.

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

Также можно организовать циклическое воспроизведение отдельного фрагмента звукозаписи. Для этого перед запуском циклического воспроизведения необходимо указать начальную и конечную позиции повторения с помощью метода setLoopPoints.

В качестве примера ниже приведён возможный вариант реализации метода воспроизведения звука с помощью интерфейса Clip.

Обработка исключений в данном примере будет пояснена в конце статьи.

Использование интерфейса SourceDataLine

При использовании этого способа вначале также создаётся специальное поле класса или переменная.

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

Далее следует создать объект, представляющий воспроизводимый файл, поток аудиоданных и получить информацию о формате звукозаписи.

После проверки возможности воспроизведения (производится аналогично предыдущему способу) можно приступать к воспроизведению.

Создаём и открываем связь.

Начинаем воспроизведение.

Заполняем буфер по мере проигрывания файла.

Проигрывая остаток файла, «сливаем» буфер:

После завершение воспроизведения, закрываем поток аудиоданных и связь.

Ниже приведён пример возможной реализации метода, который воспроизводит звуковой файл уже с помощью интерфейса SourceDataLine (обработка исключений пояснена в конце статьи).

В случае интерфейса SourceDataLine управление воспроизведением производится с помощью событий класса LineEvent. Событий всего 4 и определяются они следующими константами:

  • OPEN – открытие потока;
  • CLOSE – закрытие потока;
  • START – запуск воспроизведения;
  • STOP – завершение воспроизведения.

Отслеживание событий осуществляется с помощью метода update класса LineListener.

Необходимо отметить, что при использовании интерфейса SourceDataLine воспроизведение осуществляется синхронно. Поэтому, чтобы избежать «зависания» программы во время проигрывания файла, воспроизведение необходимо выполнять в отдельном потоке.

Обработка исключений

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

Если обратить внимание, то в обоих примерах методов воспроизведения все операции по работе с файлом и аудиоданными помещены в блок try, чтобы обеспечить перехват возможных исключений.

Собственно обработка исключений (блок catch) всецело строится исходя из особенностей конкретного приложения.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *