안드로이드 오디오

2011. 2. 17. 13:26Scrapbook/개발 및 프로그래밍

반응형

http://www.winapi.co.kr/android/annex/18-1.htm

public MediaPlayer ()

 

객체만 생성된 상태에서는 재생할 대상이 없으므로 아무 것도 할 수 없으며 재생할 미디어를 전달해야 한다. 두 가지 방법이 있는데 첫 번째는 다음 메서드를 호출하는 것이다. 스트림의 종류에 따라 여러 버전으로 오버로딩되어 있다.

 

void setDataSource (String path)

void setDataSource (Context context, Uri uri)

void setDataSource (FileDescriptor fd, [long offset, long length])

 

로컬 파일이나 Uri 객체로부터 원격지의 미디어를 연다. 리턴값은 없으며 에러 발생시 예외가 리턴되는데 이 예외는 반드시 처리해야 한다. 스트림을 열었다고 해서 바로 재생할 수는 없으며 약간의 준비가 필요하다. 예를 들어 동영상의 경우 필요한 코덱을 찾고 원활한 재생을 위해 얼마간의 버퍼를 할당해야 할 것이다. 대용량 스트림인 경우 상당한 시간이 걸릴 수 있으므로 오픈 직후 자동으로 준비 상태가 되지는 않으며 다음 메서드를 호출해야 한다.

 

void prepare ()

void prepareAsync ()

 

prepare 메서드는 동기적으로 준비를 하며 준비가 끝나면 리턴한다. 만약 준비 시간이 아주 오래 걸린다면 비동기적으로 동작하는 prepareAsync 메서드를 호출하고 콜백을 통해 준비 완료를 통보받아야 한다. 준비 상태가 되면 이후 바로 재생 가능하다. 객체 생성, 스트림 열기, 준비 과정을 거쳐야 하므로 상당히 번거로운데 두번째 방법은 좀 더 단순하다. 다음 정적 메서드를 호출하면 모든 과정이 내부에서 수행된다.

 

static MediaPlayer create (Context context, int resid)

static MediaPlayer create (Context context, Uri uri, [SurfaceHolder holder])

 

create 메서드는 리소스로부터 스트림을 열 수 있으나 파일을 열지는 못한다. 리소스의 미디어는 보통 크기가 작으므로 오픈 직후 자동으로 준비 상태가 되며 바로 재생 가능하다. 에러 발생시는 예외를 던지는 대신 null을 리턴한다. 간단한 효과음을 재생할 때는 이 메서드를 호출하는 것이 훨씬 더 간편하다. 다음은 재생 관련 메서드이다.

 

void start ()

void stop ()

void pause ()

 

이름이 너무 직관적이라 재생을 시작, 정지, 일시 중지한다는 설명은 굳이 하지 않아도 될 정도다. start 메서드는 재생을 시작한 후 즉시 리턴하므로 사운드 재생중에도 다른 작업을 할 수 있다. 재생이 시작되면 스트림의 끝까지 재생한 후 자동으로 멈춘다. 만약 반복적으로 재생하려면 다음 메서드로 반복 지정한다.

 

void setLooping (boolean looping)

boolean isLooping ()

 

setLooing(true)를 호출해 두면 한 스트림을 계속 반복하는데 게임의 배경 음악 재생용으로 적합하다. MediaPlayer를 다 사용한 후에는 다음 메서드로 정리한다.

 

void release ()

void reset ()

release는 객체를 완전히 파괴하여 더 이상 사용할 수 없는 상태로 해제한다. 음악을 재생하는 중에도 release는 언제든지 호출 가능하다. reset은 초기화되지 않은 처음 상태로 객체를 되돌리며 이후 재초기화하여 다시 사용할 수 있다는 점에서 release와 다르다. 사운드를 재생하는 두 가지 경로를 정리해 보면 다음과 같다.

create 정적 메서드로 생성하는 것이 훨씬 더 간편해 보이지만 대용량 미디어에는 효율이 좋지 않으므로 아주 짧은 미디어에만 사용하는 것이 바람직하다. 그럼 이제 각 방법으로 사운드를 재생하는 예제를 만들어 보자.

 

mm_MPTest

public class mm_MPTest extends Activity {

     MediaPlayer mPlayer;

 

     public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.mm_mptest);

 

          // 리소스 재생

          findViewById(R.id.btn1).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   MediaPlayer player = MediaPlayer.create(mm_MPTest.this, R.raw.dingdong);

                   player.start();

              }

          });

 

          // 파일 재생

          findViewById(R.id.btn2).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   MediaPlayer player = new MediaPlayer();

                   try {

                        player.setDataSource("/sdcard/eagle5.mp3");

                        player.prepare();

                        player.start();

                   } catch (Exception e) {

                        Toast.makeText(mm_MPTest.this, "error : " + e.getMessage(), 0).show();

                   }

              }

          });

 

          // 스트림 재생

          findViewById(R.id.btn3).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   MediaPlayer player = new MediaPlayer();

                   try {

                        Uri uri = Uri.parse("http://www.winapi.co.kr/data/saemaul1.mp3");

                        player.setDataSource(mm_MPTest.this, uri);

                        player.prepare();

                        player.start();

                   } catch (Exception e) {

                        Toast.makeText(mm_MPTest.this, "error : " + e.getMessage(), 0).show();

                   }

              }

          });

 

          // 미리 준비된 객체로 재생

          mPlayer = MediaPlayer.create(this, R.raw.dingdong);

          findViewById(R.id.btn4).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   mPlayer.seekTo(0);

                   mPlayer.start();

              }

          });

 

          // 준비하지 않은 상태로 재생

          findViewById(R.id.btn5).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   MediaPlayer player = new MediaPlayer();

                   try {

                        player.setDataSource("/sdcard/eagle5.mp3");

                        player.start();

                   } catch (Exception e) {

                        Toast.makeText(mm_MPTest.this, "error : " + e.getMessage(), 0).show();

                   }

              }

          });

 

          // 다른 파일 열기

          findViewById(R.id.btn6).setOnClickListener(new Button.OnClickListener() {

              public void onClick(View v) {

                   MediaPlayer player = MediaPlayer.create(mm_MPTest.this, R.raw.dingdong);

                   //player.reset();

                   try {

                        player.setDataSource("/sdcard/eagle5.mp3");

                        player.prepare();

                        player.start();

                   } catch (IllegalArgumentException e) {

                        Toast.makeText(mm_MPTest.this, "IllegalArgumentException", 0).show();

                   } catch (IllegalStateException e) {

                        Toast.makeText(mm_MPTest.this, "IllegalStateException", 0).show();

                   } catch (IOException e) {

                        Toast.makeText(mm_MPTest.this, "IOException", 0).show();

                   }

              }

          });

     }

 

     public void onDestroy() {

        super.onDestroy();

        if (mPlayer != null) {

          mPlayer.release();

          mPlayer = null;

        }

    }

}

 


반응형