Cast 프레임워크는 수신기에서 순차적으로 재생할 수 있는 MediaInfo 인스턴스(예: 동영상 또는 오디오 스트림)에서 빌드할 수 있는 MediaQueueItem 인스턴스 목록 생성을 지원하는 대기열 클래스를 제공합니다. 이 콘텐츠 항목 대기열은 수정, 재정렬, 업데이트 등을 할 수 있습니다.

수신기 SDK는 대기열에 현재 활성 상태 (재생 중 또는 일시중지됨)인 항목이 하나 이상 있는 한 대기열을 유지하고 대기열의 작업에 응답합니다. 전송자는 세션에 참여하여 대기열에 항목을 추가할 수 있습니다. 수신기는 마지막 항목의 재생이 완료되거나, 발신자가 재생을 중지하고 세션을 종료하거나, 발신자가 수신기에 새 대기열을 로드할 때까지 대기열 항목의 세션을 유지합니다. 수신기는 기본적으로 종료된 대기열에 관한 정보를 유지하지 않습니다. 대기열의 마지막 항목이 완료되면 미디어 세션이 종료되고 대기열이 사라집니다.

미디어 대기열 항목 만들기 및 로드

미디어 대기열 항목은 Cast 프레임워크에서 MediaQueueItem 인스턴스로 표현됩니다. 적응형 콘텐츠와 함께 미디어 플레이어 라이브러리를 사용하는 경우 미디어 대기열 항목을 만들 때 대기열에서 해당 항목 앞에 있는 항목의 재생이 끝나기 전에 플레이어가 미디어 대기열 항목을 버퍼링할 수 있도록 미리 로드 시간을 설정할 수 있습니다. 항목의 자동 재생 속성을 true로 설정하면 수신자가 자동으로 재생할 수 있습니다. 예를 들어 빌더 패턴을 사용하여 다음과 같이 미디어 큐 항목을 만들 수 있습니다.

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

RemoteMediaClient의 적절한 queueLoad 메서드를 사용하여 큐에 미디어 큐 항목 배열을 로드합니다.

미디어 대기열 상태 업데이트 수신

수신기가 미디어 대기열 항목을 로드하면 세션 기간 (및 대기열 수명) 동안 유지되는 고유 ID가 항목에 할당됩니다. 앱은 현재 로드된 항목(재생 중이 아닐 수 있음), 로드 중인 항목, 미리 로드된 항목 측면에서 대기열의 상태를 알 수 있습니다. MediaStatus 클래스는 다음 상태 정보를 제공합니다.

  • getPreloadedItemId() 메서드 - 다음 항목이 미리 로드된 경우 미리 로드된 상품 ID를 반환합니다.
  • getLoadingItemId() 메서드 - 수신기에서 현재 로드 중이지만 대기열에서 활성화되지 않은 항목의 상품 ID를 반환합니다.
  • getCurrentItemId() 메서드 - 미디어 상태 변경이 발생한 시점에 대기열에서 활성 상태였던 항목의 항목 ID를 반환합니다 (재생 중이 아닐 수도 있음).
  • getQueueItems()(지원 중단됨, 대신 MediaQueue 사용) 메서드 - MediaQueueItem 인스턴스 목록을 수정 불가능한 목록으로 반환합니다.

앱은 MediaQueue 클래스를 사용하여 항목 목록을 가져올 수도 있습니다. 이 클래스는 미디어 대기열의 스파스 데이터 모델입니다. 수신기와 자동으로 동기화되는 큐에 상품 ID 목록을 유지합니다. MediaQueue는 대기열이 매우 길면 메모리를 너무 많이 사용하므로 모든 MediaQueueItem를 유지하지 않습니다. 대신 요청 시 항목을 가져오고 최근에 액세스한 항목의 LruCache를 유지합니다. 다음 메서드를 사용하여 미디어 대기열에 액세스할 수 있습니다.

  • getItemIds() 메서드 - 모든 상품 ID의 목록을 순서대로 반환합니다.
  • getItemAtIndex() 메서드 - 지정된 색인에서 캐시된 항목을 반환합니다. 상품이 캐시되지 않은 경우 MediaQueuenull를 반환하고 상품을 가져오도록 예약합니다. 항목을 가져오면 MediaQueue.Callback#itemsUpdatedAtIndexes()가 호출되고 동일한 ID로 getItemAtIndex()를 다시 호출하면 항목이 반환됩니다.
  • fetchMoteItemsRelativeToIndex()은 사용자가 큐 UI를 위 또는 아래로 스크롤하고 앱이 클라우드에서 항목을 더 가져오려고 할 때 사용됩니다.

이러한 메서드를 다른 미디어 상태 메서드와 함께 사용하여 큐의 상태와 큐에 있는 항목에 관해 앱에 알립니다. 수신기에서 전송하는 미디어 상태 업데이트 외에도 RemoteMediaClient.CallbackMediaQueue.Callback을 구현하여 앱에서 대기열의 변경사항을 수신할 수 있습니다.

또한 Cast SDK는 대기열 UI를 만들기 위한 두 가지 유틸리티 클래스를 제공합니다.

예를 들어 MediaQueueRecyclerViewAdapter을 사용하여 RecyclerView를 만들려면 다음을 실행합니다.

Kotlin
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

큐 수정

대기열의 항목을 조작하려면 RemoteMediaClient 클래스의 대기열 메서드를 사용합니다. 이를 통해 항목 배열을 새 대기열에 로드하고, 기존 대기열에 항목을 삽입하고, 대기열에 있는 항목의 속성을 업데이트하고, 대기열에서 항목을 앞뒤로 이동하고, 대기열 자체의 속성을 설정하고(예: 다음 항목을 선택하는 repeatMode 알고리즘 변경), 대기열에서 항목을 삭제하고, 대기열의 항목 순서를 변경할 수 있습니다.