타임 시프팅 지원

TV 입력 서비스에 타임 시프팅 API를 사용하면 사용자가 동영상을 일시중지하거나 되감고 라이브 프로그램을 빨리 감기할 수 있습니다. 앱에서 타임 시프팅을 통해 사용자는 콘텐츠를 유연하게 시청할 수 있습니다.

  • 사용자는 일시적인 중단을 처리하는 동안 프로그램을 일시중지할 수 있으므로 중요한 순간을 놓치지 않을 수 있습니다.
  • 사용자가 이미 본 콘텐츠나 다음 콘텐츠를 빨리 감을 수 있음 관심이 없습니다.
  • 사용자가 좋아하는 부분을 다시 보기 위해 프로그램 콘텐츠를 되감을 수 있습니다.

그림 1. 타임 시프팅에 사용되는 Android TV 재생 컨트롤

타임 시프팅은 짧고 임시적인 기록된 프로그램 데이터 세그먼트를 사용하여 라이브 프로그램 재생 기능을 구현할 수 있습니다. 사용자가 타임 시프팅을 재생할 수 없음 현재 재생 세션 외부에 있는 녹음 파일 즉, 백엔드에서 사용할 수 없는 다음 날 시청을 위해 프로그램을 일시중지하거나 다른 채널로 전환하는 동안 나중에 볼 수 있습니다.

필요한 경우 TV 녹화 API를 사용합니다. 사용자가 프로그램 콘텐츠를 녹화하여 현재 재생 이외의 시간에 시청할 수 있도록 합니다. 세션입니다.

타임 시프팅 지원 추가

TV 입력 서비스에 타임 시프팅 지원을 추가하려면 TvInputService.Session 클래스의 타임 시프팅 API 앱에서 타임 시프팅 녹화 및 재생을 처리하고 입력 서비스가 타임 시프팅을 지원하는 시스템입니다.

구현하는 TvInputService.Session 메서드는 다음과 같습니다. 다음과 같습니다.

입력 서비스가 지원한다는 것을 시스템에 알리는 방법에 대한 자세한 내용은 자세히 알아보려면 시스템에 타임 시프팅 상태 알림 섹션으로 이동합니다.

TIF 컴패니언 라이브러리를 사용하여 TvInputService.Session 클래스를 사용하면 자동으로 ExoPlayer를 사용하는 타임 시프팅 구현입니다. 이 타임 시프팅 API 메서드를 BaseTvInputService.Session 및 자체 제공 있습니다. TIF 컴패니언 라이브러리 사용에 관한 자세한 내용은 TV 입력 서비스 만들기를 사용하여 TIF 컴패니언 라이브러리를 참조하세요.

세션 시작 시 콘텐츠 녹화

사용자는 채널의 재생 컨트롤을 조절하려면 선택을 누르면 됩니다. 재생 컨트롤로 이동하거나 제어할 수 있습니다.

사용자가 프로그램 콘텐츠, TV 프로그램 시청 중에 언제든지 타임 시프팅을 사용할 수 있음 입력 서비스는 사용자가 알림을 받는 즉시 타임 시프팅 콘텐츠 녹화를 시작해야 함 채널을 구독하게 되는 onTune() 있습니다. 또한 다음을 수행해야 합니다. 다음을 호출하여 녹음할 수 있음을 시스템에 알립니다. notifyTimeShiftStatusChanged(int), 이 시스템에 타임 시프팅 상태 알림 섹션으로 이동합니다.

녹화된 콘텐츠 저장소 관리

TV 입력 서비스는 시스템 호출 시 앱의 비공개 앱 저장소 및 콘텐츠 재생을 타임 시프팅 방법(예: onTimeShiftResume() 콘텐츠가 이미 클라우드에 저장되어 있고 앱에서 타임 시프팅을 녹화하는 경우에는 대신에 Cloud Storage를 사용할 수 있습니다. 앱 스토리지입니다

콘텐츠가 보호된 콘텐츠를 사용하는 경우 TV 입력 서비스는 콘텐츠를 암호화하고 복호화하는 동안 녹화된 콘텐츠를 있습니다.

녹화된 동영상 콘텐츠는 많은 양의 저장용량이 필요할 수 있으므로 세션 재생 중에 녹화된 콘텐츠를 신중하게 관리합니다. 재생 세션 시간이 녹화 및 저장할 수 있는 시간을 초과합니다. 타임 시프팅은 녹화한 동영상을 조정하여 현재 시간을 캡처해야 합니다 예를 들어 사용자가 콘텐츠를 31분 동안 재생했으며 최대 타임 시프팅 녹화 30분이지만 녹화와 시작 시간을 조정하여 1분부터 31분까지 콘텐츠를 만들 수 있습니다

TV 입력 서비스가 타임 시프팅을 지원할 수 없는 경우 시스템에 알려야 합니다 자세한 내용은 시스템에 타임 시프팅 상태 알림 섹션으로 이동합니다.

사용자가 다른 채널로 전환하거나 재생을 종료할 때 세션에서 녹화된 타임 시프팅 데이터를 삭제합니다.

시스템에 타임 시프팅 상태 알림

TV 입력 서비스가 타임 시프팅을 지원하는 경우 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) 구현해 보겠습니다. 사용자가 음악을 들을 때 onTune() 채널을 구독합니다.

입력 서비스의 타임 시프팅 기능이 있는지 시스템에 알리기 위해 변경, 사용 notifyTimeShiftStatusChanged(int) 예를 들어 TV 입력 서비스가 타임 시프팅을 지원할 수 없는 경우 저장공간 제한이나 기타 이유로 인해 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)

TV 입력 서비스가 타임 시프팅을 전혀 지원할 수 없다면 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED) 재생 세션이 생성될 때 시스템은 통화 안 함 notifyTimeShiftStatusChanged()를 입력 서비스로 사용할 수는 없지만 타임 시프팅을 지원해야 합니다. 여기에는 API 수준 22 및 살펴봤습니다

재생 시간 추적

타임 시프팅 녹화의 시작 위치는 가장 이른 절대 시간입니다. 에포크 이후 사용자가 탐색할 수 있는 밀리초 단위입니다. 이것은 일반적으로 동영상 재생이 시작된 후 onTune()가 호출됩니다. 그러나 사용자가 동영상을 시청한 경우 새 세그먼트를 녹화해야 하는데 적절하게 시작 시간을 업데이트하세요.

타임 시프팅 녹화의 현재 위치는 현재 재생 위치가 됨 에포크 이후 밀리초 단위로 표시됩니다. 이 위치는 지속적으로 변합니다 표시됩니다. 일반적으로 재생 엔진을 사용하여 값에 사용해야 합니다.

Kotlin

override fun onTimeShiftGetCurrentPosition(): Long =
        tvPlayer?.run {
            currentProgram?.let { program ->
                currentPosition + program.startTimeUtcMillis
            }
        } ?: TvInputManager.TIME_SHIFT_INVALID_TIME

자바

@Override
public long onTimeShiftGetCurrentPosition() {
  if (getTvPlayer() != null && currentProgram != null) {
    return getTvPlayer().getCurrentPosition() +
      currentProgram.getStartTimeUtcMillis();
  }
  return TvInputManager.TIME_SHIFT_INVALID_TIME;
}

시스템에서 onTimeShiftGetStartPosition() 은(는) 입력한 현재 시간 위치보다 크지 않습니다. onTimeShiftGetCurrentPosition()입니다. 시스템은 이러한 호출을 사용하여 재생 컨트롤 UI에서 타임 시프팅 시간을 업데이트해야 합니다.

재생 매개변수 지원

타임 시프팅 중 재생 속도를 변경하기 위해 시스템은 재생 매개변수를 사용합니다. 대상 예를 들어 사용자가 현재 재생을 되감기로 결정하면 매개변수는 재생 속도가 음수로 앱에 전달됩니다. 또한 타임 시프팅은 2배 또는 3배의 재생 속도 레벨을 지원합니다. 되감기 또는 빨리 감기용입니다.

시스템에서 onTimeShiftSetPlaybackParams(PlaybackParams) 메서드가 포함된 PlaybackParams 객체를 반환합니다. 매개변수입니다. 이 정보의 용도 적절하게 구성해야 합니다.

재생 엔진이 매개변수를 지원하지 않는 경우 예상 동작을 최대한 에뮬레이션합니다. 예를 들어 동영상 또는 엔진에서 2배속을 지원하지 않는 경우 재생 시 반복 탐색 작업을 사용합니다. 대략 두 배의 재생 속도를 달성합니다.

매개변수를 설정한 후에는 사용자가 다음 중 하나에 해당하지 않는 한 설정을 변경하지 마세요. 다른 파라미터 또는 스위치가 필요한 재생 명령 실행 새로운 채널로 이동합니다.