用于Android及Linux智能电视机上的通用播放器的制造方法

文档序号:7819555阅读:229来源:国知局
用于Android及Linux智能电视机上的通用播放器的制造方法
【专利摘要】本发明公开了一种用于Android及Linux智能电视机上的通用播放器。该通用播放器分为应用接口层、数据处理层和硬件抽象层三层。应用接口层为流媒体应用提供统一的媒体调用方法,包含播放控制、参数反馈和服务质量接口。数据处理层主要由媒体插件系统来完成,包括接收、包解析、解复用、解码和输出等子模块,硬件抽象层主要包括硬件解码、音频输出和视频输出三个环节,它向上以本地接口库的形式存在于流媒体中间件中的平台硬件适配层。本发明解决了播放器的兼容性问题,同时此播放器还能提供流媒体播放功能,更好的服务流媒体业务。
【专利说明】用于Android及Linux智能电视机上的通用播放器

【技术领域】
[0001] 本发明涉及一种用于Android及Linux智能电视机上的通用播放器;其以中间件 模块的形式为上层应用开发者提供接口,以屏蔽底层的实现细节,同时满足流媒体的服务 质量及控制需求。

【背景技术】
[0002] 在现代社会里,除了报刊、广播等传统媒体,以及网络等新兴媒体,电视是人们获 取信息的最重要的途径之一。电视的发展也是日新月异,伴随着电视媒体从模拟电视发展 到数字电视。再随着数字电视的发展,智能电视也逐渐进入企业和寻常家庭之中。但目前 的智能电视出于不同厂家,基于不同的电视芯片方案,采用不同的嵌入式软件,在播放器上 也存在着极大的差异,对于播放多媒体视频内容的电视应用,不同的电视有着不同的播放 器播放机制和接口。另外,目前的播放器的功能参差不齐,在流媒体业务等方面的普遍支持 不足。
[0003] 对于互联网电视和初级智能电视,一般来说,其硬件性能一般,主频在400MHz左 右为主,能实现一般的电视互联网上网功能,播放功能等等,方案采用MStar,MTK,Trident 等电视解决方案,有着不同的硬件平台,一般采用Linux的操作系统。而目前推出的智能 电视,硬件性能得到一定程度上的提升,主频在IGHz左右,单核甚至双核多核,基于采用 Linux或者Android系统的自由扩展电视机功能的软件平台,支持更多的电视开发应用。鉴 于电视的本性,主要用于体验视频业务,所以在电视硬件方面,同样都支持硬件级的视频编 解码。
[0004] 目前Linux智能电视的播放器针对厂家本身特定的智能电视硬件提供私有播放 接口,不同的智能电视有着不同的播放器机制和接口。
[0005] 而对于Android智能电视,Android播放器逐步成为Android系统中的一个重要 部分,用于播放视频业务。Android系统是Google开发的一款基于Android内核设计的 开源移动〇S。Android操作系统已经成为全球最大的智能手机操作系统,平板电脑系统,以 及智能电视系统。Android支持应用程序开发安装和使用,形成了一个完整生态系统。但 Android本身主要用于移动互联网领域,对于智能电视的支持还有待改善,特别是视频流 媒体播放器的支持,直播电视组播支持,以及针对电视的应用开发,Android本身并不支持 IGMP组播,同时在MPEG-2 TS over RTP也缺乏好的支持。因此,根据这些Android播放器 的缺点,结合Linux下通用播放器,对基于Android智能电视的视频流媒体业务进行开发优 化,提供统一的高性能播放器,使得Android智能电视能流畅的观看点播和组播视频业务 是目前需要解决的一个主要问题。


【发明内容】

[0006] 本发明的目的在于提供一种用于Android及Linux智能电视机上的通用高性能播 放器;该通用播放器能跨硬件和底层软件平台,为上层应用提供统一的播放器播放机制和 接口,解决播放器的兼容性问题,同时此播放器还能提供流媒体播放功能,更好的服务流媒 体业务。其支持多标准、多解码器、运行效率高、并且可移植性好、可扩展性强,支持多种硬 件平台,能够运行在不同操作系统上,能支持H. 263、H. 264、MPEG-4, MP3、AAC、AMR等音视 频编码规范,使上层应用不用关注媒体播放的实现细节。
[0007] 本发明的具体技术方案介绍如下。
[0008] 本发明中,通用播放器作为整个流媒体业务中间件系统中的一部分,负责为上层 具体的流媒体应用提供媒体播放的功能,主要包括本地文件播放,组播流式播放以及单播 顺序播放三种基本方式,其宏观结构如图1所示。
[0009] 通用播放器的结构自上而下可以分为三层,分别是应用接口层,数据处理层和硬 件抽象层。应用接口层为流媒体应用提供统一的媒体调用方法,包含播放控制接口,参数 反馈接口和服务质量接口。数据处理层主要由媒体插件系统来完成,包括接收,包解析,解 复用,解码和输出等子模块,这些模块的功能可以以动态库的形式被替换或者扩展,完整的 播放器实例通过依次调用对应插件的开放接口来实现对媒体数据流的控制和实时反馈,此 夕卜,针对流媒体业务特有的质量监测与控制功能以及其他额外功能也是通过额外配置插件 库的方式来实现。硬件抽象层(HAL)针对不同平台的硬件相关功能进行了封装以及统一接 口,主要包括硬件解码,音频输出和视频输出三个抽象组件,它向上以本地接口库的形式存 在于流媒体中间件中的平台硬件适配层。另外,通用播放器还可能用到一些通用功能,比如 网络包格式解析,媒体格式解析,软件解码算法,内存资源分配,线程安全操作等,这些功能 以公共库的方式被提供,隶属于流媒体业务中间件架构的基础服务层部分,比如本发明对 于媒体信息封包的解析与解复用过程就采用了 ffmpeg中的相应库,主要包含解析音视频 文件库和公共工具函数库两块。
[0010] 一、通用播放器的硬件抽象层 一般来说,PC平台由于其强大的计算和并行处理能力可以选择播放器自带的软件解 码算法来进行压缩数据解码,而多媒体机顶盒出于性能因素考虑需要通过专用的DSP硬件 处理芯片来完成相关工作。对于音视频的输出而言,PC可以通过声卡显卡驱动来完成裸 数据的播放与显示,驱动上层接口 一般会适配主流的多媒体系统框架,比如windows下的 Directshow,Iinux下的GStreamer等,而这点对于大部分嵌入式平台来说是缺失的。其 中,有些厂商提供了输出设备驱动,却没有统一的接口调用,有些厂商则直接提供自己独有 的音视频处理SDK (标准开发工具包)。
[0011] 综上所述,对于嵌入式平台的流媒体应用开发而言,音视频的硬件解码和输出往 往会与具体的平台系统相关,且这些平台向上并未提供统一的调用方式,因此,这些部分需 要硬件抽象。通用播放器的硬件抽象层分为三个部分,分别是音频输出抽象组件,视频输出 抽象组件和解码抽象组件。这些组件都是以动态库的方式存在于流媒体业务中间件中,具 体播放器实例调用的是最上层的本地媒体接口库和解码接口库。
[0012] 1、音频抽象组件 音频抽象组件对应具体嵌入式平台上的音频设备及相关操作的封装,包括音频数据流 的传输与控制,对上层提供的接口功能则体现在PCM格式的声音输出以及管理设置相关参 数上。如图2所示,整个音频抽象组件系统由以下几个部分构成: (1)音频驱动程序(Audio Driver) 在操作系统核心态的设备驱动程序,虽然在各个平台实现方式各异,然而在通常情况 下大部分音频驱动程序都需要提供包括音量控制,静音,通道控制等功能的控制类接口以 及用于支持PCM类型数据读写的传输接口。在某些特殊嵌入式系统中,音频系统是和硬件 编解码结合在一起的,即可以直接进行诸如MP3, AAC等编码音频的输出,这同样也可以归 并到数据读写传输功能中。
[0013] (2)音频抽象层(Audio HAL) 对音频设备进行抽象并封装其通用接口,具体在音频硬件接口的头文件中定义,包含 了音频设备类、和音频硬件接口两个类,分别用于输出和控制。音频硬件接口类是音频抽象 层的控制核心,它通过开启音频设备方法获取音频设备类,将其作为音频的输出设备来使 用。对于具体的音频设备类来说,设置参数方法和获取参数方法负责设置和获取当前音频 的标准参数,包含音频设备的路径、采样率、格式、通道、帧数等,如果具体平台不支持则返 回无效值。设置音量方法控制双声道的音量,如果是单声道以左声道为准,写方法用于往音 频设备中写入PCM裸数据,其参数是一个内存的指针和长度,这块内存不可被更改。实现一 个具体平台的音频抽象层需要编写代码去继承相应的类来实现这些虚函数接口,并将其代 码编译生成音频动态库,供音频服务层进行连接调用。
[0014] (3)音频服务层(Audio Service) 音频服务层是音频抽象组件的中间层,提供连接音频接口层和硬件抽象层的服务,它 主要由音频服务类和音频客户端类构成,音频服务类调用音频抽象层的接口来获得不同类 型的音频设备对象,并进行逻辑上的整合,比如可以在初始化输出设备之前做一些预处理, 调用另一个混音器设备,用以对输出之前的声音进行优化,提供多通道,声音缩放,重取样 等功能。音频客户端类作为向音频服务类注册的监听器,相当于使用回调函数来获取音频 运行时的实时参数信息。除此之外,一些与硬件无关的音频处理方法我们也都可以放在服 务层中去实现,以增强实际音频输出的效果。
[0015] (4)音频接口层(Audio API) 音频接口层的内容在媒体库中实现,它主要包含音频系统和音频输出个接口类,其中 音频系统提供了获取和设置音频设备参数的接口,音频输出则包含了对设备的状态控制和 数据写操作,具体的实现通过调用服务层代码来实现,然后提供本地接口给播放器实例进 行调用。
[0016] 整个音频抽象组件中各对象之间统一建模语言调用关系如图3。
[0017] 2、视频抽象组件 对于多媒体嵌入式设备来说,视频的渲染显示一般是通过在主显示区上叠加额外层的 方法来实现。通常情况下,主显示区用于图形系统的输出(RGB颜色空间),额外的显示区则 用于视频输出(YUV颜色空间),两者使用互相独立的巾贞缓冲(Framebuffer),然后再通过硬 件混叠的方式呈现在最终屏幕上。因此对于视频输出的抽象主要通过对叠加层设备及其操 作进行封装来得到,这部分包含了视频数据流传输和控制接口,对外提供的功能包括最终 解码后视频帧的渲染显示以及对视频设备的控制与管理(亮度,对比度,显示位置,叠加层 次等)。整个系统如图4所示,由以下几个部分构成: (1)视频驱动程序(Video Driver) 在内核中实现,在Iinux操作系统下通常是基于帧缓冲或者V4L2来完成视频输出相关 操作。根据系统的不同,即使使用同一种驱动程序,实现方式也可能不同。
[0018] (2)视频抽象层(Video HAL) 对画面叠加层的显示缓冲输出设备进行抽象并封装其通用接口,具体在覆盖硬件接口 头文件中定义,包含覆盖硬件接口和覆盖设备两个类,分别用于管理控制显示设备以及显 示内存的输出和参数设置。视频硬件接口类通过开启覆盖设备方法获取覆盖设备类,将其 作为视频的叠加输出设备来使用。覆盖设备包含了多种参数设置方法,比如设置/获取位 置方法用于设置叠加显示层的位置,设置/获得叠加方法用于调整叠加层的叠加层次,设 置/获得区域方法用于设置画面剪切的区域,重置大小方法用于改变输入视频数据的长宽 比大小,此外设置/获得参数方法还可以对其他的一些参数进行配置。根据具体平台的驱 动程序实现的差异,抽象层一般提供了两种方式进行视频输出,分别是: a)内存映射方式。通过使用获得缓冲地址方法获得显示内存的指针,再根据宽、高和颜 色格式等参数对这块内存进行写操作以完成输出效果。
[0019] b)内存队列方式。通过使用队列缓冲方法将需要输出的内存以队列的方式送给设 备来进行显示,去队列缓冲是一个阻塞函数,用于确定上一次压入队列的内存是否被成功 接收返回。
[0020] 如果要实现一个具体平台的视频抽象库则需要编写代码去继承这些类并实现对 应的虚函数,而具体采用哪种方式进行显示内存读写取决于不同类型的视频输出驱动程 序。
[0021] (3)视频服务层(Video Service) 视频服务层是视频抽象输出系统的中间层,提供连接视频接口层和硬件抽象层之间的 服务,它包括视频服务和视频客户端两个类。其中视频服务调用视频抽象层的接口来获得 叠加显示设备对象,如果流媒体应用要求且具体平台支持画中画功能,即多重叠加层,则视 频服务可以通过分别初始化两个叠加显示设备对象,并设置各个对象层次和位置来实现相 关逻辑。视频客户端作为监听类获得视频输出时的实时参数。
[0022] (4)视频接口层(Video API) 视频接口层具体包括视频系统和视频输出两个接口类,视频系统提供了获取和设置 指定视频显示设备参数的接口,视频输出则负责实际视频裸数据的输出与状态控制,其具 体实现通过调用服务层代码,然后封装成本地媒体接口以媒体动态库形式被播放器实例调 用。
[0023] 整个视频抽象组件中各对象之间统一建模语言调用关系如图5。
[0024] 3、解码抽象组件 多媒体嵌入式设备对于音视频压缩的编解码实现方式一般各不相同,一部分厂商会支 持Openmax的编解码集成层标准,也有的厂商会采用自己独立的优化硬件解码系统。针对 这些差异性,解码抽象主要对解码过程中的相关操作进行了封装,除了包含数据解码功能 以外,它还需要提供对解码器的管理与控制,包括获得当前解码器的类型,状态与实时统计 信息等。如图6所示,整个解码抽象组件系统分为三个层次: (1)硬件解码驱动(Codec Driver) 对应具体硬件平台的解码DSP芯片驱动或者是更上层的解码编程库,其通用的操作包 括指定格式数据解码,解码状态和统计信息获取。
[0025] (2)解码抽象层(Codec HAL) 解码抽象层的接口在解码硬件接口头文件中定义,包含了解码设备和解码硬件接口两 个类,分别用于解码和设备控制。解码硬件接口调用开启解码器函数获取解码器类。该类 用于抽象具体的解码设备,其中设置参数函数用以设置用于解码的编码类型,解码函数对 应于具体数据的解码和输出,获得解码状态函数用于获得实时的解码统计信息,包括视频 码流宽度和高度、解码帧率和码率、接收帧数、丢失帧数、平均码率等。此外设置/获得参数 方法还可以对其他的一些参数进行配置。
[0026] (3)解码服务层(Decode Service) 解码服务层主要是对实际系统支持的硬件解码进行判别与分类,对于不支持硬件解码 的类型,需要调用公共库中的软件解码算法来完成相应功能。
[0027] (4)解码接口层(Decode API) 向上提供本地接口供通用播放器实例进行调用。
[0028] 二、通用播放器的数据处理层 任何的多媒体播放器对于数据的处理流程都要至少经过接收、解复用、解码和输出四 个步骤,本发明将这些相对独立的过程封装成插件形式的模块,模块之间通过统一的数据 注入接口来实现通信,模块与模块之间则通过事件消息来实现控制。如果要对播放器增加 额外功能,比如对字幕的支持、对网络数据的预处理等,也只需要在某两个模块中加入一个 自定义的插件即可。插件本身只是对数据进行修改和过滤,并不改变整个播放流程的处理 逻辑,这样可以有效减小播放器功能扩展带来的工作量。针对以上目标,本发明在综合参考 多种主流多媒体框架后,设计并实现了一套简单的媒体插件系统及对应的事件驱动模型方 法。
[0029] 1、插件系统 插件系统有两个部分构成,分别是插件管理器(PluginManager)和插件库(so),主程 序使用插件管理器(PluginManager)加载这些插件库,插件管理器通过导出函数将各个类 ID、对象创建函数地址统一管理起来,从而在插件管理器的中介作用下让各个插件能相互 使用各种接口函数。
[0030] 2、媒体插件设计 根据流媒体实际需求,我们将通用播放器需要用的功能插件分为6类,分别是接收插 件、分离插件、解码插件、输出插件、增强插件和控制插件,具体描述如下。
[0031] (1)接收插件 接收插件采用统一的接口来屏蔽不同的原始数据入口,它通过统一资源定位器来区分 不同的输入源,提供了以下几类方法。开启方法负责根据不同的统一资源定位器类型初始 化相应的数据读取功能,打开文件,设备或者网络套接字,此外,如果是RTSP点播请求,还 需要处理与服务器之间的协议交互。读方法作为读操作接口,完成文件读取或者网络数据 接收。搜索方法是搜索定位接口,文件接收类型就将读指针定位到指定位置,点播接收类型 需要发送相应的控制命令,直播则不需要实现该接口。告知方法用于返回当前已经读取到 的数据总量。
[0032] (2)分离插件 分离插件负责识别原始流的格式,解析原始流中的数据类型,分辨视频、音频编码类 型,最后过滤出原始流包含的各路媒体数据,分别传输给解码插件进行处理。读取探测方法 用于探测原始数据流的类型,读取头方法确定格式并选定解码器,读取帧方法读取一帧数 据,在内部完成封装,最后以帧的形式输出。
[0033] (3)解码插件 解码插件也为系统提供了统一的接口,主要完成对各种不同媒体传输流的解码。由滤 波器传过来的传输流可能有视频流、音频流和其他数据流。对于不同类型的传输流,根据它 们各自的类型编号,送入不同的解码插件进行解码。
[0034] (4)输出插件 输出插件为通用播放器实例提供了统一的输出接口。该插件实际调用硬件抽象层的本 地接口,将经过同步处理后的音视频帧输出到对应设备上去。其中,开启函数用于打开指定 类型的输出设备,设置/获得函数用于设置和获得设备状态和参数,写函数用于向输出设 备上写数据。需要注意的是,对于视频数据,输出插件有可能需要进行颜色空间转换之后再 进行输出。而字幕之类的数据,输出可能是读取字库后与视频数据混合之后再一起输出,或 是直接输出到覆盖设备。
[0035] (5)增强插件 增强插件为系统提供增强功能,它可以是对解码插件输入到该模块的信号进行数字处 理,如3D效果增强、均衡、消除噪声等,使输出更逼真、生动,更令人满意,也可以是对不同 输出设备的颜色空间转换,延时时间转换等。需要注意的是,和其他类型的插件不同,系统 中可能同时会有多个增强插件在工作。开发者通过选择使用的增强插件及其顺序。增强 插件有多种类型,系统将从解码插件得到的数据顺序送入同一数据类型的各个增强插件 处理。增强插件对数据的处理不改变其长度、类型、时间戳,仅对数据本身进行操作,增强其 特性。
[0036] (6)控制插件 控制插件与其他插件进行交互已达到控制播放的功能。
[0037] 3、事件消息驱动 播放器的数据处理任务需要播放器调用相关事件接口来触发,这就需要建立一个完整 的事件驱动模型,如图7所示,图中反应器类是监听者,它利用操作系统提供的多路分离函 数来实现循环等待,当事件接口被调用时,它会生成对应事件对象并将其加入到异步调度 器类的阻塞队列中缓存。调度器在初始化时通过注册处理器函数将事件处理器对象注册到 事件驱动列表中,另一方面,它通过派发方法来实行事件分配调度,以保证对于某一类型的 事件,会调用适当事件处理器类的响应函数处理事件来进行处理。这个模型的优点是将事 件本身与处理函数解耦,同时可以对实时事件进行存储转发,以消除事件处理过程对播放 系统带来的性能影响。
[0038] 三、通用播放器的应用接口层 应用接口层为流媒体应用提供统一的媒体调用方法,包含播放控制,参数反馈和服务 质量接口。本产品将通用播放器为应用程序提供的接口进行整理和提取,分为播放器的获 得和销毁、播放器的打开和关闭、播放控制、状态控制和参数获取这五大类API,如表1所 示。播放器的获得和销毁这类接口用一个播放器池来实现对播放器的统一管理,提供了对 某种类型播放器的获得与销毁。播放器的打开和关闭这类接口为应用开发者提供了对获得 的播放器的打开和关闭操作,没有播放任务的播放器可以关闭但是不销毁,这样可以节省 重新获得播放任务的开销,并节约系统资源。播放控制这类接口为应用开发者提供了视频 播放基础的播放控制功能,并提供了扩展接口以应对额外的播放控制请求。状态控制这类 接口为应用开发者提供了获取当前播放状态的接口。参数获取这类接口为应用开发者提供 了获取当前播放视频各类参数的接口,并提供了扩展接口以应对额外的参数获取请求。 [0039] 表1通用播放器API列表

【权利要求】
1. 一种用于Android及Linux智能电视机上的通用播放器,其特征在于:其结构自上 而下分为三层,分别是应用接口层,数据处理层和硬件抽象层;其中: 应用接口层用于为流媒体应用提供统一的媒体调用方法,其包含播放控制接口,参数 反馈接口和服务质量接口; 数据处理层主要由媒体插件系统来完成,包括接收,包解析,解复用,解码和输出子模 块,这些子模块的功能以动态库的形式被替换或者扩展,完整的播放器通过依次调用对应 插件的开放接口来实现对媒体数据流的控制和实时反馈; 硬件抽象层针对不同平台的硬件相关功能进行封装以及统一接口,主要包括硬件解 码,音频输出和视频输出三个抽象组件,它向上以本地接口库的形式存在于流媒体中间件 中的平台硬件适配层。
2. 根据权利要求1所述的通用播放器,其特征在于:所述硬件抽象层分为音频输出抽 象组件,视频输出抽象组件和解码抽象组件二部分;其中:所述首频输出抽象组件由首频 驱动程序、音频抽象层、音频服务层和音频接口层构成;所述视频输出抽象组件由视频驱动 程序、视频抽象层、视频服务层和视频接口层构成;所述的解码抽象组件由解码驱动程序、 解码抽象层、解码服务层和解码接口层构成。
3. 根据权利要求1所述的通用播放器,其特征在于:所述数据处理层中的媒体插件系 统由插件管理器和插件库组成,插件管理器通过导出函数将各个类ID、对象创建函数地址 统一管理起来,从而在插件管理器的中介作用下让各个插件能相互使用各种接口函数;其 中,所述插件库中的插件分为六种插件:接收插件,分离插件,解码插件,输出插件,增强插 件和控制插件。
4. 根据权利要求1所述的通用播放器,其特征在于:增加播放器额外功能,通过采用插 件封装模块的形式实现,模块之间通过统一的数据注入接口来实现通信,模块与模块之间 则通过事件消息来实现控制。
【文档编号】H04N21/443GK104333808SQ201410642384
【公开日】2015年2月4日 申请日期:2014年11月14日 优先权日:2014年11月14日
【发明者】刘新, 马思超, 叶德建 申请人:复旦大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1