본문 바로가기
개발/Android

[Android] ExoPlayer2 사용방법

by blacktree 2023. 2. 28.
반응형

안드로이드의 ExoPlayer는 Google에서 제공하는 미디어 재생 라이브러리로, 플레이리스트, 자막, 광고, 암호화 된 미디어 등 다양한 기능을 제공합니다. 이번 글에서는 ExoPlayer를 사용하여 안드로이드 앱에서 미디어를 재생하는 방법에 대해 알아보겠습니다.

 

목차

  1. Gradle에 추가하기
  2. ExoPlayerView 추가하기
  3. ExoPlayer 객체 생성하기
  4. 미디어 소스 생성하기
  5. ExoPlayer 준비하기
  6. 미디어 재생하기
  7. ExoPlayer 정리하기

 

1. Gradle에 추가하기

안드로이드 앱에서 ExoPlayer를 사용하기 위해서는 Gradle에 추가해야 합니다. build.gradle 파일에 다음 코드를 추가합니다.

implementation 'com.google.android.exoplayer:exoplayer:2.15.1'

 

2. ExoPlayerView 추가하기

ExoPlayerView는 미디어 재생에 사용되는 뷰입니다. 레이아웃 파일에 ExoPlayerView를 추가합니다.

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:use_controller="false"
/>

여기서 use_controller 속성은 기본 컨트롤러를 사용하지 않도록 설정하는 속성입니다. 이 경우, 사용자 지정 컨트롤러를 구현하여 미디어 재생을 제어해야 합니다.

 

3. ExoPlayer 객체 생성하기

ExoPlayer 객체를 생성하고 초기화합니다. ExoPlayer 객체는 미디어를 재생하는 데 사용됩니다. 다음은 ExoPlayer 객체를 초기화하는 코드입니다.

private lateinit var player: SimpleExoPlayer
private lateinit var playerView: PlayerView

private fun initializePlayer() {
    player = SimpleExoPlayer.Builder(context).build()
    playerView.player = player
}

 

4. 미디어 소스 생성하기

ExoPlayer는 다양한 미디어 소스를 지원합니다. 각각의 미디어 소스에는 그에 맞는 생성 방법과 설정이 필요합니다. 예를 들어, ProgressiveMediaSource는 로컬에 저장된 mp4 파일과 같이 진행형 미디어를 지원하며, HlsMediaSource는 HTTP Live Streaming(HLS) 방식의 미디어를 지원합니다.

다음은 HlsMediaSource를 사용하여 미디어 소스를 생성하는 코드입니다.

private fun buildMediaSource(uri: Uri): MediaSource {
    val userAgent = "exoplayer-codelab"
    return HlsMediaSource.Factory(DefaultDataSourceFactory(context, userAgent))
        .createMediaSource(MediaItem.fromUri(uri))
}

위 코드에서 DefaultDataSourceFactory는 ExoPlayer에서 사용할 데이터 소스를 생성합니다. HlsMediaSource.Factory는 HLS 미디어 소스를 생성하기 위한 팩토리입니다. createMediaSource 메서드는 지정된 URI에서 미디어 소스를 생성합니다.

또한, ProgressiveMediaSource를 사용하여 로컬에 저장된 mp4 파일과 같은 미디어를 재생할 수 있습니다. 다음은 ProgressiveMediaSource를 사용하여 미디어 소스를 생성하는 코드입니다.

private fun buildMediaSource(uri: Uri): MediaSource {
    val userAgent = "exoplayer-codelab"
    return ProgressiveMediaSource.Factory(DefaultDataSourceFactory(context, userAgent))
        .createMediaSource(MediaItem.fromUri(uri))
}

위 코드에서 ProgressiveMediaSource.Factory는 프로그레시브 다운로드 미디어 소스를 생성하기 위한 팩토리입니다.

 

5. ExoPlayer 준비하기

미디어 소스를 생성하고 나면, ExoPlayer를 준비해야 합니다. 준비 과정은 다음과 같습니다.

private fun preparePlayer() {
    val uri = Uri.parse(getString(R.string.media_url_mp3))
    val mediaSource = buildMediaSource(uri)
    player.prepare(mediaSource)
    player.playWhenReady = true
}

위 코드에서 Uri.parse 메서드는 재생할 미디어 파일의 URI를 파싱합니다. buildMediaSource 메서드에서는 해당 URI에서 미디어 소스를 생성하며, player.prepare 메서드를 사용하여 ExoPlayer를 준비합니다. player.playWhenReady 속성을 true로 설정하여 ExoPlayer를 자동 재생할 수 있습니다.

 

6. 미디어 재생하기

미디어 소스와 ExoPlayer가 준비되면, player.play 메서드를 호출하여 미디어를 재생할 수 있습니다.

private fun playMedia() {
    player.play()
}

위 코드에서 player.play 메서드를 호출하여 미디어를 재생합니다. ExoPlayer는 미디어를 재생하면서 EventListener 인터페이스를 통해 다양한 이벤트를 제공합니다. 예를 들어, Player.EventListener를 구현하여 ExoPlayer에서 발생하는 이벤트를 캐치할 수 있습니다.

private val eventListener = object : Player.EventListener {
    override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
        super.onPlayerStateChanged(playWhenReady, playbackState)
        when (playbackState) {
            Player.STATE_IDLE -> {
                // Player is idle
            }
            Player.STATE_BUFFERING -> {
                // Player is buffering
            }
            Player.STATE_READY -> {
                // Player is ready to play
            }
            Player.STATE_ENDED -> {
                // Player has ended playing
            }
            else -> {
                // Other player states
            }
        }
    }
}

위 코드에서 onPlayerStateChanged 메서드는 ExoPlayer의 상태 변화를 감지합니다. playWhenReady는 자동 재생 여부를 나타내며, playbackState는 재생 상태를 나타냅니다. ExoPlayer의 재생 상태는 다음과 같습니다.

  • Player.STATE_IDLE: ExoPlayer가 초기화되지 않은 상태
  • Player.STATE_BUFFERING: 미디어가 버퍼링되고 있음을 나타냄
  • Player.STATE_READY: ExoPlayer가 준비되어 미디어를 재생할 수 있는 상태
  • Player.STATE_ENDED: 미디어가 끝까지 재생된 상태

 

7. ExoPlayer 정리하기

ExoPlayer를 사용한 후에는 항상 release 메서드를 호출하여 ExoPlayer를 정리해야 합니다.

private fun releasePlayer() {
    player.release()
}

위 코드에서 player.release 메서드를 호출하여 ExoPlayer를 정리합니다.

이상으로 ExoPlayer를 사용하여 안드로이드 앱에서 미디어를 재생하는 방법에 대해 알아보았습니다. ExoPlayer를 사용하면 간단하게 미디어를 재생할 수 있으며, 다양한 컨텐츠 형식과 프로토콜을 지원합니다. ExoPlayer는 안정적이고 유연하며, 높은 성능을 제공하여 안드로이드 앱에서 미디어를 재생하는 데에 적합한 라이브러리입니다.

728x90
반응형

댓글