본문 바로가기

Android/Resource

[Android] MediaPlayer / SoundPool / 간단한 미디어 재생 (mp3, ogg, wav 등)


안드로이드를 사용한 음악재생에 간단하게는 두가지를 사용할 수 있다.

재생시간이 짧은 효과음등을 재생할때는 SoundPool을 사용할 수 있겠고, 재생시간이 긴 배경음악등을 재생할때는 MediaPlayer를 쓸 수 있겠다.

[공통 전제 : 음악파일은 res/raw 폴더에 있다.]
- raw폴더에 있는 미디어 파일 : correct.ogg / background.ogg




1. SoundPool을 이용한 재생




사운드풀은 재생시간이 짧은 미디어파일을 재생하는데 효율적이다.
사운드풀을 이용해서 플레이를 한 경우 짧은 시간밖에 재생되지 않는다.
간단한 게임같은 경우 효과음을 넣는데 쓸 수 있겠다.

 import android.media.SoundPool;
 import android.media.AudioManager;


 private SoundPool sound_pool;
 private int sound_correct;

 -------------------------------------------------------------------------------------------------------

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
// 사운드풀 생성하기
// ** prameters **
// 1: 동시출력 가능 스트림수
// 2: AudioManager에 정의된 스트림 타입
// 3: sample rate 컨버터의 품질. default로 0을 줌

sound_pool = new  SoundPool(5, AudioManager.STREAM_MUSIC, 0);

// 사운드풀 로드하기
// ** prameters **
// 1: context
// 2: resource
// 3: priority
sound_correct = sound_pool.load(getBaseContext(), R.raw.correct, 1);

// 미디어 재생하기
// ** prameters **
// 1: 리소스 식별 
// 2-3: 소리크기 
// 4: 우선순위
// 5: 파라미터 반복정보(0:반복x, 1:1번반복(총2번), -1:무한반복)
// 6: 재생속도(1:1x, 2:2x)
sound_pool.play(sound_correct, 1.0f, 1.0f, 0, 0, 1.0f);
 } 

재생은 이런식으로 간단하게 끝낼 수 있다. 
사실상 미디어 재생시간도 짧게 설정되므로 메모리 관리가 많이 필요없는 어플리케이션이라면 사운드풀 릴리즈에 신경쓸 필요도 없을 듯 하다.

- release를 할 경우
: 사운드풀은 동시출력 가능한 스트림의 수를 정의해서 사용 할 수 있다.
  그렇기 때문에 릴리즈를 할때, 
  각 스트림마다 릴리즈를 할 수 있고, 사운드풀자체에 대해서 릴리즈를 할 수 있다.






2. MediaPlayer를 이용한 재생 





상태 다이어그램 (state diagram)





사운드풀에서 사용했던 효과음등에 비해 비교적 길이가 긴, 음악들을 재생하는데 쓴다.


- res/raw 안에 미디어 파일이 있는 경우 
 import android.media.MediaPlayer;  


 private MediaPlayer background;

 -------------------------------------------------------------------------------------------------------
 
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// MediaPlayer 객체 생성
// ** parameters **
// 1: context
// 2: resource
// background = new MediaPlayer(); // create를 하므로 따로 new를 사용해 생성할 필요가 없다.
background = MediaPlayer.create(getBaseContext(), R.raw.background);

// MediaPlayer 재생
background.start();

// MediaPlayer 정지
background.stop();

// MediaPlater 해제
background.release();
 } 



- SD카드등에서 읽어오는 경우 (onCreate메소드 안에서 이렇게 코딩 하면 재생하자마자 끈다.^^;)
 import android.media.MediaPlayer;  


 private MediaPlayer background;

 -------------------------------------------------------------------------------------------------------
 
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// MediaPlayer 객체 생성
background = new MediaPlayer();

// 미디어파일 소스 설정 및 파일 준비
// ** parameters **
// String : 스트링형식의 파일 경로
background.setDataSource(String);
background.prepare();

// MediaPlayer 반복설정
// ** parameters **
// Boolean : true 또는 false가 들어간다. : true면 반복 활성, false면 반복 비활성
background.setLooping(Boolean); 

// MediaPlayer 음량설정
// ** parameters **
// leftVolume : float형식의 숫자를 입력받는다. 1정도 부터 2, 3 등으로 설정하면 된다. 숫자가 높으면 큼
// rightVolume : leftVolume이랑 같다. 기본적으로 스테레오 출력을 지원해주나보다.
background.setVolume(leftVolume, rightVolume);

// MediaPlayer 재생
background.start();

// MediaPlayer 일시 정지
background.pause();

// MediaPlayer 정지
background.stop();

// MediaPlater 해제
// release는 activity가 종료, 정지될 때(onDestroy, onPause 등에서) 한다.
background.release();
 } 




사실 사운드풀과 미디어플레이어의 옵션설정은 더 많지만, 많이쓰는 필수기능들에 대해서만 다뤄보았다.
기능별로 메소드를 만들어두고 여기저기서 호출해서 사용하면 편리하다.

내 경우 간단한 게임서 효과음의 경우 사운드풀을 사용하고, 배경음악에는 미디어플레이어를 사용했다.



(숫자게임 넘버스 아이콘)