支援影片播放操作

在電視輸入服務中使用時間平移 API,讓使用者可在服務管道中暫停、倒轉及快轉直播節目。如果應用程式支援時光平移,使用者就能靈活選擇觀看內容的方式:

  • 使用者可以暫停程式並處理短期中斷,避免錯過任何重要時刻。
  • 使用者可以快轉瀏覽自己看過的內容,或是不感興趣的內容。
  • 使用者可以倒轉及重複觀看節目內容中的喜愛的片段。

圖 1 用於時光平移的 Android TV 播放控制項。

時間平移會使用短期、暫時的錄製節目資料片段,實作播放直播節目的功能。使用者無法在目前的播放工作階段以外播放這些時間轉移錄製內容。因此他們無法使用時間轉移功能暫停播放節目,隔天再繼續觀看,也不能在切換到其他頻道時暫停播放的節目。

如果您想讓使用者錄製節目內容,以便在目前的播放工作階段之外觀看,請使用電視錄製 API

新增時光平移支援

如要為電視輸入服務新增時間平移支援,您需要在 TvInputService.Session 類別中實作時間平移 API,在應用程式中處理時間平移錄製內容的錄製和播放作業,並通知系統輸入服務支援時間平移。

以下為實作的 TvInputService.Session 方法:

如要進一步瞭解如何通知系統您的輸入服務支援時間平移,請參閱「通知系統的時間轉移狀態」一節。

如果你是使用 TIF 隨附程式庫實作 TvInputService.Session 類別,則會自動執行使用 ExoPlayer 的時間轉移實作。您可以使用此實作,也可以覆寫 BaseTvInputService.Session 中的時間平移 API 方法,並提供自己的實作內容。如要進一步瞭解如何使用 TIF 隨附程式庫,請參閱「使用 TIF 隨附程式庫建立電視輸入服務」。

在工作階段開始時錄製內容

使用者透過存取頻道的播放控制項來暫停、倒轉和快轉節目內容,可以在觀看內容時按下「選取」,然後前往播放控制項,或使用遠端裝置上的專屬播放控制項。

由於使用者在觀看節目內容時,隨時可以使用時間平移功能,因此使用者在觀看 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 以下版本的輸入服務。

追蹤播放時間

時間平移記錄的開始時間是指使用者可搜尋的最早絕對時間位置 (以紀元後毫秒為單位)。這通常是指在呼叫 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 倍速度,請在播放引擎上使用重複跳轉作業,可達到大約雙倍播放速度。

設定參數後,除非使用者發出需要其他參數的播放指令,或切換至新管道,否則請勿變更設定。