Java Language
аудио
Поиск…
замечания
Вместо использования 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();
}
}