«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

자바로 음악재생 해보기 : 쓰레드 Thread (Daemon Thread) 본문

개발일기/Java

자바로 음악재생 해보기 : 쓰레드 Thread (Daemon Thread)

민장미 2023. 5. 7. 20:26

원래는 틱택톡 게임에 음악 넣어서 만든 후에, 포스팅 하려했는데 ㅠㅠ 오늘 못할 듯

 

우선 음악을 재생해주는 관련 드라이버가 필요하다. 

아래꺼 다운해도 좋고, jlayer검색해서 딴거 받아도 될 듯

jlayer-1.0.1.jar
0.14MB

 

아래 코드에서 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;
			
		}
	}
}	

}

처음 테스트 해봤을 때 , 좀 신기했다.