支持时间推移

在您的电视输入服务中使用时间推移 API,让用户能够暂停、倒带和快进您服务频道中的直播节目。如果您的应用支持时间推移,用户将获得观看内容的灵活性。

  • 用户可以在处理短期中断时暂停节目,这样他们就不会错过关键时刻。
  • 用户可以快进已经看过的内容或他们不感兴趣的内容。
  • 用户可以倒带并重新观看节目内容中的精彩片段。

图 1. 用于时间推移的 Android TV 播放控制。

时间推移使用节目数据的短期、临时、录制片段来实现回放直播节目的功能。用户无法在当前播放会话之外播放这些时间推移录制内容。这意味着他们无法使用时间推移来暂停节目,以便第二天观看,也无法暂停节目,以便在切换到其他频道时稍后观看。

如果您想让用户录制节目内容以在当前播放会话之外观看,请使用 电视录制 API

添加时间推移支持

要将时间推移支持添加到您的电视输入服务中,您需要在您的 TvInputService.Session 类中实现时间推移 API,处理您应用中时间推移录制的录制和回放,并通知系统您的输入服务提供时间推移支持。

您需要实现的 TvInputService.Session 方法如下

有关如何通知系统您的输入服务支持时间推移的更多信息,请参阅通知系统有关时间推移状态部分。

如果您使用 TIF Companion 库来实现您的TvInputService.Session类,您将自动获得使用 ExoPlayer 实现时间推移。您可以使用此实现,也可以覆盖BaseTvInputService.Session中的时间推移 API 方法并提供您自己的实现。有关使用 TIF Companion 库的更多信息,请参阅使用 TIF Companion 库创建电视输入服务.

在会话开始时录制内容

用户可以通过访问频道播放控件来暂停、倒带和快进节目内容,方法是观看内容时按选择,然后导航到播放控件,或者使用遥控设备上的专用播放控件。

由于用户可以在观看节目内容时随时使用时间推移,因此您的电视输入服务必须在用户在您的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()被调用后开始播放的时间。但是,当用户观看的内容量超过您的应用可以录制的量时,您需要开始录制新的时间推移段并相应地更新您的开始时间。

时间推移录制的当前位置是从纪元开始的毫秒数表示的当前播放位置。此位置在播放期间会不断变化。通常,您可以使用您的播放引擎来确定此值,如以下示例所示

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 倍速度,请在您的播放引擎上使用重复的查找操作来实现大约两倍的播放速度。

设置参数后,除非用户发出需要不同参数的播放命令或切换到新频道,否则不要更改设置。