DefaultPreloadManager 만들기 및 구성

이 페이지에서는 선택한 전략에 따라 앱의 미디어 콘텐츠를 미리 로드하는 DefaultPreloadManager를 만드는 방법을 설명합니다.

BasePreloadManager 추상 클래스를 기반으로 한 관리자를 미리 로드하면 선택한 기준에 따라 콘텐츠를 순위 지정할 수 있습니다. 이 문서에서는 각 미디어 항목이 목록에서의 위치 (예: 동영상 캐러셀에서의 위치)를 나타내는 정수로 순위가 지정되는 파생 클래스 DefaultPreloadManager를 사용하는 방법을 설명합니다. 미리 로드 관리자는 사용자가 현재 재생 중인 항목과의 거리에 따라 항목 로드의 우선순위를 지정합니다. 이렇게 하면 사용자가 다른 항목으로 이동할 때 새 항목이 즉시 재생될 수 있습니다.

DefaultPreloadManager 인스턴스를 만드는 단계는 다음과 같습니다.

  • 미디어 항목을 로드할 준비가 되었는지, 얼마나 로드해야 하는지 미리 로드 관리자가 쿼리할 수 있는 TargetPreloadStatusControl 정의
  • 미리 로드 관리자를 만들고 앱의 ExoPlayer 객체를 만드는 데 사용할 빌더를 만듭니다.
  • 빌더를 사용하여 빌더의 build() 메서드를 호출하여 미리 로드 관리자를 만듭니다.

타겟 미리 로드 상태 컨트롤 만들기

DefaultPreloadManager.Builder를 만들 때 정의한 타겟 미리 로드 상태 제어 객체를 전달합니다. 이 객체는 TargetPreloadStatusControl 인터페이스를 구현합니다. 미리 로드 관리자가 미디어를 미리 로드할 준비를 할 때 상태 제어의 getTargetPreloadStatus() 메서드를 호출하여 로드할 콘텐츠의 양을 알아냅니다. 상태 컨트롤은 다음 상태 코드 중 하나로 응답할 수 있습니다.

  • STAGE_SPECIFIED_RANGE_LOADED: 미리 로드 관리자는 지정된 시작 위치에서 지정된 기간(밀리초 단위) 동안 콘텐츠를 로드해야 합니다.
  • STAGE_TRACKS_SELECTED: 미리 로드 관리자는 콘텐츠 트랙의 정보를 로드하고 처리하여 트랙을 선택해야 합니다. 프리로드 관리자는 아직 콘텐츠 로드를 시작해서는 안 됩니다.
  • STAGE_SOURCE_PREPARED: 미리 로드 관리자가 콘텐츠 소스를 준비해야 합니다. 예를 들어 콘텐츠의 메타데이터가 별도의 매니페스트 파일에 있는 경우 미리 로드 관리자가 해당 매니페스트를 가져와 파싱할 수 있습니다.
  • null: 미리 로드 관리자가 해당 미디어 항목의 콘텐츠나 메타데이터를 로드해서는 안 됩니다.

각 미디어 항목에 로드할 콘텐츠의 양을 결정하는 전략이 있어야 합니다. 이 예에서는 현재 재생 중인 항목에 가장 가까운 항목에 더 많은 콘텐츠가 로드됩니다. 사용자가 인덱스 n으로 콘텐츠를 재생하는 경우 컨트롤러는 다음 코드를 반환합니다.

  • 색인 n+1 (다음 미디어 항목): 기본 시작 위치에서 3000ms (3초) 로드
  • 인덱스 n-1 (이전 미디어 항목): 기본 시작 위치에서 1,000ms (1초) 로드
  • n-2~n+2 범위의 기타 미디어 항목: PreloadStatus.TRACKS_SELECTED 반환
  • n-4~n+4 범위의 기타 미디어 항목: PreloadStatus.SOURCE_PREPARED 반환
  • 다른 모든 미디어 항목의 경우 null를 반환합니다.
class MyTargetPreloadStatusControl(
  currentPlayingIndex: Int = C.INDEX_UNSET
): TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {

  override fun getTargetPreloadStatus(index: Int):
                          DefaultPreloadManager.PreloadStatus? {
    if (index - currentPlayingIndex == 1) { // next track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
      // and suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (index - currentPlayingIndex == -1) { // previous track
      // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED
      // and suggest loading 3000ms from the default start position
      return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
    } else if (abs(index - currentPlayingIndex) == 2) {
      // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
      return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
    }
    return null
  }
}

코드에 관한 핵심 사항

  • MyTargetPreloadStatusControl 인스턴스를 만들 때 프리로드 관리자 빌더에 전달합니다.
  • currentPlayingIndex에는 현재 재생 중인 미디어 항목의 색인이 저장됩니다. 이 값을 최신 상태로 유지하는 것은 앱의 몫입니다.
  • 미리 로드 관리자가 콘텐츠를 로드할 준비가 되면 getTargetPreloadStatus를 호출하고 해당 미디어 항목에 지정한 순위 정보를 전달합니다. DefaultPreloadManager의 경우 순위 정보는 캐러셀의 항목 위치를 지정하는 정수입니다. 이 메서드는 해당 인덱스를 현재 선택된 항목의 인덱스와 비교하여 반환할 코드를 선택합니다.

미리 로드 관리자 만들기

미리 로드 관리자를 만들려면 DefaultPreloadManager.Builder가 필요합니다. 이 빌더는 현재 컨텍스트와 앱의 타겟 미리 로드 상태 제어로 구성됩니다. 빌더는 미리 로드 관리자의 맞춤 구성요소를 설정하는 데 사용할 수 있는 setter 메서드도 제공합니다.

빌더를 사용하여 미리 로드 관리자를 만드는 것 외에도 앱에서 콘텐츠를 재생하는 데 사용하는 ExoPlayer 객체를 만드는 데도 빌더를 사용합니다.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

코드에 관한 핵심 사항

  • MyTargetPreloadStatusControl타겟 미리 로드 상태 제어 만들기에서 정의한 클래스입니다.
  • 동일한 DefaultPreloadManager.Builder를 사용하여 해당 미리 로드 관리자가 관리하는 콘텐츠를 재생할 ExoPlayer 객체를 만듭니다.