이 페이지에서는 선택한 전략에 따라 앱의 미디어 콘텐츠를 미리 로드하는 DefaultPreloadManager를 만드는 방법을 설명합니다.
BasePreloadManager 추상 클래스를 기반으로 하는 미리 로드 관리자를 사용하면 선택한 기준에 따라 콘텐츠의 순위를 지정할 수 있습니다. 이 문서에서는 파생 클래스인 DefaultPreloadManager를 사용하는 방법을 설명합니다. 이 클래스에서 각 미디어 항목은 목록의 위치 (예: 동영상 캐러셀의 위치)를 나타내는 정수로 순위가 지정됩니다. 미리 로드 관리자는 사용자가 현재 재생 중인 항목에 얼마나 가까운지에 따라 항목 로드를 우선순위로 지정합니다. 이렇게 하면 사용자가 다른 항목으로 이동할 때 새 항목이 바로 재생을 시작할 수 있습니다.
DefaultPreloadManager의 인스턴스를 만드는 데는 세 단계가 있습니다.
- 미리 로드 관리자가 미디어 항목을 로드할 준비가 되었는지, 로드할 양을 확인하기 위해 쿼리할 수 있는
TargetPreloadStatusControl을(를) 정의합니다. - 빌더를 만듭니다. 이 빌더를 사용하여 미리 로드 관리자를 만들고
앱의
ExoPlayer객체를 만듭니다. - 빌더의 `build()`
build()메서드를 호출하여 빌더를 사용하여 미리 로드 관리자를 만듭니다.
타겟 미리 로드 상태 제어 만들기
DefaultPreloadManager.Builder를 만들 때 정의하는
타겟 미리 로드 상태 제어 객체를 전달합니다. 이 객체는
TargetPreloadStatusControl 인터페이스를 구현합니다. 미리 로드 관리자가
미디어를 미리 로드할 준비를 할 때 상태 제어의
getTargetPreloadStatus() 메서드를 호출하여 미디어 항목의 콘텐츠를 준비, 로드,
또는 캐시할지 결정합니다. 로드는 미디어 데이터를 플레이어의 메모리 내 버퍼에 직접 미리 로드하여 즉시 재생할 수 있도록 하는 반면, 캐시는 미디어 데이터를 영구 디스크 캐시에 저장하여 플레이어 메모리를 절약합니다. 상태 제어는 다음 상태 코드 중 하나로 응답할 수 있습니다.
STAGE_SPECIFIED_RANGE_LOADED: 미리 로드 관리자는 지정된 시작 위치에서 지정된 기간(밀리초 단위) 동안 콘텐츠를 플레이어의 메모리 내 버퍼에 로드해야 합니다.STAGE_SPECIFIED_RANGE_CACHED: 미리 로드 관리자는 지정된 시작 위치에서 지정된 기간 (밀리초 단위) 동안 콘텐츠를 디스크 캐시에 캐시해야 합니다.STAGE_TRACKS_SELECTED: 미리 로드 관리자는 콘텐츠 트랙의 정보를 로드하고 처리한 후 트랙을 선택해야 합니다. 미리 로드 관리자는 아직 콘텐츠 로드를 시작해서는 안 됩니다.STAGE_SOURCE_PREPARED: 미리 로드 관리자는 콘텐츠 소스를 준비해야 합니다. 예를 들어 콘텐츠의 메타데이터가 별도의 매니페스트 파일에 있는 경우 미리 로드 관리자는 해당 매니페스트를 가져와 파싱할 수 있습니다.null: 미리 로드 관리자는 해당 미디어 항목의 콘텐츠 또는 메타데이터를 로드해서는 안 됩니다.
각 미디어 항목에 로드할 콘텐츠의 양을 결정하는 전략이 있어야 합니다. 이 예에서는 현재 재생 중인 항목에 가장 가까운 항목에 더 많은 콘텐츠가 로드됩니다. 사용자가 색인 n으로 콘텐츠를 재생하는 경우, 컨트롤러는 다음 코드를 반환합니다.
- 색인 n+1 (다음 미디어 항목): 기본 시작 위치에서 3000ms (3초) 로드
- 색인 n-1 (이전 미디어 항목): 기본 시작 위치에서 1000ms (1초) 로드
- 범위 n-2~n+2의 기타 미디어 항목: 반환
PreloadStatus.TRACKS_SELECTED - 범위 n-4~n+4 의 기타 미디어 항목: 반환
PreloadStatus.SOURCE_PREPARED - 다른 모든 미디어 항목의 경우
null반환
class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) : 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.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
코드에 관한 주요사항
MyTargetPreloadStatusControl의 인스턴스를 만들 때 미리 로드 관리자 빌더에 전달합니다.currentPlayingIndex는 현재 재생 중인 미디어 항목의 색인을 보유합니다. 이 값을 최신 상태로 유지하는 것은 앱의 작업입니다.- 미리 로드 관리자가 콘텐츠를 로드할 준비가 되면
getTargetPreloadStatus를 호출하고 해당 미디어 항목에 지정한 순위 정보를 전달합니다.DefaultPreloadManager의 경우 순위 정보는 캐러셀의 항목 위치를 지정하는 정수입니다. 이 메서드는 해당 색인을 현재 선택된 항목의 색인과 비교하여 반환할 코드를 선택합니다.
미리 로드 관리자 만들기
미리 로드 관리자를 만들려면 DefaultPreloadManager.Builder가 필요합니다.
이 빌더는 현재 컨텍스트와 앱의 타겟 미리 로드 상태 제어로 구성됩니다. 모든 기본 구성으로 미리 로드 관리자를 만들 수 있습니다.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
빌더는 미리 로드 관리자의 커스텀 구성요소를 설정하는 데 사용할 수 있는 setter 메서드도 제공합니다.
예를 들어 미리 로드된 데이터가 이 한도를 초과하지 않도록 DefaultPreloadManager의 모든 미리 로드 미디어 소스의 타겟 총 버퍼 바이트를 맞춤설정할 수 있습니다. 플레이어 이름이 "preload"인 커스텀 DefaultLoadControl.Builder에서
setPlayerTargetBufferBytes(String, int)
을 사용하여 이 한도를 구성하고
해당 인스턴스를 미리 로드 관리자 빌더에 전달할 수 있습니다.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) preloadManagerBuilder.setLoadControl( DefaultLoadControl.Builder() .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB .build() ) val preloadManager = preloadManagerBuilder.build()
빌더의 setter 메서드는 기본적으로
맞춤설정을 위한 선택사항이지만 미디어
항목을 디스크에 캐시하려면 Cache를 호출하여
setCache()로 빌더를 구성해야 합니다. 캐시가 구성되지 않은 경우 미디어 항목을 캐시하려고 하면 IllegalStateException이 발생합니다.
미리 로드된 미디어 항목을 재생할 ExoPlayer 만들기
빌더를 사용하여 미리 로드 관리자를 만드는 것 외에도 앱에서 콘텐츠를 재생하는 데 사용하는
ExoPlayer 객체를 만드는 데도 사용하므로
ExoPlayer가 미리 로드 관리자와 구성요소를 올바르게 공유합니다. 이러한 구성이 설정된
ExoPlayer.Builder 인스턴스를 전달하여 ExoPlayer의 재생 관련 구성을 계속 설정할 수 있습니다.
// Direct creation val exoPlayer = preloadManagerBuilder.buildExoPlayer() // Creation with custom playback specific configurations val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true) val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)