반응형

ExoPlayer

설명

  • 구글에서 만든 오픈 소스 미디어 플레이 라이브러리
  • MediaPlayer보다 작고 유연하며 안정적이므로 많은 개발자들이 사용하고 있다.
  • 유튜브와 구글 무비도 ExoPlyer를 사용해서 만들어졌다.

예제

동영상 파일 추가
  • 아래 경로에 영상 추가
  • ~/src/main/assets/video/intro1.mp4
  • ~/src/main/assets/video/intro2.mp4
build.gradle
dependencies {
    ...
    implementation "com.google.android.exoplayer:exoplayer-core:2.13.0"
    implementation "com.google.android.exoplayer:exoplayer-ui:2.13.0"
}
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/playerView"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        app:fastforward_increment="5000"
        app:rewind_increment="5000"
        app:use_controller="true" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClickPlay"
        android:text="play" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClickRelease"
        android:text="release" />

</LinearLayout>
MainActivity
class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "[TAG]"
    }

    private lateinit var playerView: PlayerView
    private var player: ExoPlayer? = null
    private val listener = PlayerStateListener()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        playerView = findViewById(R.id.playerView)
    }

    fun onClickPlay(view: View) {
        if (player == null) {
            player = SimpleExoPlayer.Builder(this).build()
            playerView.player = player
        }

        player?.apply {
            if (isPlaying) {
                stop()
            }

            setMediaItem(MediaItem.fromUri("asset:///video/intro1.mp4"))
            addMediaItem(MediaItem.fromUri("asset:///video/intro2.mp4"))
            addListener(listener)
            prepare()
            play()
            seekTo(2000L)
        }
    }

    fun onClickRelease(view: View) {
        player?.apply {
            stop()
            release()
            removeListener(listener)
        }

        player = null
    }

    inner class PlayerStateListener : Player.EventListener {
        override fun onPlaybackStateChanged(state: Int) {
            when (state) {
                ExoPlayer.STATE_IDLE -> Log.d(TAG, "STATE_IDLE")
                ExoPlayer.STATE_BUFFERING -> Log.d(TAG, "STATE_BUFFERING")
                ExoPlayer.STATE_READY -> Log.d(TAG, "STATE_READY")
                ExoPlayer.STATE_ENDED -> Log.d(TAG, "STATE_ENDED")
            }
        }
    }
}

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] Jenkins로 APK 빌드하기  (0) 2021.02.22
[Android] Chromecast  (0) 2021.02.16
[Android] ViewTreeObserver  (0) 2021.02.10
[Android] LifecycleObserver  (0) 2021.02.10
[Android] BuildConfig  (0) 2021.02.09

+ Recent posts