在電視輸入服務中使用時移 API,讓使用者暫停、倒轉及快轉服務頻道中的直播節目。如果應用程式支援時移功能,使用者就能彈性選擇觀看內容的方式:
- 使用者可以在處理短期中斷時暫停節目,因此絕不會錯過重要時刻。
- 用戶可以快轉跳過已經看過的內容或不感興趣的內容。
- 用戶可以倒帶重看節目內容中的精彩片段。
時移功能會使用節目資料的短暫錄製片段,實作播放直播節目的功能。使用者無法在目前的播放工作階段外,播放這些時移錄影內容。也就是說,他們無法使用時移功能暫停節目,次日再繼續觀看,也無法在切換到其他頻道時暫停節目,稍後再繼續觀看。
如果你想讓使用者錄製節目內容以便在目前播放會話之外觀看,請使用 TV 錄製 API。
添加時移支持
如要為電視輸入服務新增時移功能支援,您需要在 TvInputService.Session 類別中實作時移 API,在應用程式中處理時移錄製內容的錄製和播放作業,並通知系統輸入服務提供時移功能支援。
您實作的TvInputService.Session方法如下:
onTimeShiftGetCurrentPosition(): 系統會呼叫這個方法,取得目前的播放位置 (以毫秒為單位)。詳情請參閱「追蹤播放時間」一節。onTimeShiftGetStartPosition(): 系統會呼叫這個方法,以毫秒為單位取得目前時移錄製的開始位置。詳情請參閱「追蹤播放時間」一節。onTimeShiftPause(): 使用者暫停播放時呼叫。onTimeShiftResume(): 當使用者恢復播放時呼叫。onTimeShiftSeekTo(long): 系統需要搜尋新的時間位置時呼叫。通常,新位置會介於起始位置和目前位置之間。onTimeShiftSetPlaybackParams(PlaybackParams): 系統會呼叫這個方法,為目前的工作階段提供播放參數,例如播放速度。 詳情請參閱「支援播放參數」一節。
如要進一步瞭解如何通知系統輸入服務支援時移功能,請參閱「通知系統時移狀態」一節。
如果您使用 TIF 隨附程式庫實作 TvInputService.Session 類別,系統會自動提供使用 ExoPlayer 的時移功能實作項目。您可以採用這項實作方式,或覆寫 BaseTvInputService.Session 中的時移 API 方法,並提供自己的實作方式。如要進一步瞭解如何使用 TIF Companion Library,請參閱「使用 TIF Companion Library 建立電視輸入服務」。
在工作階段開始時錄製內容
使用者可以存取頻道的播放控制選項,暫停、倒轉及快轉節目內容。方法是在觀看內容時按下「選取」,然後前往播放控制選項,或使用遙控裝置上的專用播放控制選項。
使用者可以在觀看節目內容時隨時使用時移功能,因此只要使用者在onTune()實作中切換至頻道,電視輸入服務就必須立即開始錄製時移內容。此外,您也必須呼叫 notifyTimeShiftStatusChanged(int),告知系統您有錄製功能,如「通知系統有關時移狀態」一節所述。
管理錄製內容的儲存空間
電視輸入服務負責將時移錄影內容儲存在應用程式的私有儲存空間中,並在系統呼叫時移方法 (例如 onTimeShiftResume()) 時播放內容。如果內容已儲存在雲端,且應用程式可以管理雲端時移錄影內容,則可使用雲端儲存空間,而非應用程式儲存空間。
如果內容使用受保護的內容,電視輸入服務必須負責正確加密錄製的內容,並在播放期間解密內容。
由於錄製的影片內容可能需要大量儲存空間,因此您必須在播放工作階段期間仔細管理錄製的內容。如果播放工作階段時間超過可錄製和儲存時移內容的時間長度,請調整時移錄製設定,以維持目前的緩衝區,但確保擷取目前時間。舉例來說,如果使用者已播放內容 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 和更早版本的輸入服務。
追蹤播放次數
時移錄製內容的開始位置是使用者可搜尋的最早絕對時間位置,以自 Epoch 以來的毫秒數表示。通常是在呼叫 onTune() 後,影片開始播放的時間。不過,如果使用者觀看的內容量超過應用程式可記錄的量,您必須開始記錄新的時移片段,並相應更新開始時間。
時移錄製內容的目前位置是目前的播放位置,以 Epoch 紀元時間起算的毫秒數表示。播放期間,這個位置會持續變更。通常您可以使用播放引擎判斷這個值,如下列範例所示:
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 倍的播放速度。
設定參數後,請勿變更設定,除非使用者發出需要不同參數的播放指令,或是切換至新頻道。