본문 바로가기
📱| Android/📘 | 기록

[Android, Kotlin] exoplayer와 media3를 이용해 영상 재생하기

by immgga 2023. 8. 25.

 

이번에는 필자가 자주 시청하는 youtube를 보고 youtube가 exoplayer를 이용해 제작되었다는 말을 들었기 때문에 이번 기회에 exoplayer를 공부해 보기로 했다.

이번의 exoplayer 예제는 프로젝트 안의 mp4 파일을 불러오는 과정을 담았다.

참고로 현재 자주 사용하는 compose를 이용해 구현해 보겠다.

 

exoplayer란 무엇일까?

exoplayer는 android에서 사용 가능한 미디어 재생 라이브러리이다.

 

1. dependency 추가

exoplayer와 media3을 사용하기 위해 dependency를 추가한다.

// exoplayer compose
implementation("com.google.android.exoplayer:exoplayer:2.19.1")
implementation("com.google.android.exoplayer:exoplayer-ui:2.19.1")

// media3
implementation("androidx.media3:media3-exoplayer:1.1.1")
implementation("androidx.media3:media3-ui:1.1.1")

 

2. exoplayer, mediaItem 생성하기

exoplayer와 mediaItem을 생성해 주자.

@Composable
fun MainScreen() {
    val context = LocalContext.current
    val exoplayer = ExoPlayer.Builder(context).build()

    val mediaItem = MediaItem.fromUri("android.resource://com.example.mvipractice/${R.raw.video}")
    exoplayer.setMediaItem(mediaItem)
    exoplayer.prepare()
    exoplayer.play()
    
    AndroidView(
        factory = {
            PlayerView(it).apply {
                player = exoplayer
                layoutParams = ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT
                )
            }
        },
        modifier = Modifier.fillMaxSize()
    )

    DisposableEffect(Unit) {
        onDispose {
            exoplayer.release()
        }
    }
}

exoplayer 객체를 생성하기 위해서는 context를 이용해야 하기에 localcontext.current를 사용해 현재 context를 불러와준다.

mediaItem에서는 영상으로 폰에 나오게 하고자 하는 url을 적어준다.

필자는 android studio project 내부에 mp4 파일을 사용하였기에 주소를 android resource 형식을 사용해 주었다.

 

mediaItem에 영상을 url로 담고 싶으면 다음과 같은 파일 형식을 따라 주어야 한다.

Flv, Flac, Wav, FragmentedMp4, Mp4, Amr, Ps, Ogg, Ts, Matroska, Adts, Ac3, Ac4, Mp3, Avi, Jpeg

위의 형식과 다른 파일 형식을 이용하려고 하면 다음과 같은 에러가 발생한다.

androidx.media3.exoplayer.source.UnrecognizedInputFormatException: None of the available extractors (FlvExtractor, FlacExtractor, WavExtractor, FragmentedMp4Extractor, Mp4Extractor, AmrExtractor, PsExtractor, OggExtractor, TsExtractor, MatroskaExtractor, AdtsExtractor, Ac3Extractor, Ac4Extractor, Mp3Extractor, AviExtractor, JpegExtractor) could read the stream.{contentIsMalformed=false, dataType=1}

 

compose에서는 exoplayer를 그냥 사용할 수 없기에 androidView composable function을 사용해야 한다. factory 부분에 PlayerView를 넣어 주었다.

 

아래의 disposableEffect는 composable 함수가 dispose(폐기되다)되기 전에 수행해야 할 작업들이 있는 경우 사용할 수 있다.

xml로 따지면 activity의 onDestroy가 와 비슷한 역할을 하는 듯 하다.

disposableEffect에 대해 더 자세한 설명이 필요하다면 해당 링크를 들어가 보는 것도 좋을 것 같다.

https://kotlinworld.com/257

 

[Compose Side Effect] Disposable Effect 란 무엇인가?

Disposable Effect란? DisposableEffect란 Composable이 Dispose된 후에 정리해야 할 Side Effect가 있는 경우에 사용되는 Effect이다. 자세히 이야기 하면 Composable의 Lifecycle에 맞춰 정리되어야 하는 리스너나 작업이

kotlinworld.com

 

 

3. 실행 화면

실행하면 여러분이 설정한 url에 맞게 playerView에서 영상이 상영될 것이다.

 

 

정리

  • 처음에는 어떻게 구현해야 할지 막막했었는데 하다 보니까 어느 정도 감은 잡은 듯하다.
  • 원래는 youtube 영상을 뽑아보고 싶었는데 위에 필자가 언급한 에러가 발생해서 결국 다른 방법을 쓸 수밖에 없었다. :(
  • 다음에 youtube url로 exoplayer 구현에 성공하면 따로 블로그를 또 올리겠다.

 

참고한 영상들

처음 접했을 때 많은 도움이 되었다.

https://www.youtube.com/watch?v=JX1fwti2LI4&t=1523s&pp=ygUZYW5kcm9pZCBleG9wbGF5ZXIgY29tcG9zZQ%3D%3D 

728x90