Поиск…


замечания

Вместо использования javax.sound.sampled Clip вы также можете использовать AudioClip который находится из API апплета. Тем не менее рекомендуется использовать Clip поскольку AudioClip только старше и представляет собой ограниченную функциональность.

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

Необходимый импорт:

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

Этот код будет создавать клип и воспроизводить его непрерывно после запуска:

Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new URL(filename)));
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);

Получите массив со всеми поддерживаемыми типами файлов:

AudioFileFormat.Type [] audioFileTypes = AudioSystem.getAudioFileTypes();

Воспроизведение MIDI-файла

Файлы MIDI можно воспроизводить с помощью нескольких классов из пакета javax.sound.midi . Sequencer выполняет воспроизведение MIDI-файла, и многие его методы могут использоваться для установки элементов управления воспроизведением, таких как подсчет циклов, темп, отключение звука и другие.

Общее воспроизведение MIDI-данных может быть выполнено следующим образом:

import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class MidiPlayback {
    public static void main(String[] args) {
        try {
            Sequencer sequencer = MidiSystem.getSequencer(); // Get the default Sequencer
            if (sequencer==null) {
                System.err.println("Sequencer device not supported");
                return;
            } 
            sequencer.open(); // Open device
            // Create sequence, the File must contain MIDI file data.
            Sequence sequence = MidiSystem.getSequence(new File(args[0]));
            sequencer.setSequence(sequence); // load it into sequencer
            sequencer.start();  // start the playback
        } catch (MidiUnavailableException | InvalidMidiDataException | IOException ex) {
            ex.printStackTrace();
        }
    }
}

Чтобы остановить воспроизведение, используйте:

sequencer.stop(); // Stop the playback

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

import javax.sound.midi.Track;
// ...

Track[] track = sequence.getTracks();
sequencer.setTrackMute(track[0]);

Секвенсор может воспроизводить последовательность несколько раз, если задано количество циклов. Следующее устанавливает секвенсер для воспроизведения последовательности четыре раза и бесконечно:

sequencer.setLoopCount(3);
sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);

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

sequencer.setLoopStartPoint(512);
sequencer.setLoopEndPoint(32768);
sequencer.setTickPosition(8192);

Секвенсоры также могут играть MIDI-файл с определенным темпом, который можно контролировать, указав темп в битах в минуту (BPM) или микросекундах на четвертную ноту (MPQ). Можно также скорректировать коэффициент, в котором воспроизводится последовательность.

sequencer.setTempoInBPM(1250f);
sequencer.setTempoInMPQ(4750f);
sequencer.setTempoFactor(1.5f);

Когда вы закончите использовать Sequencer , помните, чтобы закрыть его

sequencer.close();

Звук из чистого металла

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

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

Следующий метод генерирует и непосредственно выводит прямоугольную волну заданной частоты в заданном объеме для заданной продолжительности.

public void rectangleWave(byte volume, int hertz, int msecs) {
    final SourceDataLine dataLine;
    // 24 kHz x 8bit, single-channel, signed little endian AudioFormat
    AudioFormat af = new AudioFormat(24_000, 8, 1, true, false);
    try {
        dataLine = AudioSystem.getSourceDataLine(af);
        dataLine.open(af, 10_000); // audio buffer size: 10k samples
    } catch (LineUnavailableException e) {
        throw new RuntimeException(e);
    }

    int waveHalf = 24_000 / hertz; // samples for half a period
    byte[] buffer = new byte[waveHalf * 20];
    int samples = msecs * (24_000 / 1000); // 24k (samples / sec) / 1000 (ms/sec) * time(ms)

    dataLine.start(); // starts playback
    int sign = 1;

    for (int i = 0; i < samples; i += buffer.length) {
        for (int j = 0; j < 20; j++) { // generate 10 waves into buffer
            sign *= -1; 
            // fill from the jth wave-half to the j+1th wave-half with volume
            Arrays.fill(buffer, waveHalf * j, waveHalf * (j+1), (byte) (volume * sign));
        }
        dataLine.write(buffer, 0, buffer.length); // 
    }
    dataLine.drain(); // forces buffer drain to hardware
    dataLine.stop();  // ends playback
}

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

Базовый аудиовыход

Привет, аудио! Java, воспроизводящий звуковой файл из локального или интернет-хранилища, выглядит следующим образом. Он работает с несжатыми файлами .wav и не должен использоваться для воспроизведения mp3 или сжатых файлов.

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;

public class SoundClipTest {

   // Constructor
   public SoundClipTest() {          
      try {
         // Open an audio input stream.           
          File soundFile = new File("/usr/share/sounds/alsa/Front_Center.wav"); //you could also get the sound file with an URL
          AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); 
          AudioFormat format = audioIn.getFormat();             
         // Get a sound clip resource.
         DataLine.Info info = new DataLine.Info(Clip.class, format);
         Clip clip = (Clip)AudioSystem.getLine(info);
         // Open audio clip and load samples from the audio input stream.
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new SoundClipTest();
   }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow