[Android] ExoPlayer 분석 1. 준비 및 기본 재생

Twaun·2022년 6월 4일
0

Android-Library

목록 보기
3/10

ExoPlayer가 뭐지?

아이돌 그룹 엑소와 연관이?
아쉽게 아니였고..

ExoPlayer는 구글에서 만든 Android의 하위 수준 미디어 API를 토대로 개발된 앱 수준 미디어 플레이어 라이브러리이다.
구글 YouTube에서 사용된다고 하니 믿을 수 있다!!

분석해보자.

준비

안드로이드는 친절하게 샘플 코드 및 가이드를 제공하고 있다.
https://developer.android.com/codelabs/exoplayer-intro?hl=ko#1

다음 저장소를 clone 한다.

git clone https://github.com/googlecodelabs/exoplayer-intro.git

단계별로 모듈이 있는 것을 볼 수 있다.
0-4 단계로 총 5개의 모듈이 존재하고 app 모듈에서 현재 단계의 모듈만 설정해주면 된다.

dependencies {
   implementation project(":exoplayer-codelab-00")
}

첫 0단계는 아무것도 없는 검은색 배경화면이다.

시작

1. 종속 항목 추가

최신 버전 : 1.0.0-alpha03

def mediaVersion = "1.0.0-alpha03"
dependencies {
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation "androidx.media3:media3-exoplayer:$mediaVersion"
    implementation "androidx.media3:media3-ui:$mediaVersion"
    implementation "androidx.media3:media3-exoplayer-dash:$mediaVersion"
}

2. 플레이어 객체 생성

SimpleExoPlayer deprecated -> ExoPlayer

private var player: ExoPlayer? = null
private fun initializePlayer() {
        player = ExoPlayer.Builder(this)
            .build()
            .also { exoPlayer ->
                viewBinding.videoView.player = exoPlayer
            }
    }

3. 미디어 항목 생성

MediaItem을 통해 미디어 항목 생성.

private fun initializePlayer() {
        player = ExoPlayer.Builder(this)
            .build()
            .also { exoPlayer ->
                viewBinding.videoView.player = exoPlayer

                val mediaItem = MediaItem.fromUri(getString(R.string.media_url_mp4))
                exoPlayer.setMediaItem(mediaItem)
            }
    }

4. 생명주기 호환

이 player는 메모리, CPU, 네트워크 연결, 하드웨어 코덱을 비롯한 다양한 리소스를 고갈시킬 수 있습니다. 이러한 리소스의 상당수는 양이 적으며, 특히 하나만 있을 수 있는 하드웨어 코덱의 경우 그렇습니다. 사용 중이 아닐 때(예: 앱이 백그라운드로 전환되는 경우) 다른 앱에서 사용하도록 리소스를 해제하는 것이 중요합니다.

onStart()

public override fun onStart() {
        super.onStart()
        if (Util.SDK_INT > 23) {
            initializePlayer()
        }
    }

onResume()

public override fun onResume() {
        super.onResume()
        hideSystemUi()
        if (Util.SDK_INT <= 23 || player == null) {
            initializePlayer()
        }
    }

onPause()

public override fun onPause() {
        super.onPause()
        if (Util.SDK_INT <= 23) {
            releasePlayer()
        }
    }

onStop()

public override fun onStop() {
        super.onStop()
        if (Util.SDK_INT > 23) {
            releasePlayer()
        }
    }

hideSystemUi()

@SuppressLint("InlinedApi")
    private fun hideSystemUi() {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        WindowInsetsControllerCompat(window, viewBinding.videoView).let { controller ->
            controller.hide(WindowInsetsCompat.Type.systemBars())
            controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }
    }

releasePlayer()

private fun releasePlayer() {
    player?.let { exoPlayer ->
        playbackPosition = exoPlayer.currentPosition
        currentItem = exoPlayer.currentMediaItemIndex
        playWhenReady = exoPlayer.playWhenReady
        exoPlayer.release()
    }
    player = null
}

6. Release 한 정보를 Initialize 할 때 정보 제공

private fun initializePlayer() {
    [...]
    exoPlayer.playWhenReady = playWhenReady
    exoPlayer.seekTo(currentWindow, playbackPosition)
    exoPlayer.prepare()
}

7. 완료

실행하면 잘 실행이 된다!!

💡 초기화 함수에서 URI를 R.string.media_url_mp4(저장 되있음)로 변경하면 동영상을 플레이할 수 있다.

위 코드를 모두 잘 작성한 모듈이 1단계 exoplayer-codelab-01 이다.
다음은 exoplayer-codelab-01 에 이어서 작성될 것이다. [NEXT]

profile
Android Developer

0개의 댓글