콘텐츠 관리 및 재생

이 페이지에서는 미리 로드 관리자를 사용하여 동영상 콘텐츠를 관리하는 방법을 설명합니다. 미리 로드 관리자를 사용하면 사용자에게 더 나은 환경을 제공할 수 있습니다. 사용자가 한 미디어 항목에서 다른 미디어 항목으로 전환하면 관리자가 이미 일부 콘텐츠를 로드했기 때문에 재생이 더 빨리 시작됩니다.

이 페이지에서는 다음 주제를 다룹니다.

미디어 항목을 미리 로드 관리자에 추가

추적할 각 미디어 항목에 관해 미리 로드 관리자에게 알려야 합니다. 예를 들어 앱에 동영상 캐러셀이 있는 경우 이러한 동영상을 미리 로드 관리자에 추가합니다. 사용 사례에 따라 모든 동영상을 추가하거나 현재 재생 중인 동영상과 비슷한 동영상만 추가할 수 있습니다. 나중에 미리 로드 관리자에 새 항목을 추가할 수도 있습니다.

미디어 항목을 추가해도 프리로드 관리자가 콘텐츠 로드를 시작하지는 않습니다. 미리 로드를 트리거하려면 미리 로드 관리자에서 우선순위를 무효화해야 합니다.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

코드에 관한 핵심 사항

  • 이 스니펫은 생성한 후 미리 로드 관리자를 초기에 채우는 방법을 보여줍니다. add()를 호출하여 항목을 기존의 채워진 미리 로드 관리자에 추가할 수도 있습니다.
  • 이 스니펫에서 pullMediaItemsFromService()는 재생할 콘텐츠 목록을 가져오는 앱의 로직입니다. 코드는 이 메서드를 호출하여 최대 20개의 항목 목록을 가져옵니다.
  • preloadManagerDefaultPreloadManager 만들기에서 생성된 DefaultPreloadManager입니다. 이 코드는 관리자의 add() 메서드를 호출하여 캐러셀에 각 항목을 추가합니다.
  • rankingData는 미리 로드 관리자가 각 미디어 항목의 우선순위를 결정하는 데 사용하는 값입니다. DefaultPreloadManager의 경우 rankingData는 캐러셀에 있는 항목의 위치를 나타내는 정수입니다. 미리 로드 관리자는 각 항목이 현재 재생 중인 항목에서 얼마나 떨어져 있는지에 따라 우선순위를 결정합니다.

미리 로드 관리자에서 우선순위 무효화

프리로드 관리자가 콘텐츠 프리로드를 시작하도록 트리거하려면 invalidate()를 호출하여 항목의 우선순위가 오래되었다고 프리로드 관리자에게 알려야 합니다. 다음과 같은 상황에서 이 작업을 수행해야 합니다.

  • 새 미디어 항목을 미리 로드 관리자에 추가하거나 미디어 항목을 삭제하는 경우 여러 항목을 추가하거나 삭제하는 경우 모든 항목을 추가한 invalidate()를 호출해야 합니다.
  • 사용자가 한 미디어 항목에서 다른 미디어 항목으로 전환하는 경우 이 경우 콘텐츠 가져오기 및 재생에 설명된 대로 invalidate()를 호출하기 전에 현재 재생 중인 색인을 업데이트해야 합니다.

미리 로드 관리자를 무효화하면 생성한 TargetPreloadStatusControl를 호출하여 각 항목에서 로드해야 하는 콘텐츠의 양을 알아냅니다. 그런 다음 우선순위가 높은 순서대로 각 항목의 콘텐츠를 로드합니다.

preloadManager.invalidate()

코드에 관한 핵심 사항

  • invalidate()를 호출하면 미리 로드 관리자가 알고 있는 각 미디어 항목의 우선순위를 다시 평가하도록 트리거됩니다. 따라서 미리 로드 관리자를 많이 변경하는 경우 invalidate()를 호출하기 전에 변경사항을 완료해야 합니다.

미디어 가져오기 및 재생

사용자가 새 미디어 항목으로 이동하면 미리 로드 관리자에서 미디어 항목을 가져와야 합니다. 미리 로드 관리자가 콘텐츠를 로드한 경우 미리 로드 관리자를 사용하지 않았을 때보다 콘텐츠가 더 빨리 재생됩니다. 미리 로드 관리자가 아직 해당 항목의 콘텐츠를 로드하지 않은 경우 콘텐츠가 정상적으로 재생됩니다.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

코드에 관한 핵심 사항

  • player는 앱이 콘텐츠를 재생하는 데 사용하는 Media3 ExoPlayer입니다. 프리로드 관리자를 만드는 데 사용한 것과 동일한 빌더에서 DefaultPreloadManager.Builder.buildExoPlayer()를 호출하여 플레이어를 만들어야 합니다.
  • 사용자가 새 미디어 항목으로 전환하면 앱은 getMediaSource()를 호출하여 미리 로드 관리자에서 미디어 소스를 가져옵니다. 이미 미리 로드 관리자에 추가한 mediaItem여야 합니다. 미리 로드 관리자가 아직 콘텐츠 로드를 시작하지 않은 경우에도 괜찮습니다. 이 경우 미리 로드된 데이터가 없는 MediaSource가 반환됩니다. 예를 들어 사용자가 캐러셀에서 갑자기 멀리 떨어진 위치로 이동하는 경우 이러한 상황이 발생할 수 있습니다.
  • 사용자가 새 미디어 항목을 재생한 후 setCurrentPlayingIndex를 호출하여 캐러셀에서 새 항목이 있는 위치를 미리 로드 관리자에게 알립니다. 미리 로드 관리자는 다음 항목의 로드 우선순위를 지정하기 위해 이 정보가 필요합니다. 현재 색인을 업데이트한 후 invalidate()를 호출하여 미리 로드 관리자가 각 항목의 우선순위를 다시 결정하도록 합니다.

미리 로드 관리자에서 항목 삭제

미리 로드 관리자의 효율성을 유지하려면 미리 로드 관리자가 더 이상 추적할 필요가 없는 항목을 삭제해야 합니다. 캐러셀에 아직 있지만 사용자의 현재 위치에서 멀리 떨어진 항목도 삭제할 수 있습니다. 예를 들어 사용자가 시청하는 콘텐츠와 15개 이상의 항목 차이가 나는 항목은 미리 로드할 필요가 없다고 결정할 수 있습니다. 이 경우 항목이 멀리 떨어지면 항목을 삭제합니다. 사용자가 삭제된 항목으로 다시 이동하는 경우 언제든지 다시 추가할 수 있습니다.

preloadManager.remove(mediaItem)

코드에 관한 핵심 사항

프리로드 관리자 사용이 끝나면 해제하세요.

프리로드 관리자가 더 이상 필요하지 않으면 리소스를 확보하기 위해 해제해야 합니다. 특히 활동이 소멸될 때 해제해야 합니다.

preloadManager.release()

코드에 관한 핵심 사항

  • 객체를 해제한 후에는 객체의 메서드를 호출해서는 안 됩니다.
  • 다른 미리 로드 관리자를 만들어야 하는 경우 새 DefaultPreloadManager.Builder을 만들고 이를 사용하여 DefaultPreloadManager을 만듭니다. 이전 빌더를 재사용하려고 하지 마세요.