在 TV 输入服务中使用时移 API,让用户能够暂停、快退和快退 在您的服务渠道中快进直播节目。如果您的应用支持 时移,用户可以灵活地选择观看内容的方式:
- 用户可以在处理短期中断时暂停节目,因此 他们绝不会错过重要时刻。
- 用户可以快进播放他们看过的内容或 并不感兴趣。
- 用户可以快退并回看节目内容中最喜爱的情节。
![](https://developer.android.google.cn/static/images/training/tv/tif/time-shift.png?authuser=0000&hl=nb)
图 1. 时移用到的 Android TV 播放控件。
时移使用简短、临时的、录制的节目数据片段来实现 实现播放直播节目的功能。用户无法播放这些时移 录制的内容。也就是说,他们不能使用 时移功能可暂停一个节目到次日观看,或者暂停一个节目 之后再观看,在此期间他们切换到其他频道。
如果需要,可以使用电视录制 API 让用户可以录制节目内容,以便在当前播放之外观看 会话。
添加时移支持
要向 TV 输入服务添加时移支持,您需要实现
TvInputService.Session
类中的时移 API,
在您的应用中处理时移录制内容的录制和播放,以及通知
输入服务提供时移支持的系统。
您实现的 TvInputService.Session
方法是
以下:
onTimeShiftGetCurrentPosition()
: 来获取当前的 (以毫秒为单位)。有关详情,请参阅 跟踪播放时间部分。onTimeShiftGetStartPosition()
: 启动 当前时移录制内容的位置(以毫秒为单位)。如需了解更多详情, 请参阅跟踪播放时间部分。onTimeShiftPause()
: 在用户暂停播放时调用。onTimeShiftResume()
: 在用户继续播放时调用。onTimeShiftSeekTo(long)
: 在系统需要查找一个 新时间位置。通常,新位置介于 起始位置和当前位置。onTimeShiftSetPlaybackParams(PlaybackParams)
: 由系统调用 来提供当前会话的播放参数,例如播放速度。 有关详情,请参阅 支持播放参数部分。
有关如何通知系统您的输入服务支持的详细信息 请参阅 将时移状态告知系统 部分。
如果您是使用 TIF 随播内容库实现
TvInputService.Session
类,您会自动获得
使用 ExoPlayer 的时移实现。您可以使用
实现或替换时移 API 方法,
BaseTvInputService.Session
,并提供您自己的模型
实施。如需详细了解如何使用 TIF 随播内容库,请参阅使用
TIF 随播内容库。
在会话开始时录制内容
用户可通过访问 频道播放控件(可在播放时按选择键) 观看内容,然后导航到播放控件或使用 专用的播放控件。
因为用户可以
在观看节目内容时随时使用时移功能
用户一旦完成输入服务,输入服务必须立即开始录制时移内容。
调谐到您频道中的某个频道
onTune()
实施。您还需要
通过调用
notifyTimeShiftStatusChanged(int)
,
如
将时移状态告知系统
部分。
管理录制内容存储
TV 输入服务负责将时移录制内容存储在
应用的私有应用存储空间,并在系统调用
您的时移方法,例如
onTimeShiftResume()
。
如果您的内容已存储在云端,并且您的应用可以管理
使用云端存储空间
的应用存储空间。
如果您的内容使用了受保护的内容,您的 TV 输入服务应负责 对录制的内容进行适当加密,以及对内容进行解密, 。
由于录制的视频内容可能需要大量的存储空间,因此您需要 在会话播放过程中谨慎管理录制的内容。如果 会话时间超过了您可以记录和存储 时移,调整时移录制内容即可保持 但请确保捕获的是当前时间。例如,如果用户 内容播放时间已达 31 分钟,而您的时移录制内容数量已达到上限 大小为 30 分钟,请调整您的录制内容和开始时间, 从第 1 分钟到第 31 分钟的内容。
如果您的 TV 输入服务因缺少 您必须通知系统。有关如何通知 有关时移支持限制的系统,请参阅 将时移状态告知系统 部分。
当用户切换到其他频道或以其他方式结束播放时 请删除您录制的时移数据。
将时移状态告知系统
如果您的 TV 输入服务支持时移,请调用
您的notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE)
实施
当用户调谐时 onTune()
渠道。
告知系统输入服务是否有任何时移功能
更改, 使用
notifyTimeShiftStatusChanged(int)
。
例如,如果您的 TV 输入服务不支持时移
或者由于存储空间限制或其他原因,调用
notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_UNAVAILABLE)
。
如果您的 TV 输入服务根本不支持时移,则调用
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()
。
系统会使用这些调用来
更新播放控件界面中的时移时长。
支持播放参数
如需在时移过程中更改播放速度,系统需要使用播放参数。对于 例如,如果用户决定快退当前播放,则重新播放 参数以负的播放速度传递给您的应用。 时移还支持几种不同级别的播放速度(2 倍或 3 倍) 快进或快退
系统会调用您的
onTimeShiftSetPlaybackParams(PlaybackParams)
方法,其 PlaybackParams
对象包含
当前会话的参数。将此信息用于
适当配置您的媒体播放引擎。
如果您的播放引擎不支持某个参数, 尽可能地模拟预期的行为。例如,如果你的播放 引擎不支持 2 倍速度,请对播放使用重复跳转操作 来实现大约两倍的播放速度。
设置完参数后,请勿更改设置,除非用户执行了 发出需要其他参数或开关的播放命令 一个新频道