Java Language
오디오
수색…
비고
javax.sound.sampled Clip
을 사용하는 대신 애플릿 API의 AudioClip
을 사용할 수도 있습니다. 그러나 AudioClip
이 오래되어 제한된 기능을 제공하므로 Clip
을 사용하는 것이 좋습니다.
루프 된 오디오 파일 재생
필요한 수입 :
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 데이터의 일반적인 재생은 다음과 같이 할 수 있습니다 :
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) 또는 4 분 음표 (MPQ) 당 마이크로 초로 지정하여 제어 할 수 있습니다. 시퀀스가 재생되는 요소도 조정할 수 있습니다.
sequencer.setTempoInBPM(1250f);
sequencer.setTempoInMPQ(4750f);
sequencer.setTempoFactor(1.5f);
Sequencer
사용을 마쳤 으면 그것을 닫으십시오.
sequencer.close();
베어 메탈 사운드
Java로 사운드를 생성 할 때 거의 베어 메탈로 이동할 수도 있습니다. 이 코드는 OS 바이너리 데이터를 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();
}
}