Files
java-examples/docs/javax.sound.sampled.md

6.1 KiB

Java javax.sound.sampled 쉽게 배우기

1. javax.sound.sampled란?

javax.sound.sampled 패키지는 자바에서 오디오(소리)를 다루는 기능을 제공한다.
이를 이용하면 오디오 파일을 재생, 녹음, 변환, 편집할 수 있다.

주요 기능
✔ 오디오 파일(WAV, AIFF 등) 재생
✔ 마이크 입력 받아 녹음
✔ 오디오 데이터 변환


2. 주요 클래스 및 메서드 정리

(1) AudioSystem 클래스 (오디오 시스템 제어)

메서드 설명
getClip() 짧은 오디오를 재생하는 Clip 객체 반환
getAudioInputStream(File file) 오디오 파일을 AudioInputStream으로 가져오기
getMixerInfo() 사용 가능한 믹서(입출력 장치) 목록 가져오기
getLine(DataLine.Info info) 특정 오디오 라인(스피커, 마이크 등) 가져오기

(2) Clip 클래스 (짧은 오디오 재생)

메서드 설명
open(AudioInputStream stream) 오디오 데이터를 로드하여 준비
start() 오디오 재생 시작
stop() 오디오 재생 중지
loop(int count) 오디오를 반복 재생

(3) SourceDataLine 클래스 (실시간 오디오 출력)

메서드 설명
open(AudioFormat format) 특정 형식의 오디오를 출력하도록 설정
write(byte[] data, int offset, int length) 오디오 데이터를 출력(재생)
start() 오디오 출력 시작
stop() 오디오 출력 중지

(4) TargetDataLine 클래스 (마이크 입력 녹음)

메서드 설명
open(AudioFormat format) 특정 형식의 오디오를 입력받도록 설정
start() 녹음 시작
read(byte[] buffer, int offset, int length) 마이크 입력 데이터를 읽기
stop() 녹음 중지

(5) AudioInputStream 클래스 (오디오 데이터 스트림)

메서드 설명
read(byte[] buffer, int offset, int length) 오디오 데이터를 읽어오기
skip(long n) 지정된 바이트 수만큼 건너뛰기
close() 스트림 닫기

3. 자바로 오디오 재생하기

✔ WAV 파일 재생 예제 (Clip 사용)

import javax.sound.sampled.*;
import java.io.File;

public class AudioPlayer {
    public static void main(String[] args) {
        try {
            File audioFile = new File("sound.wav"); // 재생할 파일
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
            
            Clip clip = AudioSystem.getClip();
            clip.open(audioStream);
            clip.start(); // 재생 시작
            
            Thread.sleep(clip.getMicrosecondLength() / 1000); // 재생 시간만큼 대기
            clip.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Clip을 사용하면 짧은 오디오 파일을 쉽게 재생할 수 있다.


4. 자바로 마이크 녹음하기

✔ 마이크 입력 받아 WAV 파일 저장

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

public class AudioRecorder {
    public static void main(String[] args) {
        try {
            AudioFormat format = new AudioFormat(44100, 16, 2, true, true);
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(info);
            
            microphone.open(format);
            microphone.start();
            
            File outputFile = new File("recorded.wav");
            AudioInputStream audioStream = new AudioInputStream(microphone);
            
            System.out.println("녹음 시작! 5초간 녹음합니다...");
            AudioSystem.write(audioStream, AudioFileFormat.Type.WAVE, outputFile);
            
            Thread.sleep(5000);
            microphone.stop();
            microphone.close();
            
            System.out.println("녹음 완료! 파일 저장: " + outputFile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

마이크로 5초 동안 녹음하고 WAV 파일로 저장한다.


5. 자바에서 실시간 오디오 재생

SourceDataLine을 사용한 실시간 오디오 출력

import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;

public class RealTimeAudioPlayer {
    public static void main(String[] args) {
        try {
            File audioFile = new File("sound.wav");
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
            AudioFormat format = audioStream.getFormat();
            
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
            SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(info);
            sourceLine.open(format);
            sourceLine.start();
            
            byte[] buffer = new byte[4096];
            int bytesRead;
            
            while ((bytesRead = audioStream.read(buffer)) != -1) {
                sourceLine.write(buffer, 0, bytesRead);
            }
            
            sourceLine.drain();
            sourceLine.close();
            audioStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

오디오 데이터를 한 번에 조금씩 읽어 재생하는 방식으로, 큰 파일도 재생할 수 있다.


6. 정리

javax.sound.sampled는 자바에서 오디오를 다루는 표준 API이다!
파일 재생 (Clip) / 실시간 출력 (SourceDataLine) / 마이크 입력 (TargetDataLine) 등 다양한 기능 제공
오디오 포맷 변환, 녹음 및 편집도 가능

자바로 간단한 음악 플레이어나 음성 녹음 프로그램을 만들 수 있다!