在您的 TV 输入服务中使用时移 API,让用户可以在您的服务频道中暂停、快退和快进直播节目。如果您的应用支持时移,用户在观看您的内容时将获得更大的灵活性
- 用户可以在处理短期中断时暂停节目,这样他们就不会错过关键时刻。
- 用户可以快进他们已经看过或不感兴趣的内容。
- 用户可以快退并重看节目内容中的精彩瞬间。

图 1. 用于时移的 Android TV 播放控件。
时移使用节目数据的短期、临时录制片段来实现直播节目的播放功能。用户无法在当前播放会话之外播放这些时移录制。这意味着他们不能使用时移来暂停节目以便第二天观看,或在切换到其他频道时暂停节目以便稍后观看。
如果您想让用户录制节目内容以便在当前播放会话之外观看,请使用TV 录制 API。
添加时移支持
要为您的 TV 输入服务添加时移支持,您需要在 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 创建 TV 输入服务。
会话开始时录制内容
用户可以通过访问频道的播放控件来暂停、快退和快进节目内容,方法是:在观看内容时按选择,然后导航到播放控件;或者使用遥控设备上的专用播放控件。
由于用户在观看节目内容时可以随时使用时移,因此您的 TV 输入服务必须在用户调谐到您在 onTune()
实现中设置的频道时立即开始录制时移内容。您还需要通过调用 notifyTimeShiftStatusChanged(int)
来通知系统您具备录制能力,如通知系统时移状态部分所述。
管理录制内容存储
您的 TV 输入服务负责将时移录制存储在您应用的私有应用存储中,并在系统调用您的时移方法(例如 onTimeShiftResume()
)时播放内容。如果您的内容已存储在云端,并且您的应用可以管理云端的时移录制,您可以使用云存储而不是应用存储。
如果您的内容使用受保护内容,您的 TV 输入服务负责在录制内容时进行适当加密,并在播放期间对内容进行解密。
由于录制的视频内容可能需要大量存储空间,因此您需要在会话播放期间仔细管理录制内容。如果播放会话时间超出了您可以录制和存储的时移时间量,请调整您的时移录制,以保持当前缓冲区但确保捕获当前时间。例如,如果用户已经播放了 31 分钟的内容,而您的最大时移录制大小为 30 分钟,请调整您的录制和开始时间以包含从第 1 分钟到第 31 分钟的内容。
如果您的 TV 输入服务因存储空间不足而无法支持时移,您必须通知系统。有关如何通知系统时移支持限制的更多详细信息,请参阅通知系统时移状态部分。
当用户切换到不同的频道或以其他方式结束其播放会话时,请删除您录制的时移数据。
通知系统时移状态
如果您的 TV 输入服务支持时移,请在您的 onTune()
实现中调用 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
,以便在用户调谐到频道时通知系统。
要通知系统您的输入服务的任何时移功能是否发生变化,请使用 notifyTimeShiftStatusChanged(int)
。例如,如果您的 TV 输入服务由于存储空间限制或其他原因无法支持时移,请调用 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
。
如果您的 TV 输入服务完全不支持时移,请在创建播放会话时调用 notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNSUPPORTED)
。系统将任何从未调用 notifyTimeShiftStatusChanged()
的输入服务视为不支持时移的输入服务。这包括使用 API Level 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 倍)用于快退或快进。
系统调用您的 onTimeShiftSetPlaybackParams(PlaybackParams)
方法,并带有一个 PlaybackParams
对象,该对象包含当前会话的参数。使用此信息来适当配置您的媒体播放引擎。
如果您的播放引擎不支持某个参数,请尽可能模拟预期行为。例如,如果您的播放引擎不支持 2 倍速度,请在播放引擎上使用重复的跳转操作以实现大约两倍的播放速度。
参数设置后,除非用户发出需要不同参数的播放命令或切换到新频道,否则不要更改设置。