수색…


비고

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();
   }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow