아이돌 그룹 엑소와 연관이?
아쉽게 아니였고..
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.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"
}
SimpleExoPlayer deprecated -> ExoPlayer
private var player: ExoPlayer? = null
private fun initializePlayer() {
player = ExoPlayer.Builder(this)
.build()
.also { exoPlayer ->
viewBinding.videoView.player = exoPlayer
}
}
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)
}
}
이 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
}
private fun initializePlayer() {
[...]
exoPlayer.playWhenReady = playWhenReady
exoPlayer.seekTo(currentWindow, playbackPosition)
exoPlayer.prepare()
}
실행하면 잘 실행이 된다!!
💡 초기화 함수에서 URI를 R.string.media_url_mp4(저장 되있음)로 변경하면 동영상을 플레이할 수 있다.
위 코드를 모두 잘 작성한 모듈이 1단계 exoplayer-codelab-01 이다.
다음은 exoplayer-codelab-01 에 이어서 작성될 것이다. [NEXT]