Java Sound API была частью стандартной библиотеки Java 2 Platform с 1,3 релизе. Найдено в javax.sound.sampled пакет Java Sound API обеспечивает поддержку для воспроизведения и захвата аудио. Кроме того, библиотека предлагает программный микшер аудио и MIDI (Musical Instrument Digital Interface) устройства доступа. В этот совет, вы узнаете, как захват аудио через Java Sound API и воспроизводить его.

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

Рассмотрим первую запись. Основной процесс записи выглядит следующим образом:

Опишите аудио формате, в котором вы хотите записать данные. Это включает в себя указание частоты дискретизации и количество каналов (по сравнению с моно стерео) для аудио. Вы задаете эти свойства, используя уместно названный AudioFormat класс. Есть два конструкторов для создания объектов AudioFormat:


   AudioFormat(AudioFormat.Encoding encoding, 

    float sampleRate, int sampleSizeInBits, 

    int channels, int frameSize, float frameRate, 

    boolean bigEndian

    

   AudioFormat(float sampleRate, int sampleSizeInBits, 

    int channels, boolean signed, boolean bigEndian

Первый конструктор позволяет явно указать формат кодирования звука, а вторая используется по умолчанию. Имеющиеся кодировки ALAW, PCM_SIGNED, PCM_UNSIGNED и ULAW. Кодировка по умолчанию используется для второго конструктора PCM. Вот пример, который использует второй конструктор для создания AudioFormat объект для одного канала записи в формате 8 кГц:


    float sampleRate = 8000;

    int sampleSizeInBits = 8;

    int channels = 1;

    boolean signed = true;

    boolean bigEndian = true;

    AudioFormat format =  new AudioFormat(sampleRate, 

      sampleSizeInBits, channels, signed, bigEndian);

После того как вы описывать аудио формат, Вам необходимо получить линий передачи данных. Этот интерфейс представляет собой аудио-канал, из которого вы можете захватить аудио. Вы используете подинтерфейсом Dataline сделать фактический захват. Подинтерфейсом называется TargetDataLine. Чтобы получить TargetDataLine Вы спросите, аудиосистема. Однако, когда вы это сделаете, вам нужно указать информацию о линии. Чтобы внести уточнение в виде объекта DataLine.Info. В частности, необходимо создать объект DataLine.Info, специфичные для типов линий передачи данных и аудио форматов. Вот несколько строк исходного что получить TargetDataLine.


  DataLine.Info info = new DataLine.Info(

    TargetDataLine.class, format);

  TargetDataLine line = (TargetDataLine)

    AudioSystem.getLine(info);

Если TargetDataLine недоступен, бросают LineUnavailableException.

На данный момент у вас есть источник входа. Вы можете думать о TargetDataLine как входного потока. Однако, это требует некоторой настройки прежде чем вы можете прочитать форму. Установка в данном случае означает открытие первой линии с помощью Open () метод, а затем строку инициализации с помощью пускового () метод:


  line.open(format);

  line.start();

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


  int bufferSize = (int)format.getSampleRate() 

    format.getFrameSize();

  byte buffer[] new byte[bufferSize];

  out = new ByteArrayOutputStream();

  while (externalTrigger) {

    int count = line.read(buffer, 0, buffer.length);

    if (count > 0) {

      out.write(buffer, 0, count);

    }

  }

  out.close();

Теперь давайте рассмотрим воспроизведения звука. Существуют две основные различия в воспроизведении аудио по сравнению с записью звука. Во-первых, когда вы играете аудио, байты прибывают из AudioInputStream вместо TargetDataLine. Во-вторых, вы пишите в SourceDataLine вместо в ByteArrayOutputStream. Кроме того, процесс такой же.

Чтобы получить AudioInputStream, вам необходимо преобразовать ByteArrayOutputStream в исходный AudioInputStream. Конструктор AudioInputStream требует байт из выходного потока, кодировка, в аудио формате, а число выборки:


  byte audio[] = out.toByteArray();

  InputStream input = new ByteArrayInputStream(audio);

  AudioInputStream ais = new AudioInputStream(input, 

    format, audio.length / format.getFrameSize());

Получение линий передачи данных аналогично тому, как вы получите его на аудио-записи, но для воспроизведения аудио, нужно принести SourceDataLine вместо TargetDataLine:


  DataLine.Info info = new DataLine.Info(

                         SourceDataLine.class, format);

  SourceDataLine line = 

             (SourceDataLine)AudioSystem.getLine(info);

Установка для линии совпадает с настройкой для аудио-записи:


  line.open(format);

  line.start();

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


  int bufferSize = (intformat.getSampleRate() 

    * format.getFrameSize();

  byte buffer[] new byte[bufferSize];



  int count;

  while ((count = 

      ais.read(buffer, 0, buffer.length)) != -1) {

    if (count > 0) {

      line.write(buffer, 0, count);

    }

  }

  line.drain();

  line.close();

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

Примечание: В зависимости от вашей звуковой поддержкой платформы обеспечивает, вы, возможно, потребуется изменить формат возвращаемых getFormat метода в программе. Если вы не знаете, какой формат поддерживает вашу платформу, скачать демо-программы со страницы Java Sound демо, и запустите его. Перейдите на вкладку CapturePlayback, и найти набор параметров формата, которые работают для Вас. Вы можете загрузить аудио-файл с аудио подкаталог, а затем попробовать различные настройки слева, пока что-то работы. Использовать эти настройки в создании AudioFormat возвращается getFormat ().


import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.sound.sampled.*;



public class Capture extends JFrame {



  protected boolean running;

  ByteArrayOutputStream out;



  public Capture() {

    super("Capture Sound Demo");

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    Container content = getContentPane();



    final JButton capture = new JButton("Capture");

    final JButton stop = new JButton("Stop");

    final JButton play = new JButton("Play");



    capture.setEnabled(true);

    stop.setEnabled(false);

    play.setEnabled(false);



    ActionListener captureListener = 

        new ActionListener() {

      public void actionPerformed(ActionEvent e) {

        capture.setEnabled(false);

        stop.setEnabled(true);

        play.setEnabled(false);

        captureAudio();

      }

    };

    capture.addActionListener(captureListener);

    content.add(capture, BorderLayout.NORTH);



    ActionListener stopListener = 

        new ActionListener() {

      public void actionPerformed(ActionEvent e) {

        capture.setEnabled(true);

        stop.setEnabled(false);

        play.setEnabled(true);

        running = false;

      }

    };

    stop.addActionListener(stopListener);

    content.add(stop, BorderLayout.CENTER);



    ActionListener playListener = 

        new ActionListener() {

      public void actionPerformed(ActionEvent e) {

        playAudio();

      }

    };

    play.addActionListener(playListener);

    content.add(play, BorderLayout.SOUTH);

  }



  private void captureAudio() {

    try {

      final AudioFormat format = getFormat();

      DataLine.Info info = new DataLine.Info(

        TargetDataLine.class, format);

      final TargetDataLine line = (TargetDataLine)

        AudioSystem.getLine(info);

      line.open(format);

      line.start();

      Runnable runner = new Runnable() {

        int bufferSize = (int)format.getSampleRate() 

          * format.getFrameSize();

        byte buffer[] new byte[bufferSize];

 

        public void run() {

          out = new ByteArrayOutputStream();

          running = true;

          try {

            while (running) {

              int count = 

                line.read(buffer, 0, buffer.length);

              if (count > 0) {

                out.write(buffer, 0, count);

              }

            }

            out.close();

          catch (IOException e) {

            System.err.println("I/O problems: " + e);

            System.exit(-1);

          }

        }

      };

      Thread captureThread = new Thread(runner);

      captureThread.start();

    catch (LineUnavailableException e) {

      System.err.println("Line unavailable: " + e);

      System.exit(-2);

    }

  }



  private void playAudio() {

    try {

      byte audio[] = out.toByteArray();

      InputStream input = 

        new ByteArrayInputStream(audio);

      final AudioFormat format = getFormat();

      final AudioInputStream ais = 

        new AudioInputStream(input, format, 

        audio.length / format.getFrameSize());

      DataLine.Info info = new DataLine.Info(

        SourceDataLine.class, format);

      final SourceDataLine line = (SourceDataLine)

        AudioSystem.getLine(info);

      line.open(format);

      line.start();



      Runnable runner = new Runnable() {

        int bufferSize = (intformat.getSampleRate() 

          * format.getFrameSize();

        byte buffer[] new byte[bufferSize];

 

        public void run() {

          try {

            int count;

            while ((count = ais.read(

                buffer, 0, buffer.length)) != -1) {

              if (count > 0) {

                line.write(buffer, 0, count);

              }

            }

            line.drain();

            line.close();

          catch (IOException e) {

            System.err.println("I/O problems: " + e);

            System.exit(-3);

          }

        }

      };

      Thread playThread = new Thread(runner);

      playThread.start();

    catch (LineUnavailableException e) {

      System.err.println("Line unavailable: " + e);

      System.exit(-4);

    

  }



  private AudioFormat getFormat() {

    float sampleRate = 8000;

    int sampleSizeInBits = 8;

    int channels = 1;

    boolean signed = true;

    boolean bigEndian = true;

    return new AudioFormat(sampleRate, 

      sampleSizeInBits, channels, signed, bigEndian);

  }



  public static void main(String args[]) {

    JFrame frame = new Capture();

    frame.pack();

    frame.show();

  }

}

Вы можете найти более полный пример использования Java Sound API на странице Java Sound Demo. Этот пример показывает также осциллограф звуковой волны как это воспроизведения.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.