什么是 TV Input Framework?它如何支持直播频道和点播内容?
解读
面试官问这条,表面在问“一个系统组件”,实质在考察候选人是否真正做过电视/盒子项目、是否能把“直播”与“点播”两种业务形态在 Android TV 体系里落地。国内场景下,直播源往往是运营商组播或自建 CDN 的 HLS/HTTP-FLV,点播则对接自家 CMS 或爱奇艺/腾讯视频 SDK;同时广电总局要求必须支持“中国数字电视中间件”及“牌照方 DRM”。回答时要把 TIF 的“系统级通道”理念、HAL 的 TvInput HAL、应用层的 TV App/Channel App 三层串起来,并点出直播用 Tuner 或 IPTV 输入、点播用本地 HDMI-CEC 或 OTT 输入的差异,才能体现落地经验。
知识点
- TIF 整体架构:TvInputManagerService(系统服务)+ TvInput HAL(硬件抽象)+ TvInputService(应用级服务)+ TvProvider(频道/节目数据库)。
- 直播链路:Tuner 驱动 → TvInput HAL → 系统 TvInputService(如 LiveTVInputService)→ TvView/TvInputView → 直播应用(如 Live TV);频道信息通过 TvProvider 的 Channel/Program 表存储,支持 EPG。
- 点播链路:OTT 应用自身实现 TvInputService,在 onTune() 里返回本地 ExoPlayer 的 Surface,把点播节目伪装成“虚拟频道”写进 TvProvider;TV App 统一展示。
- 权限模型:android.permission.BIND_TV_INPUT 系统签名,android.permission.READ_TV_LISTINGS 读取 EPG;国内运营商还需 android.permission.ACCESS_TUNER 与 CA 卡权限。
- 国内合规:直播频道必须通过广电总局 AOSP 白名单,DRM 走 ChinaDRM 或牌照方私有方案;TIF 的 parental control、subtitle track、emergency alert 都要适配国标。
- 性能优化:直播 50 fps 场景下,TvInput HAL 需零拷贝送 SurfaceFlinger;点播走 TvInputView 时,把 ExoPlayer 的 AudioTrack 输出切换到 TV 音频焦点,避免音画不同步。
答案
TV Input Framework(TIF)是 Android 官方为电视/盒子场景设计的系统级中间层,目标是把“所有视频源”抽象成统一频道,供系统 TV App 统一浏览、换台和展示 EPG。
它由三大块组成:
① TvInputManagerService(系统服务)负责维护所有输入源的生命周期;
② TvInput HAL 屏蔽底层差异,直播走 Tuner/IPTV,点播走 HDMI-CEC 或 OTT;
③ TvProvider 数据库保存频道、节目、EPG、回看 URI 等元数据。
直播支持:
硬件路径:RF 信号 → Tuner 驱动 → TvInput HAL → 系统 LiveTVInputService → TvView 渲染;
软件路径:运营商组播流 → 本地 UDP 拉流 → 在自定义 TvInputService 的 onTune() 里把 MediaCodec 解码后的 Surface 交给 TvView;
频道数据:通过 TvContract.Channels 写入 content://android.media.tv/channel,系统 TV App 自动聚合,支持数字键换台、语音切台。
点播支持:
OTT 应用(如爱奇艺 TV 版)实现 TvInputService,在 onTune(Uri) 中拿到节目 URI 后启动 ExoPlayer,把视频输出到 TvInputView 提供的 Surface;
同时把该节目作为“虚拟频道”插入 TvProvider,type 设为 TYPE_PREVIEW 或 TYPE_VOD,系统 TV App 将其展示在“推荐”或“片库”行;
用户点击后,TV App 通过 Intent.ACTION_VIEW 把播放权交回 OTT 应用,完成付费鉴权与 DRM 解密。
通过 TIF,直播与点播被统一成“频道”概念,用户无需跳转 App 即可在系统层完成换台、收藏、回看、家长锁等操作;厂商也能在系统 TV App 里一次性集成牌照方 CA、ChinaDRM、广告插入和广电总局白名单审核,满足国内合规要求。
拓展思考
- 如果厂商要做“开机即直播”,如何把 Live TV 的 TvInputService 提前 500 ms 冷启动,同时避免抢音频焦点导致开机铃声被打断?
- 折叠屏手机接扩展坞输出 HDMI 时,TIF 如何识别手机端为“虚拟 TvInput”,让大屏端 TV App 直接显示手机里的直播频道?
- 国内运营商要求 30 天内必须支持“频道快速扫描”与“盲扫”,而 Android 原生 TvInput HAL 只提供标准 scan(),如何在不改系统源码的前提下,通过 HIDL 扩展实现私有盲扫接口?