JAVA 외부 API 활용, MP3 플레이어, MVC 패턴

JAVA 외부 API(JAR) 활용하여 MP3 플레이어 만들기

MP3 파일을 재생, 중단, 다시시작하는 기능을 구현해보도록 하자.

프로젝트 구조

자세한 프로젝트 내용은 github 링크를 참조하자.

  • src
    • └MusicPlayer
      • └GUIMain.java
      • └Main.java
      • └MusicPlayer.java
      • └MusicVO.java
    • └MusicFile
      • └musicList.txt
      • └music1.mp3
      • └music2.mp3
      • └music3.mp3
      • ...
  • jar
    • └player.jar

외부 API 의 활용

jar, Java Archaive
위의 프로젝트 구조에 보면 jar 폴더 밑에 player.jar 라는 파일이 있다. 실습을 위해서는 프로젝트에 위와 같이 해당 파일을 추가시켜주어야 한다. MP3 음악 파일을 제어하는 기능을 우리가 공부하여 구현하는데만도 상당한 비용이 소모될 것이기에, 누군가가 미리 만들어놓은 재생 기능을 활용하는 것이다.

프로젝트에 외부 라이브러리(jar) 파일 수동 추가

Eclipse에서 프로젝트에 외부 jar 추가하기
IntelliJ에서 프로젝트에 외부 jar 추가하기

위 링크를 참고하여 아래 첨부된 jar 파일을 라이브러리로 추가한다.
이 파일은 MP3를 제어할 수 있는 기능이 구현되어있는 라이브러리다.

2020년인 현재, MP3 를 제어할 수 있는 더 세련된 방법이 있지 않을까 싶다. 예제 진행용으로만 참고하도록 하자.

player.jar
0.14MB

클래스 생성

총 3개의 Class 생성한다. 이 또한 MVC 패턴으로 만들어졌음을 기억하자. 

  • Main: 메뉴출력(), 재생정보출력()
  • MusicVO: 제목, 가수, 재생시간, 파일경로
  • MusicPlayer: 노래리스트, 재생(), 정지(), 이전곡(), 다음곡()

 

 

JAVA MP3 플레이어 코드

MusicVO 를 만들때 파일 경로를 포함하게 되어 있는데, 이 때 절대경로 또는 상대경로로
위에서 제시된 프로젝트 구조(github 프로젝트)대로 파일을 구성하였다면 아래 코드(github 코드와 다름, github 코드는 절대경로로 mp3 위치를 명시)와 같이 표현할 수 있다.

 

src/MusicPlayer/Main.java

package com.compay;

import com.company.MusicPlayer;
import com.company.MusicVO;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // 메뉴 출력(), 재생정보 출력()
        ArrayList<MusicVO> playlist = new ArrayList<MusicVO>();
        playlist.add(new MusicVO("뱅뱅뱅", "빅뱅", 100, ".\\src\\music\\bangbangbang.mp3"));
        playlist.add(new MusicVO("오빠차", "인크레더블", 120, ".\\src\\music\\brothercar.mp3"));
        playlist.add(new MusicVO("cheerup", "트와이스", 143, ".\\src\\music\\cheerup.mp3"));
        playlist.add(new MusicVO("daddy", "싸이", 190, ".\\src\\music\\daddy.mp3"));
        playlist.add(new MusicVO("dumbdumb", "레드벨벳", 110, ".\\src\\music\\dumbdumb.mp3"));
        playlist.add(new MusicVO("유리구슬", "여자친구", 170, ".\\src\\music\\glass.mp3"));
        playlist.add(new MusicVO("IcecreamCake", "레드벨벳", 110, ".\\src\\music\\icecreamcake.mp3"));
        playlist.add(new MusicVO("이럴거면그러지말지", "백아연", 90, ".\\src\\music\\no.mp3"));
        playlist.add(new MusicVO("위아래", "EXID", 110, ".\\src\\music\\updown.mp3"));
        playlist.add(new MusicVO("uptownpuck", "브루노마스", 90, ".\\src\\music\\uptownpunk.mp3"));

        MusicPlayer mp = new MusicPlayer(playlist);
        boolean onOff = true;

        while (onOff) {
            System.out.println("[1]재생  [2]정지  [3]이전곡  [4]다음곡  [5]종료");
            switch (new Scanner(System.in).nextInt()) {
                case 1:
                    MusicVO currentMusic = mp.play();
                    System.out.println(currentMusic.getTitle());
                    break;
                case 2:
                    mp.stop();
                    System.out.println("정지");
                    break;
                case 3:
                    MusicVO previouMusic = mp.previous();
                    System.out.println(previouMusic.getTitle());
                    break;
                case 4:
                    MusicVO nextMusic = mp.next();
                    System.out.println(nextMusic.getTitle());
                    break;
                case 5:
                    System.out.println("종료");
                    onOff = false;
                    break;
            }

        }
    }

}

src/MusicPlayer/MusicVO.java

package MusicPlayer;

public class MusicVO {
    //제목, 가수, 재생시간, 파일경로
    private String title;
    private String singer;
    private int playTime;
    private String path;

    public MusicVO(String title, String singer, int playTime, String path) {
        super();
        this.title = title;
        this.singer = singer;
        this.playTime = playTime;
        this.path = path;
    }

    public String getTitle() {
        return title;
    }

    public String getSinger() {
        return singer;
    }

    public int getPlayTime() {
        return playTime;
    }

    public String getPath() {
        return path;
    }

}

src/MusicPlayer/MusicPlayer.java

package MusicPlayer;

import java.util.ArrayList;

import javazoom.jl.player.MP3Player;

public class MusicPlayer {
    //노래리스트,  재생(), 정지(), 이전곡(), 다음곡()
    private ArrayList<MusicVO> playlist = new ArrayList<MusicVO>();
    private MP3Player mp3Player;
    private int index;

    public MusicPlayer(ArrayList<MusicVO> playlist) {
        this.playlist = playlist;
        this.mp3Player = new MP3Player();
    }

    public ArrayList<MusicVO> getPlaylist() {
        return playlist;
    }

    public void indexNum(int index) {
        if(index < 0) {
            index = playlist.size() - 1;
        } else if(index >= playlist.size()) {
            index = 0;
        }
        this.index = index;
    }

    public MusicVO play() {
        MusicVO m = playlist.get(index);
        if(mp3Player.isPlaying()) {
            mp3Player.stop();
        }
        mp3Player.play(m.getPath());

        return m;
    }

    public void stop() {
        if(mp3Player.isPlaying()) {
            mp3Player.stop();
        }
    }

    public MusicVO previous() {
        indexNum(index-1);

        return play();
    }

    public MusicVO next() {
        indexNum(index+1);

        return play();
    }

}

실행해보기

아래와 같은 UI 로 음악을 재생시킬 수 있다.

Value Object

VO라고 불리는 특별한 역할을 위해 정의된 이 용어는, 크게 2가지의 역할을 의미한다.

첫번째는 VO 클래스를 자료형(따라서 새로운 자료형이 된다.)처럼 사용하겠다라는 것이다.
나머지 하나는 기능을 수행하는 객체로서 동작하게 하겠다는 것이다.

곧 특정 데이터를 객체화시킴으로써, 해당 데이터의 저장 및 데이터의 동작(보통 객체의 속성을 가공한 정보를 return하는)의 기능을 부여하는 것이다.

개발자의 자세: 플랫폼을 만든다는 생각으로

항상 개발을 할 때에는 사용자가 프로그램에 대해 잘 몰라도 사용할 수 있도록 "플랫폼"을 만든다고 생각하기

반응형

Designed by JB FACTORY