정상에서 IT를 외치다

[Android, MediaPlayer] MediaPlayer 를 이용한 동영상 재생 본문

안드로이드

[Android, MediaPlayer] MediaPlayer 를 이용한 동영상 재생

Black-Jin 2019. 3. 25. 10:02
반응형


안녕하세요. 블랙진입니다.


안드로이드에서는 비디오를 재생시키기 위한 VideoView 를 제공해 줍니다. 혹은 MediaPlayer 와 SurfaceView 를 사용해서 비디오를 보여줄 수 있습니다. 이번 시간에는 MediaPlayer 와 SurfaceView 를 사용하여 비디오를 안드로이드 화면상에 보여주는 법에 대해 포스팅 해보겠습니다.



MediaPlayer 는 무엇인가?


MediaPlayer class can be used to control playback of audio/video files and streams. - 구글문서

MediaPlayer 는 오디오와 비디오 파일 혹은 스트림을 컨트롤 할 수 있는 클래스 입니다.



상태 다이어그램


출처 : 구글문서



위 다이어그램을 보기위해서는 먼저 화살표의 의미를 알아야합니다.


1. 싱글 머리 화살표는 동기화 함수 호출을 의미합니다.

2. 더블 머리 화살표는 비동기화 함수 호출을 의미합니다.


위 상태 다이어그램의 순서에 맞춰 MediaPlayer 를 준비해야 합니다. 이는 아래 "비디오 재생하기" 예제를 통해서 살펴보겠습니다.



비디오 재생하기


1. activity_main.xml


미디어플레이어를 사용해서 비디오를 재생하기 위해서는 SurfaceView 를 사용해야합니다.  SurfaceView는 View 를 상속받은 클래스로 백그라운드 스레드를 사용해 화면을 업데이트 해줍니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="300dp"
android:layout_height="300dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>



2. MainActivity.class


- 변수 선언 및 초기화

SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
MediaPlayer mediaPlayer;
surfaceView = findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);


- SurfaceHolder.Callback 

implements SurfaceHolder.Callback

MainActivity.class 에 위 함수를 implements 해줍니다. 그러면 3가지 함수를 오버라이딩 하게 됩니다.

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {

}

@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

}

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

}

함수명 그대로 해석하시면 됩니다. SurfaceView 가 생성되었을 때, 변화되었을 때, 종료되었을 때를 의미합니다.


surfaceCreated 함수에서 mediaPLayer 함수를 초기화 해줍니다.

if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
} else {
mediaPlayer.reset();
}

try {

String path = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";
mediaPlayer.setDataSource(path);

//mediaPlayer.setVolume(0, 0); //볼륨 제거
mediaPlayer.setDisplay(surfaceHolder); // 화면 호출
mediaPlayer.prepare(); // 비디오 load 준비

//mediaPlayer.setOnCompletionListener(completionListener); // 비디오 재생 완료 리스너

mediaPlayer.start();

} catch (Exception e) {
Log.e("MyTag","surface view error : " + e.getMessage());
}

mediaPlayer 의 null 여부를 확인 후 없으면 이를 생성해줍니다. 그다음 setDisplay 함수를 사용해 surfaceHolder 와 연결 후 위 상태다이어그램에서 보았듯 prepare() -> start() 순으로 호출해 줍니다. 이때 사용한 동영상 샘플 링크는 test Videos 에서 가져왔습니다.


내부 파일을 사용할 때는 인터넷 연결이 필요없지만 외부 스트림을 사용했기 때문에 AndroidManifest 에 인터넷 접근권한을 추가해 주어야 합니다.

<uses-permission android:name="android.permission.INTERNET" />

위에 "비디오 재생 완료 리스너" 라고 주석을 친 부분은 mediaPlayer 의 리스너를 받아 재생, 정지 와 같은 함수를 사용할 수 있는 부분입니다. 이번 포스팅에서는 다루지 않고 관련 링크를 남기겠습니다.


surfaceDestroyed 함수에서는 mediaPlayer 함수를 해제해줍니다. mediaPlayer 을 더이상 사용하지 않을 때 에는 상태 다이어그램에서 보듯이 release() 함수를 사용하여 해제해주어야 합니다.

if (mediaPlayer != null) {
mediaPlayer.release();
}


아래는 MainActivity 의 전체 코드 입니다.




<참고자료>

구글문서 - 미디어 플레이어란?

구글문서 - 미디어 플레이어 사용법

MediaPlayer & VideoView


반응형
Comments