개발일기/Java
자바로 음악재생 해보기 : 쓰레드 Thread (Daemon Thread)
민장미
2023. 5. 7. 20:26
원래는 틱택톡 게임에 음악 넣어서 만든 후에, 포스팅 하려했는데 ㅠㅠ 오늘 못할 듯
우선 음악을 재생해주는 관련 드라이버가 필요하다.
아래꺼 다운해도 좋고, jlayer검색해서 딴거 받아도 될 듯
아래 코드에서 Player 클래스가 위의 드라이버에 있는거 ㅇㅇ 음악 재생하게 해주는 기능
복사해서 프로젝트안에 복붙해서 path 추가해주면 끝. 폴더 뒤질필요없고 이클립스 안에서 마우스 클릭 몇 번만 하면 됨.
여기서 포인트는 음악재생 스레드를 데몬스레드로 만들지 않으면,
UI에서 종료 버튼을 눌러도 음악이 종료가 되지 않는 다는 점이다. (2번 정지버튼은 제대로 작동)
그 상태에서 재실행 무한으로 하면 무한 돌림노래 감상 쌉가능 ~
2번째 코드에서 보면 총 스레드가 메인, 음악재생 2개다.
스레드는 각 독립적이라, 주스레드가 종료되더라도 다른 스레드는 계속 진행이 된다.
주스레드가 종료될 때 , 다른 스레드도 같이 종료되기를 원하면 스레드들을
데몬 스레드로 지정해주면 된다. 데몬스레드가 되면 주스레드에 종속이 된다.
(정확히는 그 프로세스의 다른 스레드가 다 종료되야 데몬스레드가 종료되는 것인데, 이 예제에선
메인, 음악재생 딱 2개만 있으니, 주스레드인 메인스레드가 종료될 때 음악재생스레드도 같이 종료되는 것)
package mp3_Ex;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.nio.Buffer;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
public class Mp3player {
private String mp3; //음악파일 경로
private Player player; // jlayer에서 가져온 플레이어 클래스의 객체
private int position; //위치값
public Mp3player(String mp3) {
this.mp3 = mp3;
} //생성자
public void play() {
BufferedInputStream bis = null;
try {
bis= new BufferedInputStream(new FileInputStream(mp3));
player = new Player(bis);
//플레이어 객체가 bis를 통해서 mp3파일을 바이트단위로 읽어와서 플레이
//음악 재생
} catch (Exception e) {
e.printStackTrace();
}
Thread t = new Thread() {
public void run(){
try {
// 플레이어 객체를통해 클래스 Play 메소드를 사용
player.play();
} catch (JavaLayerException e) {
// TODO Auto-generated catch block
e.printStackTrace(); //이걸 하면 오류남
System.out.println("재생이 안돼?");
//=> BufferedInputStream bis = null;
//버퍼 스트림 오류다
}
};
};
t.setDaemon(true); //이걸 안해주면 3종료를 눌러도 음악이 종료가 안됌
t.start();
} //play
public void close() {
if(player !=null) {
player.close();
}
}
}//class
메인이자 UI 코드
path에 자신이 재생할 음악파일 주소를 넣어주면 된다.
package mp3_Ex;
import java.util.Scanner;
public class MyPlayer {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//외부에서 입력된 값(키보드)이 곧 매개변수
String path = "C:\\Users\\ronan\\Desktop\\Ji\\음악관련소스\\Faceoff.mp3";
Mp3player mp = new Mp3player(path);
ext: while(true) {
System.out.println("menu 1: 플레이 2: 스탑 3: 종료");
int menu = Integer.parseInt(sc.nextLine());
switch (menu) {
case 1:
System.out.println("음악을 플레이");
mp.play();
break;
case 2:
System.out.println("음악을 정지");
mp.close();
break;
case 3:
System.out.println("종료");
break ext;
}
}
}
}
처음 테스트 해봤을 때 , 좀 신기했다.