android studio

ExoPlayer

즌탱 2022. 1. 6. 15:17

 

 

 

ExoPlayer 는 구글이 안드로이드 SDK와는 별도로 배포되는 오픈소스 프로젝트로 오디오 및 동영상 재생, 재생 관련 기능들을 포함하고 있는 라이브러리이다. 다른 설정 없이도 네트워크로부터 미디어를 스트리밍 형태로 불러와 재생할 수도 있고 다양한 포맷들을 지원하며, 커스터마이징도 지원한다. ExoPlayer 를 사용한 대표적인 서비스로는 유튜브가 있다.

 

 

공식 문서

https://developer.android.com/guide/topics/media/exoplayer

 

ExoPlayer  |  Android 개발자  |  Android Developers

ExoPlayer ExoPlayer는 Android 프레임워크에 속하지 않고 Android SDK에서 별도로 배포되는 오픈소스 프로젝트입니다. ExoPlayer의 표준 오디오 및 동영상 구성요소는 Android 4.1(API 레벨 16)에서 출시된 Android M

developer.android.com

 


 

주요 컴포넌트

 

playerView

영상을 불러와 실제 UI에 뿌려줄 때 사용하는 UI 요소로 xml에 선언을 해두고 SimpleExoPlayer 와 바인딩하여 사용

 

ExoPlayer

영상을 화면에 뿌려주는 가장 중요한 역할을 하는 컴포넌트

 

DataSourceFactory

MediaSource 를 생성할 때 DataSourceFactory 를 넣어줘야 하는데, DataSource 는 url 리소스로부터 데이터를 읽는데 사용한다. 여러 종류의 DataSource 가 있는데 결국은 모두 DataSource 를 상속받아 만들어진다.

 

  • DefaultDataSourceFactory(context, userAgent) : 가장 기본적인 DataSourceFactory
  • DefaultHttpDataSourceFactory(userAgent) : 안드로이드의 HttpURLConnection 을 이용

 

MediaItem

MediaItem 은 Media 를 재생하는 가장 작은 항목으로, Uri 를 기반으로 MediaItem 을 생성할 수 있따. 또한 미디어에 다양한 MetaData 를 세팅할 수 있다.재생 목록은 MediaItem 을 기반으로 생성된다. 실제 재생을 위해서는 MediaItem 을 이용하여 MediaSource를 만들어야 한다.

val mediaItem = MeidaItem.fromUri(Uri.parse(videoUrl))

 

아래 예제는 MediaItem 에 여러 MetaData 를 추가하여 생성하는 단계이다. 예제에는 Media와 Tag 만 달았지만 그 외에도 DRM이나 광고 등 다양한 설정들을 세팅할 수 있다.

val extendMediaItem = MediaItem.Builder().apply {
    setUri(Uri.parse(url))
    setMEdiaId("video-01")
    setTag("TAG_01")
}.build()

 

MediaSource

ExoPlayer 에서 재생을 하기 위해서는 MediaSource 가 필요한데 MediaSource 는 MediaItem 을 이용하여 생성한 뒤에 ExoPlayer 와 연결하여 사용한다.

 

 

MediaSource 의 종류와 만드는 방법

 

  • ProgressiveMediaSource : 일반 미디어 파일 형식 재생
// 비디오 URL
val url = "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4"

// MediaItem을 만들고
val mediaItem = MediaItem.fromUri(Uri.parse(url))

// MediaSource를 만들고
val userAgent = Util.getUserAgent(this, this.applicationInfo.name)
val factory = DefaultDataSourceFactory(this, userAgent)
val progressiveMediaSource = ProgressiveMediaSource.Factory(factory).createMediaSource(mediaItem)

 

  • DashMediaSource : DASH 형식 재생
// 비디오 URL
val url = "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4"

// MediaItem을 만들고
val mediaItem = MediaItem.fromUri(Uri.parse(url))

// MediaSource를 만들고
val userAgent = Util.getUserAgent(this, this.applicationInfo.name)
val factory = DefaultHttpDataSourceFactory(userAgent)
val dashMediaSource = DashMediaSource.Factory(factory).createMediaSource(mediaItem)

 

  • SsMediaSource : SmoothStreaming 형식 재생
// 비디오 URL
val url = "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4"

// MediaItem을 만들고
val mediaItem = MediaItem.fromUri(Uri.parse(url))

// MediaSource를 만들고
val userAgent = Util.getUserAgent(this, this.applicationInfo.name)
val factory = DefaultHttpDataSourceFactory(userAgent)
val ssMediaSource = SsMediaSource.Factory(factory).createMediaSource(mediaItem)

 

  • HlsMediaSource : HLS 형식 재생
// 비디오 URL
val url = "https://www.learningcontainer.com/wp-content/uploads/2020/05/sample-mp4-file.mp4"

// MediaItem을 만들고
val mediaItem = MediaItem.fromUri(Uri.parse(url))

// MediaSource를 만들고
val userAgent = Util.getUserAgent(this, this.applicationInfo.name)
val factory = DefaultHttpDataSourceFactory(userAgent)
val hlsMediaSource = HlsMediaSource.Factory(factory).createMediaSource(mediaItem)

 

 

※ 버전 2.12 이전에는 DefaultMediaSourceFactory 를 사용했지만 2.12 이후 버전에는 Deprecated 되어     ProgressiveMediaSource 를 사용해야 한다.

 

 


 

통신해야 하기 때문에 인터넷 권한 추가해주는 것 까먹지 말아야 함

<uses-permission android:name="android.permission.INTERNET"/>

 


 

사용법

 

1. PlayerView 를 xml 에 정의

 

2. PlayerView 에 SimpleExoPlayer 인스턴스 바인딩

 

3. 비디오 URL 을 이용해 MediaItem 생성

 

4. MediaItem 을 이용해 MediaSource 생성

    (MediaItem 과 DataSource 를 통해서 MediaSource 를 만들어야 재생 가능한 객체가 생성된다.)

 

5. MediaSource 를 SimpleExoPlayer 에 연결

 

6. SimpleExoPlayer 준비 및 재생

 

 

 

 

 

출처 https://jungwoon.github.io/android/library/2020/11/06/ExoPlayer.html