在電視輸入服務中使用時光平移 API,讓使用者在您的服務管道中暫停、倒轉及快轉直播節目。如果您的應用程式支援時光平移,使用者就能以更靈活的方式觀看內容:
- 使用者可以在處理短期中斷時暫停程式,以免錯過任何重要時刻。
- 使用者可以快速略過看過的內容或不感興趣的內容。
- 使用者可以倒轉及重複觀看節目內容中的精彩片段。

圖 1:用於時間平移的 Android TV 播放控制項。
時間平移功能會使用錄製的簡短節目資料片段,實作播放直播節目的功能。在目前的播放工作階段之外,使用者無法播放這些時光平移錄製內容。這表示他們無法透過時光平移功能暫停節目隔天觀看,也無法暫停節目以便在切換到其他頻道時觀看。
如果想讓使用者錄製節目內容,使其在目前的播放工作階段之外觀看,請使用 TV Record API。
新增時光平移支援
如要為電視輸入服務新增時光平移支援,您必須在 TvInputService.Session
類別中實作時光平移 API,在應用程式中處理定時轉移錄音和播放作業,並通知系統您的輸入服務提供時間平移支援。
以下是實作的 TvInputService.Session
方法:
onTimeShiftGetCurrentPosition()
:系統會呼叫此方法來取得目前的播放位置 (以毫秒為單位)。詳情請參閱「追蹤播放時間」一節。onTimeShiftGetStartPosition()
:由系統呼叫,以取得目前時光平移記錄的起始位置 (以毫秒為單位)。詳情請參閱「追蹤播放時間」一節。onTimeShiftPause()
:使用者暫停播放時呼叫。onTimeShiftResume()
:使用者繼續播放時呼叫。onTimeShiftSeekTo(long)
:在系統需要尋找新的時間位置時呼叫。一般來說,新位置介於起始位置和目前位置之間。onTimeShiftSetPlaybackParams(PlaybackParams)
:由系統呼叫,提供目前工作階段的播放參數,例如播放速度。詳情請參閱「支援播放參數」一節。
如要進一步瞭解如何通知系統您的輸入服務支援時間轉移,請參閱「通知系統時間轉移狀態」一節。
如果您使用 TIF 隨附程式庫實作 TvInputService.Session
類別,則會自動取得使用 ExoPlayer 的時間轉移實作功能。您可以在 BaseTvInputService.Session
中使用這項實作,或是覆寫時光平移 API 方法,並提供自己的實作方式。如要進一步瞭解如何使用 TIF 隨附資料庫,請參閱使用 TIF 隨附程式庫建立電視輸入服務。
在工作階段開始時錄製內容
使用者可以存取頻道的播放控制項來暫停、倒轉及快轉節目內容,方法是在觀看內容時按下「選取」,然後前往播放控制項,或使用遠端裝置上的專屬播放控制項。
由於使用者觀看節目內容時可以隨時使用時間平移,因此您的電視輸入服務必須在使用者點選 onTune()
實作中的頻道後,立即開始記錄時移內容。此外,您需要按照「通知系統時間轉移狀態」一節的說明,呼叫 notifyTimeShiftStatusChanged(int)
來告知系統您可以錄製錄製檔案。
管理錄製內容的儲存空間
電視輸入服務負責將時間轉移錄製內容儲存在應用程式的私人應用程式儲存空間中,並在系統呼叫時間轉移方法 (例如 onTimeShiftResume()
) 時播放內容。如果內容已儲存在雲端,應用程式可以管理雲端的時間轉移錄音,您可以使用雲端儲存空間,而非應用程式儲存空間。
如果您的內容使用受保護的內容,電視輸入服務會負責在播放期間妥善加密錄製內容及解密內容。
由於錄製的影片內容可能需要大量儲存空間,因此您需要在工作階段播放期間妥善管理錄製的內容。如果播放工作階段時間超過能夠錄製和儲存時間平移的時間,請調整時光平移記錄以保留目前的緩衝區,但確保擷取目前時間。舉例來說,如果使用者播放內容長達 31 分鐘,且時間平移最長為 30 分鐘,請調整錄製和開始時間以納入內容 (介於 1 分 31 秒到 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 倍速度,請在播放引擎上重複搜尋運算,以達到大約雙倍速度的速度。
設定參數後,除非使用者發出需要其他參數的播放指令或切換至新管道,否則請勿變更設定。