일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자취필수템
- 한달독서
- 면접
- 브런치작가되기
- 베드테이블
- 목적중심리더십
- 테트리스
- 슬기로운 온라인 게임
- 한달브런치북만들기
- 북한살둘레길
- 소프시스 밤부 좌식 엑슬 테이블
- 한단어의힘
- 베드트레이
- 캐치마인드
- 끝말잇기
- 아비투스
- 좌식테이블
- 프래그먼트
- T자형인재
- 어떻게 나답게 살 것인가
- 1일1커밋
- 소프시스
- 지지않는다는말
- 함수형 프로그래밍
- 안드로이드
- 리얼하다
- 재택근무
- 커스텀린트
- 한달어스
- 목적 중심 리더십
- Today
- Total
정상에서 IT를 외치다
[Android, MediaPlayer] MediaPlayer 를 이용한 동영상 재생 본문
안녕하세요. 블랙진입니다.
안드로이드에서는 비디오를 재생시키기 위한 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 의 전체 코드 입니다.
<참고자료>
'안드로이드' 카테고리의 다른 글
[Android, Thread] Thread 넌 무엇이더냐? (0) | 2019.03.26 |
---|---|
[Android, ExoPlayer2] ExoPlayer2 개념 및 사용방법 (3) | 2019.03.25 |
[Android, OOM] 메모리릭과 OOM이란? (2) | 2019.03.23 |
[Android, ANR] Android Not Responding 는 무엇인가? (0) | 2019.03.23 |
[Android, Kotlin] 코틀린의 run, with, apply, let, also 정리 (0) | 2019.03.18 |