テレビ入力サービスでタイムシフト API を使用することで、ユーザーがサービスチャンネルのライブ番組を一時停止、巻き戻し、早送りできるようになります。アプリがタイムシフトをサポートしていれば、ユーザーはコンテンツをよりいっそう柔軟な形で視聴できます。
- 短期間の中断をするときに番組を一時停止し、重要な瞬間を見逃さないようにする
- すでに見たコンテンツや興味のないコンテンツを早送りする
- 番組コンテンツを好きなタイミングまで巻き戻して再視聴する
タイムシフトでは、番組データの短い一時的な録画セグメントを使用して、ライブ番組を再生する機能を実装します。タイムシフト録画は現在の再生セッション以外では再生できません。そのため、タイムシフトを使用して番組を一時停止して翌日視聴したり、別のチャンネルに切り替えるときに番組を一時停止して後で視聴したりすることはできません。
ユーザーが現在の再生セッション以外で視聴するために番組コンテンツを録画できるようにするには、TV 録画 APIを使用します。
タイムシフトのサポートを追加する
テレビ入力サービスにタイムシフトのサポートを追加するには、TvInputService.Session クラスでタイムシフトの API を実装し、アプリ内でタイムシフト録画の録画と再生を処理して、入力サービスがタイムシフトをサポートしていることをシステムに通知する必要があります。
実装するTvInputService.Sessionメソッドは以下のとおりです。
onTimeShiftGetCurrentPosition(): 現在の再生時点をミリ秒単位で取得する際にシステムによって呼び出されます。詳細については、以下を参照してください。トラック再生時間セクション。onTimeShiftGetStartPosition(): 現在のタイムシフト録画の開始時点をミリ秒で取得する際にシステムによって呼び出されます。詳しくは、再生時間をトラッキングするをご覧ください。onTimeShiftPause(): ユーザーが再生を一時停止するときに呼び出されます。onTimeShiftResume(): ユーザーが再生を再開したときに呼び出されます。onTimeShiftSeekTo(long): システムが新しい時点に移動する必要があるときに呼び出されます。通常、新しい時点は開始時点と現時点の間にあります。onTimeShiftSetPlaybackParams(PlaybackParams): 現在のセッションの再生速度などの再生パラメータを指定する際にシステムによって呼び出されます。 詳細については、「再生パラメータのサポート」セクションを参照してください。
入力サービスがタイムシフトをサポートしていることをシステムに通知する方法の詳細については、「タイムシフトの状態をシステムに通知する」セクションを参照してください。
TIF Companion Library を使用して TvInputService.Session クラスを実装する場合は、ExoPlayer を使用するタイムシフトの実装が自動的に取得されます。この実装を使用するか、BaseTvInputService.Session のタイムシフト API メソッドをオーバーライドして独自の実装を用意します。TIF Companion Library の使用について詳しくは、TIF Companion Library を使用してテレビ入力サービスを作成するをご覧ください。
セッション開始時にコンテンツを録画する
ユーザーは、チャンネルの再生コントロールにアクセスして(コンテンツの視聴中に [選択] を押して再生コントロールに移動する)、またはリモート デバイスの専用再生コントロールを利用して、番組コンテンツを一時停止、巻き戻し、早送りすることができます。
ユーザーは番組コンテンツの視聴中にいつでもタイムシフトを利用できるため、テレビ入力サービスは、ユーザーが onTune() の実装のチャンネルにチューニングしたらすぐにタイムシフト コンテンツの録画を開始する必要があります。また、タイムシフトのステータスをシステムに通知するセクションにある説明のとおり、notifyTimeShiftStatusChanged(int) を呼び出して、録画ができる状態であることをシステムに通知する必要があります。
録画コンテンツ ストレージを管理する
テレビ入力サービスは、タイムシフト録画をアプリのプライベートアプリストレージに保存し、システムがonTimeShiftResume()などのタイムシフトメソッドを呼び出したときにコンテンツを再生する役割を担います。
コンテンツがすでにクラウドに保存されており、アプリがクラウド内でタイムシフト録画を管理できる場合、アプリ ストレージの代わりにクラウド ストレージを使用することができます。
コンテンツに保護されたコンテンツが含まれている場合、録画されたコンテンツの適切な暗号化と再生時のコンテンツの復号化は、テレビ入力サービス事業者の責任となります。
録画された動画コンテンツには大量のストレージが必要になることがあるため、セッションの再生時には録画コンテンツを慎重に管理する必要があります。再生セッション時間がタイムシフト用の録画と保存が可能な時間を上回る場合は、タイムシフト録画を調整して現在のバッファが維持されるようにしながら現在の時間が録画されるようにします。たとえば、ユーザーがこれまでに 31 分間コンテンツを再生しており、最大タイムシフト録画時間が 30 分間である場合、1 分目から 31 分目までのコンテンツを含むように録画と開始時刻を調整します。
お使いのテレビ入力サービスがストレージ容量不足のためタイムシフトに対応できない場合は、システムにその旨を通知する必要があります。タイムシフト サポートの制約をシステムに通知する方法について詳しくは、タイムシフトのステータスをシステムに通知するセクションをご覧ください。
ユーザーが別のチャンネルに切り替えたり、再生セッションを終了したりした場合は、録画したタイムシフトデータを削除してください。
タイムシフトのステータスをシステムに通知する
テレビ入力サービスがタイムシフトをサポートしている場合、ユーザーがチャンネルにチューニングしたときに notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE) を onTune() の実装内で呼び出します。
入力サービスのタイムシフト機能に変更があった場合にシステムに通知するには、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 倍になるようにします。
パラメータを設定したら、ユーザーが別のパラメータを必要とする再生コマンドを発行するか、新しいチャンネルに切り替えるまで、設定を変更しないでください。