Java Language
Audio
Suche…
Bemerkungen
Anstelle des Clip
javax.sound.sampled können Sie auch den AudioClip
der Applet-API verwenden. Es wird jedoch empfohlen, Clip
zu verwenden, da AudioClip
nur älter ist und nur eingeschränkte Funktionen bietet.
Spielen Sie eine Audiodatei Looped
Notwendige Importe:
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
Dieser Code erstellt einen Clip und spielt ihn nach dem Start fortlaufend ab:
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new URL(filename)));
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
Holen Sie sich ein Array mit allen unterstützten Dateitypen:
AudioFileFormat.Type [] audioFileTypes = AudioSystem.getAudioFileTypes();
Spielen Sie eine MIDI-Datei
MIDI-Dateien können mit mehreren Klassen aus dem Paket javax.sound.midi
werden. Ein Sequencer
führt die Wiedergabe der MIDI-Datei aus, und viele seiner Methoden können verwendet werden, um Wiedergabesteuerelemente wie Loop-Count, Tempo, Spur-Muting und andere einzustellen.
Die allgemeine Wiedergabe von MIDI-Daten kann auf folgende Weise erfolgen:
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();
}
}
}
Um die Wiedergabe zu stoppen, verwenden Sie:
sequencer.stop(); // Stop the playback
Ein Sequenzer kann so eingestellt werden, dass eine oder mehrere Spuren der Sequenz während der Wiedergabe stummgeschaltet werden, sodass keines der Instrumente der angegebenen Musik wiedergegeben wird. Im folgenden Beispiel wird der erste Track in der Sequenz stummgeschaltet:
import javax.sound.midi.Track;
// ...
Track[] track = sequence.getTracks();
sequencer.setTrackMute(track[0]);
Ein Sequenzer kann eine Sequenz wiederholt abspielen, wenn die Anzahl der Schleifen angegeben ist. Im Folgenden wird der Sequenzer so eingestellt, dass eine Sequenz viermal und unbegrenzt abgespielt wird:
sequencer.setLoopCount(3);
sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
Der Sequenzer muss die Sequenz nicht immer von Anfang an spielen, noch muss er die Sequenz bis zum Ende spielen. Sie kann an einem beliebigen Punkt beginnen und enden, indem Sie das Häkchen in der Sequenz festlegen, mit der begonnen und beendet wird. Es ist auch möglich, manuell festzulegen, von welchem Tick in der Sequenz der Sequenzer abgespielt werden soll:
sequencer.setLoopStartPoint(512);
sequencer.setLoopEndPoint(32768);
sequencer.setTickPosition(8192);
Sequenzer können auch eine MIDI-Datei in einem bestimmten Tempo abspielen, das durch Angabe des Tempos in Beats pro Minute (BPM) oder Mikrosekunden pro Viertelnote (MPQ) gesteuert werden kann. Der Faktor, bei dem die Sequenz gespielt wird, kann ebenfalls eingestellt werden.
sequencer.setTempoInBPM(1250f);
sequencer.setTempoInMPQ(4750f);
sequencer.setTempoFactor(1.5f);
Wenn Sie mit dem Sequencer
fertig sind, schließen Sie ihn bitte
sequencer.close();
Bare-Metal-Sound
Wenn Sie mit Java Sound erzeugen, können Sie auch fast nackt sein. Dieser Code schreibt rohe Binärdaten in den OS-Audiopuffer, um Ton zu erzeugen. Es ist äußerst wichtig, die Einschränkungen und notwendigen Berechnungen zur Erzeugung eines solchen Sounds zu verstehen. Da die Wiedergabe grundsätzlich sofort erfolgt, müssen Berechnungen nahezu in Echtzeit durchgeführt werden.
Daher ist dieses Verfahren für eine kompliziertere Tonabtastung unbrauchbar. Für solche Zwecke ist die Verwendung von Spezialwerkzeugen der bessere Ansatz.
Das folgende Verfahren erzeugt eine Rechteckwelle einer gegebenen Frequenz in einem gegebenen Volumen für eine gegebene Dauer und gibt diese direkt aus.
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
}
Für eine differenziertere Art, verschiedene Schallwellen zu erzeugen, sind Sinusberechnungen und möglicherweise größere Stichprobengrößen erforderlich. Dies führt zu wesentlich komplexerem Code und wird dementsprechend hier weggelassen.
Grundlegende Audioausgabe
Das Hallo Audio! von Java, das eine Audiodatei aus lokalem oder Internetspeicher abspielt, sieht wie folgt aus. Es funktioniert für unkomprimierte WAV-Dateien und sollte nicht für die Wiedergabe von MP3- oder komprimierten Dateien verwendet werden.
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();
}
}