Android TV-电视开发知识点速览

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android TV-电视开发知识点速览相关的知识,希望对你有一定的参考价值。

参考技术A

原文链接: Android-Tv

本文总结 android-TV 开发过程中,常见的基础知识点。主要分为TV-UI,IPTV,OTT,DVB,TVOS,DEBUG等几大模块展开。适用于常见盒子,电视,投影仪等TV开发。

开局一张图,直接上脑图

Android TV 界面开发有别与传统的移动手机端开发,TV端的交互主要是有用户遥控器操作完成,因而在TV上按键和焦点的处理显得尤为重要,其次TV端的输出显示媒介主要是电视显示屏,不同的电视所能支持的输入显示分辨率也不一样,因而分辨率的适配也是TV界面开发需要考虑的一点,除此之外TV界面的设计也与手机上的小屏显示不一样,由于是大屏显示,对UI的设计需更加偏平话,便捷化。

IPTV概念的普及,国内主要靠电信,联通,移动,广电四大宽带运营商。IPTV主要特点如下:

OTT的概率,国内主要靠互联网行业推动,类似小米/乐视电视,盒子,创维,康佳,海信等智能电视。OTT主要特点如下:

DVB的概念,存在时间最早,即传统的广电业务。DVB系统按照信号传播的顺序可以分成前端系统,传输系统和终端系统。其中前端系统一般位于节目生产部门(例如电视台等部门),而终端系统一般用户设备中(例如机顶盒)

区别于传送方式的不同,DVB的通用国际标准又可以分为以下:

DVB标准中描述的系统根据所属的层次不同从上层到底层可以分为:音视频编码层,服务信息层,基带传输层,信道编码层,射频层。对于Android开发而言,主要涉及的为服务信息层。服务信息层主要分为:

PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成,这些表会被插入到TS流中。 PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目。 下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构

PSI只提供了单个TS流的信息,使接收机能够对单个TS流中的不同节目进行解码; 但是,它不能提供多个TS流的相关业务,也不能提供节目的类型、节目名称、开始时间、节目简介等信息。 因此,DVB对PSI进行了扩展,提供了其他不同类型的表,形成了SI。
SI定义的表,并不需要全部传输, 其中,SDT、EIT和TDT是必须传输的; 而又以SDT和EIT最为重要,利用这2个表可以构成功能不同的EPG, 如提供节目附加信息、节目分类、节目预定和家长分级控制等。

S 业务I信息表分为以下几类:

DVB的搜台从用户角度来说,一般可以分为自动搜台,全频点搜台,手动搜台。其中手动搜台实质是单频点搜台,自动搜台是检索到ts流里面的频点信息后,还是回到单频点搜台,全频点搜台一般是固定了频率的数组,依次扫描单频点。

机顶盒搜台的实质是从TS流中获取并存储每套节目的音视频PID值和构建出电子节目节目指南。

以下总结三种搜台实现流程:

播放主要分为大屏播放以及画中画播放,一直搞不懂为啥还要有画中画这种业务场景的需求。画中画一般需要双demux支持。
dvb的播放流程与传统的播放器调用有所差别,一般需要底层,jni层封装单独的播放器接口调用。
dvb播放需传入频点信息,音视频pid,以及音视频类型等。

先看下官方简介-NGB TVOS,全称Next Generation Broadcasting Network TVOS,是中华人民共和国国家新闻出版广电总局科技司带头研发的基于Linux和安卓系统的一套应用于网络电视的操作系统。其开发者自称“兼顾现有操作系统的技术,比如Linux、安卓”,并增加信息安全模块,加强用户的信息安全保障,是专门针对电视终端的操作系统。
根据以上描述,结合NGB相关规范,不难看出,TVOS其实还是基于Android系统开发改造,主要是通用规范了中间层接口规范,为硬件软件厂家集成通用接口。
一套完整的TVOS系统,基本集合了DVB+IPTV的业务功能。TVOS应用层面基本覆盖如下几个方面

TV端的开发调试工作,与手机端也有些差异,TV端调试方式大致如下:

Android TV 开发焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

Android TV 开发系列文章目录

【Android TV 开发】安卓电视调试 ( 开启网络远程调试 )
【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )






一、父容器与子组件焦点获取关系处理



在布局文件中 , 父容器的节点中使用 android:descendantFocusability 属性 , 用于设置 父容器 子组件 之间的 焦点获取先后顺序 ;

    <ScrollView
        android:descendantFocusability="afterDescendants"
    	android:layout_width="match_parent"
    	android:layout_height="match_parent">

	</ScrollView>	

android:descendantFocusability 属性取值 :

① beforeDescendants : 父容器 优先获取焦点 , 如果父容器不需要焦点 , 子组件才能获取到焦点 ;

② afterDescendants : 子组件 优先获取焦点 , 如果子组件不需要获取焦点 , 则父容器获取焦点 ;

③ blocksDescendants : 只有 父容器 能获取焦点 , 子组件不能获取焦点 ;





二、不同电视设备上的兼容问题



在开发时遇到这样一种情况 , 布局的样式是 ScrollView 中嵌入一个 ConstraintLayout 布局 , 在 ConstraintLayout 布局中设置了很多需要获取焦点的子组件 ;

运行正常的情况 : 在 Google 提供的模拟器上运行时 , 正常运行 , ScrollView 的子组件中可以正常获取焦点 ;

运行失败的情况 : 但是在真实的国产电视盒子中 , ScrollView 始终组织其子组件获取焦点 , 即使设置了 android:descendantFocusability=“afterDescendants” , 子组件也无法获取焦点 ;


最终的解决方案 : 在子组件中 , 将需要获取焦点的组件都添加 android:focusable=“true” 属性 , 这样就解决了上述问题 ;


由此可见 , 相同的代码 , 在不同型号 , 版本 , 厂家 的电视设备上 , 焦点的获取 , 移动 , 表现是不一样的 , 因此这里就涉及到了焦点的兼容问题 ;


本次在 康佳 电视盒子中 , ScrollView 会阻断子组件的焦点获取 , 但是在其它界面 , 没有添加 android:focusable=“true” 属性 , 焦点获取功能也可以正常使用 , 这就比较难受 ;


这里建议 : 为了适配尽可能多的电视设备 , 推荐如下做法 :

① 设置可获取焦点 :需要获取焦点的组件 , 统一添加 android:focusable="true" 属性 ;

② 设置不可获取焦点 : 凡是 不需要获取焦点的组件 , 统一添加 android:focusable="false" 属性 ;

③ 设置组件兼容 : 凡是涉及到 父容器子组件 之间的焦点获取的情况 , 统一使用 android:descendantFocusability 属性 ;





三、按键获取焦点



按键获取焦点 : 在手机上按键获取焦点已经不常用 , 使用遥控器 / 手柄 控制界面需要关注该操作 ;

在 xml 布局文件中 , 在组件节点上设置如下属性 , 取值 true 或 false ;

android:focusable="true"

按键获取焦点 一般是手机自带的物理键盘 , D-Pad 遥控器 ( 电视遥控器 ) , 游戏手柄 等 , 使用方向键 , 控制焦点改变 ;

如果该 android:focusable 属性设置为 true , 则说明该组件可以获取焦点 , 按照不同的方向按键 , 焦点跳转到本组件设定的对应方向上的件 id 对应的组件 ;





四、触摸获取焦点



触摸获取焦点 : 目前的触摸屏手机控制焦点的主流操作 ;

在 xml 布局文件中 , 在组件节点上设置如下属性 , 取值 true 或 false ;

android:focusableInTouchMode="true"

Button , TextView , 布局组件 , 等默认没有触摸焦点 , 因为这些组件可能用于点击事件 , 如果这些组件可获取焦点 , 用户点击这些组件后 , 要先获取焦点 , 触发 OnFocusChangeListener 回调 , 获取焦点后才能进行点击 ;

EditText 默认自动获取焦点 , 并且进入界面抢先获取焦点 , 该组件需要有光标 , 并且弹出软键盘 ;

以上是关于Android TV-电视开发知识点速览的主要内容,如果未能解决你的问题,请参考以下文章

Android TV 开发安卓电视调试 ( 开启网络远程调试 )

Android TV开发总结构建一个TV app前要知道的事儿

Android TV 盒子APP开发(一)--连接机顶盒与常用adb命令

Android TV 开发焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

安卓Tv开发移动智能电视之焦点控制(按键事件)

Android TV开发总结TV上屏幕适配总结