基于MooPlayer的高效稳定的OpenMAX设计
2017-08-02陈冬英
陈冬英
(福建江夏学院 电子信息科学学院 福建 福州 350108)
基于MooPlayer的高效稳定的OpenMAX设计
陈冬英
(福建江夏学院 电子信息科学学院 福建 福州 350108)
强大的多媒体功能已经成为衡量智能电视性能的重要标准。MooPlayer系统是基于Android平台改进设计的,重新设计OpenMAX层,将组件串接(tunning)在一起,完善数据通道,加快数据处理过程,并通过Handle消息机制,实现模块间的异步控制。同时,开发出能支持更多媒体格式、具有强解码功能、广泛协议支持以及高解码效率的多媒体框架,弥补Android自身在多媒体框架方面的不完善,解决StageFright源码中能够支持的媒体格式种类有限、解码效率低的问题。测试结果表明,该MooPlayer播放器系统兼容性强,具备稳定的播放功能,解码效率高且能够支持更多的媒体格式,满足用户需求。
Android;多媒体框架;MooPlayer播放器;OpenMAX
0 引言
随着移动互联网的飞速发展和智能化电视产品的普及,多媒体的应用越来越广泛,作为一款新兴的操作系统,Android自身的多媒体框架处于不断完善阶段[1-2],版本间分化问题十分严重,且利用Android平台上已有的媒体框架开发时,往往涉及版权的问题,不能够灵活地进行添加修改、添加新的Codec类型[3]。因此,开发拥有强解码功能、高解码效率且支持广泛协议的多媒体框架,具有十分重要的意义[4-5]。
本文设计的MooPlayer就是基于Android平台,借助于Android平台的优势,开发出能适应不同硬件平台的媒体播放器,并在播放器框架设计中保留StageFright框架中使用到的OpenMAX IL引擎[6-7],使得MooPlayer能够实现嵌入式开发,在底层通过OpenMAX IL引擎与硬件编解码相结合,提高编码效率,克服了软件编码效率不高的问题,满足人们对高清视频的要求,具有重要意义。
为了加快数据处理过程,本设计对MooPlayer的核心部分OMX进行重新设计,将Component进行进一步封装和管理,将OMX层的7大组件(AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender、Clock)串接在一起,构成一个Component链条。在上层构建Pipeline模式,底层构建Tunnel模式,完善数据通道,并将解复用后的音视频流送到硬件板解码,加快了解码速度,使得播放器能够支持更高的码率。
1 OpenMAX简述
完成媒体流信息的解析后,要解决音视频流与底层的对接。本设计保留StageFright框架中使用到的OpenMAX IL引擎,使得MooPlyaer能够实现嵌入式开发,在底层通过OpenMAX IL引擎与硬件编解码相结合,提高了编码效率,克服了软件编码效率不高的问题,满足人们对高清视频的要求。
OpenMAX作为一套免版税、跨平台的多媒体框架标准,为多媒体开发者提供统一的API接口,加速组件的开发。OpenMAX框架包含了开发层(Development Layer,DL)、集成层(Integration Layer,IL)及应用层(Application Layer,AL)三层[8]。
OpenMAX IL作为一个系统抽象层,能够为音视频编解码器(Codec)提供底层接口,使得应用层及多媒体框架对组件(如sink、source)的访问方式趋于统一[9-10]。Codec对用户来说是透明的,可以是软件或者硬件。
2 MooPlayer系统中OpenMAX设计
2.1 OMX IL Client总体设计
图1给出OMX IL Client的总体实现流程。图中,客户端(本设计中称为AOMXComponent)先获取AOMXProxy实例,并在构造函数中根据配置加载所需的plugin,本设计中加载libmtkomx_tunnel.so,即mtk提供的一个硬解码库。接着,AOMXProxy调用IL Core的初始化函数OMX_init,而后开始创建AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender及Clock 7大组件。组件创建时客户端为组件设置一个 notification message,用于事件回传到MooPlayer。组件创建后需要对其进行配置并建立组件间隧道,将组件的状态切换至EXECUTING。解复用后的音视频数据沿着建立的管道进行解码处理,媒体文件播放完后释放并卸载相应的组件,最后销毁内核。下面介绍主要子模块的详细设计。
2.2 内部类继承关系
图2给出MooPlayer框架中Client端Component类的关系示意图。其中,AOMXComponent是所有Client端Component的基类,它在MooPlayer框架中处于一个适配层的角色,通过AOMXProxy与服务端(IL Core或IL Component)进行通信,完成大部分的工作。
AOMXComponent主要的工作包括:
(1)维护Component的状态以及端口上下文等信息;
(2)暴露IL的接口,供MooPlayer调用;
(3)处理Component的反馈信息。
图2 Client端Component类的关系图
AOMXProxy是IL Client与IL Component的通信接口,它的作用是:
(1)根据配置加载不同的 IL 库。
(2)封装并暴露 IL Component 的接口。
(3)通过KeyedVector
(4)转发IL Client的消息到Component,同时依赖于ComponentObserver反馈Component的事件或消息到IL Client。
AOMXVideo封装视频处理相关的接口(包括AOMXVideo Decoder、AOMXVideoProcessor、AOMXVideoScheduler和AOMXVideoRender)。同样,AOMXAudio封装音频处理相关的接口(包括AOMX AudioDecoder、AOMXAudioRender)。同时,基于高效解码的考虑,AOMXComponent继承自AHandle,事件处理全部采用异步进行,并通过ComponentObserver来监听Component的反馈信息。
MooPlayer框架中为了加快音视频解码效率,丢弃了效率较低的软解码,设计了硬件抽象层,并动态加载硬件解码库libmtkomx_tunnel.so,实现硬件解码。不同的硬件可能差别较大,为了便于今后系统在不同的硬件板上进行移植,MooPlayer重新设计了Hardware层,按照OMX标准,封装了所有硬件接口。如图3所示,HardwareComponent是硬件抽象层组件的基类,包括HardwareVideo、HardwareAudio及HardwareClock。VendorPeerComponent是所有Vendor Component的基类,IL Component通过OmxHandle向IL Client暴露标准的API。IL Client获得的handle在OMXComponent的构造函数中创建,并在OmxHandle构造函数中对暴露给IL Client的函数指针进行赋值。当IL Client通过handle调用IL API时,最终会调用到Component的相应函数,当AOMXProxy调用 sendCommand时,最终会调用到OMXComponent的sendCommand函数。
图3 AOMXComponent与HardwareOMX
2.3 数据通道的设计
2.3.1 数据通道的设计
OpenMAX IL 以 Component 的形式封装了应用程序所需的功能,每个 Component 对应一个功能模块。
Component的结构示意图如图4所示。
图4 Component的结构示意图
每个Component都有唯一一个入口点,命名为Component Handle,IL Client在与Component数据交互前,需通过IL Core得到组件的Handle。Component通过Port接口和IL Client或组件进行通信,每个组件至少有一个 Port接口,接收待处理的数据接口称为Input Port,发送处理完的数据接口称为Output Port 。一般Port中包含多个缓冲区(Buffer)队列,进入端口的数据先存放于Buffer中。为了加快数据处理,可将多组件相联接,构成Component 链条,对数据进行流式处理。
Component有两种工作模式,MooPlayer多媒体框架中,为加快数据通信,采用Tunnel工作模式,将视频解码组件(VideoDecoder)处理后的视频流直接沿着建立的数据通道传入视频处理组件(VideoProcessor),VideoProcessor处理后的视频帧再送入视频调度组件(VideoSchduler),经过调度处理的视频流最后通过视频渲染(VideoRender)组件输出。同样,对于音频流,经过音频解码(AudioDecoder)后的数据直接送入音频播出组件(AudioRender)。另外,Clock组件所设定的时间时刻与音频帧的PTS保持一致,视频渲染组件再根据Clock来调整进度,从而实现音视频同步。MooPlayer系统中用到的7大组件的连接方式如图5所示。
图5 MooPlayer框架中Tunnel模式下的数据流通道
2.3.2 数据通道的控制
MooPlayer框架中,AOMXComponent 通过调用相应的函数来完成Buffer在Client与OMX间的传递,以音频数据为例,其数据在Client与OMX间的传递设计如图6所示。
(1)MooPlayer调用onFillThisBuffer()来填充未解码的音视频数据,调用mSource->dequeueAccessUnit()保证帧的完整性,填充完向AOMXComponent回复kwhatInputBufferFilled()。
(2)AOMXComponent使用EmptyThisBuffer把未解码的Buffer传递到解码组件(音频流对应AudioDecoder),解码组件收到EmptyThisBuffer后会读取组件接收端口中的数据进行解码。当缓冲区(Buffer)中的音视频数据被消耗完时,解码组件会向AOMXComponent反馈EmptyBufferDone。
(3)AOMXComponent收到该命令后继续向上层要数据来填充Buffer,继续向MooPlayer发送KwhatFillThisBuffer。
(4)由于采用Tunnel模式,不同的Component形成一条完整的数据通道,当音频数据在AudioDecoder解码完成后,数据会直接从AudioDecoder的Output Port Buffer流入AudioRender的Input Port Buffer。
3 系统测试与验证
MooPlayer丢弃效率较低的软解码,因此采用的测试环境是台湾联发科技股份有限公司(MediaTek.Inc)旗下的MT5593硬件板,将解析后的媒体信息流送入板子进行硬件解码,加快了解码速度。
3.1 功能验证
为保证设计方案可实现要求规范的模块内容,在评估系统性能前,先对播放功能的实现进行验证。
首先,在DLNA官网上注册账号密码,搭建MCVT(Media Compatibility Verification Tool)测试环境,利用官网上给的媒体文件对MooPlayer进行自动化测试,进而对其基本播放功能及系统兼容性进行验证。测试结果如图7所示。由图可知,MooPlayer能够播放DLNA官网上指定的媒体文件,系统兼容性强,支持Play、Stop、Pause、Seek、Fast Forward等基本播放功能。
图7 MCTV Test测试结果
3.2 性能测试报告
验证一个设计方案是否具备可行性、稳定性是否良好,需要分析性能参数是否能被用户所接受,并对系统性能做出合理的评估。衡量播放性能指标主要包括媒体格式支持情况和媒体播放所占用的功耗大小。
本设计对MooPlayer能支持的包装格式及编码标准进行了验证,表1列出了测试结果,并与Android自带的StageFrightPlayer进行了对比。从测试结果来看,MooPlayer几乎能支持所有常见的包装格式及传输协议,比Android原生的StagefrightPlayer支持的媒体格式更全面。如:Android自带媒体播放器不能解析MKV、F4V等视频编码格式,而MooPlayer能够支持这些格式;由于OpenCore中没有包含对应的flac的解码器,因此Android原生的StageFrightPlayer不能播放Flac无损音乐,而MooPlayer并没有沿用Android原本的解包装,而是选用FFmpegExtractor的解包装,媒体格式识别功能更强大,更能满足人们的需求。
表1 支持的媒体格式类型比较
同时,本设计选取分辨率为1 920×1 080的avi音视频文件作为分析对象,采用top命令实时检测系统中各个进程的资源占用情况。测出MooPlayer的CPU占用情况如表2所示。分析表2可知,待播状态时功耗小,这时处在用户选择播放文件的界面;启动状态时CPU总的占用率为42%,低于50%,易于快速响应播放操作,可保证流畅观影;播放状态时,只需要将音视频解码后进行显示播放,因此CPU占用率较低。经过多个音视频文件测试,CPU占用率的变化率均保持在1%,说明该播放器具有较高的稳定性。
表2 播放过程的CPU占用 (%)
4 结论
本文针对Android原生的StageFright多媒体框架上存在的问题,提出了基于Android系统的智能电视MooPlayer媒体播放器的解决方案,对OMX进行重新设计,对Component进行进一步封装和管理,上层构建Pipeline模式,底层构建Tunnel模式,完善数据通道,并将解复用后的音视频流送到硬件板解码。功能测试结果表明,该MooPlayer播放器系统兼容性强,且能够支持更多的媒体格式。同时性能分析结果表明,本文所设计的播放器能够支持的视频码率更高,符合实时性的要求,且播放功耗维持稳定,可保证流畅播放,满足用户需求。在Android平台上进行媒体播放器的开发能够满足人们对智能电视平台多媒体应用的需要,具有十分重要的意义。
[1] MIP公司.将智能AndroidTM体验带到所有带HDMI接口的数字电视[J].电子技术应用,2012,38(8):5-9.
[2] Cheng Yonghua, Kuo Wenkuang, Su S L. An Android system design and implementation for Telematics services[C]. IEEE International Conference on Intelligent Computing and Intelligent Systems(ICIS), 2010:206-210.
[3] 陈伟军,郑睿,虞鸿.一种基于Android智能手机的视频上传软件[J] .微型机与应用,2013,32(24):50-53.
[4] Song Maoqiang, Xiong Wenkuo, Fu Xiangling. Research on architecture of multimedia and its design based on Android[C]. International Conference on Internet Technology and Applications, 2010:1-4.
[5] 王冉.基于Android的多媒体及相关技术的研究和应用[D].北京:北京邮电大学,2014.
[6] 郭亮.OpenMAXIL的研究与应用[D].青岛:中国海洋大学,2012.
[7] 百度百科.RealPlayer[EB/OL].(2014-3-19)[2017-02-15]http: //baike. Baidu. com/view/5481504. htm.
[8] BARBA J, DE L F D, RINCON F, et al.Openmax hardware native support for efficient multimedia embedded systems[J].IEEE Transactions on Consumer Electronics,2010,56(3):1722-1729.
[9] 孙俊辉.基于Android平台的多媒体框架研究与实现[D].成都:电子科技大学,2012.
[10] 公磊,周聪.基于Android的移动终端应用程序开发与研究[J].计算机与现代,2008(8):85-89.
Efficient and stable OpenMAX design based on MooPlaye
Chen Dongying
(College of Electronic Information Science, Fujian Jiangxia University, Fuzhou 350108, China)
Powerful multimedia function is an important standard to measure the performance of smart TV. The design of the MooPlayer system is based on the Android platform . The OpenMAX layer is redesigned, the component is connected in series (tunning) together, the channels data is improved to accelerate the process of data processing, and through the Handle message mechanism the asynchronous inter module control is realized. Meanwhile, the multimedia framework is exploited, which can support more multimedia formats, with strong decoding functions, extensive protocol support. The system can make up for the imperfect Android native multimedia framework, which solves the problem of limited media format and low decoding efficiency in StageFright source code. The results show that the MooPlayer player system has strong compatibility, stable playback function, high decoding efficiency and can support more media formats to meet user needs.
Android; multimedia framework; MooPlayer; OpenMAX
TP949.197
A
10.19358/j.issn.1674- 7720.2017.14.012
陈冬英.基于MooPlayer的高效稳定的OpenMAX设计[J].微型机与应用,2017,36(14):35-38,42.
2017-02-17)
陈冬英(1989-),女,硕士研究生,助教,主要研究方向:数字电视的音视频处理、通信系统的设计与研究。