이 페이지에서는 선택한 전략에 따라 앱의 미디어 콘텐츠를 미리 로드하는 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
객체를 만듭니다.