タイムシフトをサポートする

テレビ入力サービスでタイムシフト API を使用して、ユーザーがサービス チャンネルでライブ番組を一時停止、巻き戻し、早送りできるようにします。アプリがタイムシフトをサポートしている場合、ユーザーはコンテンツを柔軟に視聴することができます。

  • ユーザーは短い中断を処理している間にプログラムを一時停止できるため、重要な瞬間を見逃すことがありません。
  • ユーザーは、以前に視聴したコンテンツや興味のないコンテンツを早送りできます。
  • 番組コンテンツを好きなタイミングまで巻き戻して再視聴する

図 1. タイムシフトに使用される Android TV の再生コントロール

タイムシフトでは、番組データの短い一時的な録画セグメントを使用して、ライブ番組を再生する機能を実装します。ユーザーは、タイムシフト録画を現在の再生セッション外で再生することはできません。つまり、タイムシフトを使用して番組を一時停止して翌日視聴することや、別のチャンネルに切り替えるときに番組を一時停止して後で視聴することはできません。

ユーザーが番組コンテンツを録画して現在の再生セッション以外で視聴できるようにするには、TV Recording API を使用します。

タイムシフトのサポートを追加する

テレビ入力サービスにタイムシフトのサポートを追加するには、TvInputService.Session クラスにタイムシフト API を実装し、アプリでタイムシフト録画の録画と再生を処理して、入力サービスがタイムシフトをサポートしていることをシステムに通知する必要があります。

実装する TvInputService.Session メソッドは次のとおりです。

入力サービスがタイムシフトをサポートしていることをシステムに通知する方法については、タイムシフトのステータスをシステムに通知するのセクションをご覧ください。

TIF Companion ライブラリを使用して TvInputService.Session クラスを実装する場合、ExoPlayer を使用するタイムシフトの実装が自動的に取得されます。この実装を使用するか、BaseTvInputService.Session のタイムシフト API メソッドをオーバーライドして、独自の実装を提供できます。TIF コンパニオン ライブラリの使用の詳細については、TIF コンパニオン ライブラリを使用してテレビ入力サービスを作成するをご覧ください。

セッション開始時にコンテンツを録画する

ユーザーは、チャンネルの再生コントロールにアクセスすることで、番組コンテンツを一時停止、巻き戻し、早送りできます。コンテンツの再生中に [選択] を押して再生コントロールに移動するか、リモート デバイスで専用の再生コントロールを使用します。

ユーザーは番組コンテンツの視聴中にいつでもタイムシフトを使用できるため、テレビ入力サービスは、ユーザーが onTune() 実装のチャンネルに選局したらすぐにタイムシフト コンテンツの録画を開始する必要があります。また、タイムシフトのステータスをシステムに通知するセクションで説明されているように、notifyTimeShiftStatusChanged(int) を呼び出して、録画が可能であることをシステムに通知する必要があります。

録画コンテンツ ストレージを管理する

テレビ入力サービスは、タイムシフト録画をアプリのプライベート アプリ ストレージに保存し、システムによってタイムシフト メソッド(onTimeShiftResume() など)が呼び出されたときにコンテンツを再生します。コンテンツがすでにクラウドに保存されており、アプリがクラウド内でタイムシフト録画を管理できる場合は、アプリ ストレージの代わりにクラウド ストレージを使用できます。

コンテンツが保護されたコンテンツを使用している場合、TV 入力サービスは録画されたコンテンツの適切な暗号化と再生中のコンテンツの復号を行います。

録画された動画コンテンツには大量のストレージが必要になるため、セッションの再生中は録画コンテンツを慎重に管理する必要があります。再生セッションの時間がタイムシフトのために記録および保存できる時間を超えた場合は、タイムシフトの録画を調整して、現在のバッファを維持しながら現在の時刻がキャプチャされるようにします。たとえば、ユーザーが 31 分間コンテンツを再生し、タイムシフト録画の最大サイズが 30 分の場合は、1 分から 31 分までのコンテンツが含まれるように録画と開始時間を調整します。

空き容量不足のためにテレビ入力サービスがタイムシフトをサポートできない場合は、システムに通知する必要があります。タイムシフトのサポート制限をシステムに通知する方法について詳しくは、タイムシフトのステータスをシステムに通知するをご覧ください。

ユーザーが別のチャンネルに切り替えたとき、または再生セッションを終了したときに、録画されたタイムシフト データを削除します。

タイムシフトのステータスをシステムに通知する

テレビ入力サービスがタイムシフトをサポートしている場合、ユーザーがチャンネルに選局したときに、onTune() の実装で notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) を呼び出します。

入力サービスのタイムシフト機能が変更されたかどうかをシステムに通知するには、notifyTimeShiftStatusChanged(int) を使用します。たとえば、テレビ入力サービスが保存容量の制限などの理由でタイムシフトをサポートできない場合は、notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE) を呼び出します。

テレビ入力サービスがタイムシフトをまったくサポートできない場合は、再生セッションの作成時に 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

Java

@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 倍の速度で実行できます。

システムは、現在のセッションのパラメータを含む PlaybackParams オブジェクトを指定して onTimeShiftSetPlaybackParams(PlaybackParams) メソッドを呼び出します。この情報を使用して、メディア再生エンジンを適切に構成します。

再生エンジンがパラメータをサポートしていない場合は、想定される動作を可能な限りエミュレートします。たとえば、再生エンジンが 2 倍の速度をサポートしていない場合は、再生エンジンでシーク操作を繰り返すと、再生速度が約 2 倍になります。

パラメータの設定後は、ユーザーが別のパラメータを必要とする再生コマンドを発行するか、新しいチャンネルに切り替えない限り、設定を変更しないでください。