摘 要:近年来,多种方法被用来提高多媒体的处理能力,其中Gstreamer的方法性能最佳,然而目前扩展多媒体框架的多媒体处理能力仍然存在很多问题。本文我们提供了另一个基于Gstreamer的Android视频多媒体处理框架。大量的实验表明,这个基于Gstreamer的框架在效率,兼容性,可行性和通用性等方面,明显提高了多媒体的处理能力。
关键词:开源操作系统;Android系统;多媒体框架
中图分类号:TP368.1;TN919.8文献标识码:A 文章编号:2096-4706(2018)09-0080-03
Abstract:In recent years,many methods have been used to improve the multimedia processing capability,among which the Gstreamer method has the best performance. However,there are still many problems in extending the multimedia processing capability of the multimedia framework. In this paper,we provide another Android based video multimedia processing framework based on Gstreamer. A large number of experiments show that our Gstreamer based framework significantly improves the multimedia processing capability in terms of efficiency,compatibility,feasibility and versatility.
Keywords:open source operating system;Android system;multimedia framework
0 引 言
Android是移动设备的一种开源操作系统,在许多多媒体终端被广泛应用,例如Google TV和平板电脑终端。然而,由于原来的多媒体引擎OpenCore无法处理大量常用的视频(音频)格式数据,近年来,多种方法被提出应用,以增强Android的多媒体处理能力。在不同的扩展方法中,基于Gstreamer的方法是最有效的。但是,目前的Android多媒体处理能力框架仍然不够好,存在很多问题。例如,许多框架只能处理特定格式的视频(音频)数据。本文提出了另一种基于Gstreamer的android多媒体框架,大量的实验表明我们的框架大大提高了多媒体处理能力的高效率、兼容性、可行性和普遍性。
1 Android系统架构
Android系统有五层框架,每层由一些核心组件组成。从上到下,核心组件依次是:应用程序,应用程序框架,Native C库,Android运行时环境(JVM),HAL(硬件抽象层),Linux核心。
(1)应用程序。应用程序层由许多核心的、基于Java的应用程序组成,如日历,网页浏览器,短信应用程序,电子邮件等。
(2)应用程序框架。应用程序框架包括Java核心类和一些特殊的Android组件。它允许Android应用程序开发人员开发各种Java类的应用程序。如一些典型的组件-查看(列表,网格),内容提供者,资源管理器,活动管理器。
(3)Native C库。Native C库层有许多C/C++组成库。Android的核心功能是由这些库实现的。
(4)Android运行时环境。运行环境由Dalvik组成的Java虚拟机和Java核心库来实现。
(5)HAL。该层抽象不同类型的硬件,并为Native C库提供统一的程序接口。HAL可以更轻松的在不同平台上制作Android端口。
(6)Linux内核。Android的核心系统功能依赖于Linux内核,例如安全管理,RAM管理,进程管理,网络堆栈等。
2 Android多媒体框架
2.1 总体多媒体架构
Android系统由五层多媒体框架组成,OpenCore引擎和硬件抽象层用于音频/视频的输入/输出。它以为Java服务提供一致的接口为目的。
2.2 OpenCore多媒体引擎
OpenCore是Android多媒体系统的核心。一般来说,它具有以下特性:首先,它支持最常见的音频格式和流媒体(RTSP/RTP)格式的数据。其次,能够与第三方编解码器一起扩展。
依据常规体系结构,OpenCore拥有许多功能,例如媒体文件格式分析,音频/视频解码等。从下到上,OpenCore包括OSCL(操作系统兼容层),PVMF(包视频多媒体框架),文件格式分析节点,解码节点,编码节点,媒体I/O节点,播放器引擎。此外,多媒体框架的PVPlayer在OpenCore中调用Player引擎以实现具体功能。同时我们可以通过整合、添加新的解码节点将第三方编解码器转换为OpenCore。
3 基于Gstreamer的多媒体框架
3.1 多媒体框架的设计
我们改变了汇编Gstreamer的一部分,以便整个多媒体框架可以运行在具有CPU架构的不同种类的多媒体终端(例如:X86,ARM,MIPS,SH4)。此外,我们采用预链接技术来加强执行效率。最后,我们应用OpenMax IL标准,以支持特殊开发中的硬件视频加速板的处理。
3.2 多媒体框架的实施
为了达到理想的功能,我们需要进行以下工作:
(1)需要移植Android开源库中的Gstreamer,例如如Glib,Liboil等。
(2)根据Gstreamer框架,编写两个插件。一个用于将解码后的原始视频数据从Gstreamer发送到Android显示系统(SurfaceFlinger的);另一个用于发送解码后的原始PCM音频数据到Android音频系统(Audioflinger)。
(3)基于Gstreamer,构建一个媒体播放器,并提供媒体播放器服务。
(4)修改汇编代码,以将Gstreamer应用于多种CPU架构,并在嵌入式环境中应用一些常用的优化技术到Gstreamer。
由于Glib,Libiol和其他相关库的移植工作非常简单,在这里我们介绍其余的步骤。
(1)Surfaceflinger。Surfaceflinger是Android显示的重要组成部分。它具体的实施机制相当复杂。此外,它还为Native C使用者和Java使用者提供编程接口。为将解码的原始数据发送到Surfaceflinger,以在Native C使用者中显示出来,需要执行以下操作:
首先,通过Surfaceflinger客户端创建一个显示层,并获取控件界面,即ISurface界面。其次,在Surfaceflinger之间打开Session和ISurface界面。再次,利用ISurface控制图层属性,如Alpha,Z-order,然后关闭会话。第四,清除以前的显示缓存区,然后将当前缓存区发送到ISurface中的缓冲堆。最后,销毁显示缓冲区,并取消注册的ISurface界面。
(2)Audioflinger。Audioflinger是Android音频系统的重要组成部分。它为Native C使用者和Java使用者提供编程接口。为将解码后的原始数据发送到Audioflinger进行播放,Native C使用者需要执行以下操作:
首先,通过Audioflinger客户端创建一个AudioTrack,并获取控件界面,即ISurface界面。其次,打开Audioflinger之间的会话和ISurface界面。第三,利用ISurface来控制属性图层,如FrameCount,音频格式,然后关闭会话。第四,清除以前的音频缓冲区,然后将当前缓冲区发送到ISurface中的缓冲堆。最后,销毁显示缓冲区,并取消注册的ISurface接口。
(3)媒体播放器。在构建了所有必需的Gstreamer插件之后,我们需要借助Gstreamer来构建从Android继承的媒体播放器MediaPlayer的接口,以为Java框架提供媒体处理服务。在这些步骤中,我们可以使用Gstreamer中的一些低级别元素来构建媒体播放器,但是这种方法非常复杂。例如,关于特定的视频剪辑,我们需要分析它属于哪个视频容器格式。然后根据不同的格式,准备不同的解复用与解码元素,并连接传输管道中的所有基本元素,让整个视频处理步骤在其中运行。由于不同的视频剪辑对应不同的处理元素,为了保证实用性和稳定性,我们使用Gstreamer存在的高级别元素“Playbin2”来启动传输管道。然后,添加一条总线到Playbin2,让视频数据和视频处理事件流入总线。最后,启动传输管道和总线。在实施过程中,我们使用gst-ffmpeg和gstopenmax插件来解码视频/音频数据。运行框架时,Gstreamer将原始视频数据(RGB 555)发送到Surfaceflinger和Audioflinger。至于媒体记录服务,媒体元信息服务和H.264编码视频播放服务,我们仍然使用OpenCore,因为OpenCore可以提供全部基本功能,无需扩展。
(4)优化方法。由于Gstreamer主要用于Linux的PC上,为了在多样化的嵌入式环境中使用,我们需要做一些优化。
因为Gstreamer是一个基于插件的多媒体引擎,整个系统需要加载许多不同功能的动态库来协调完成整个视频处理步骤。大量的动态库地加载和卸载会消耗很多内存,因此会严重减少执行效率。为了解决这个问题,我们使用了Prelink技术给每个动态库固定一个内存加载地址,以减少执行消费。由于不同种类的多媒体终端设备有不同的CPU架构,我们必须做出相应的扩展方案,以保证在ARM,X86,MIPS和ARM等通用CPU架构中,SH4能够运行良好。在这里,我们根据不同的CPU架构,修改Liboil和Gstreamer引擎中的汇编语言。在处理更多的视频/音频容器时,我们添加了许多相关的Gstreamer插件,例如TS Demux插件。此外,我们在嵌入式环境运行时,修复了这些插件中的错误,以获得高度的兼容性。最后,我们Android中添加OpenMax IL标准。
4 实验结果和分析
4.1 实验设置
在我们的实验中,需要考虑几种不同类型的视频容器格式。对于每种视频容器格式,我们都会采用不同的视频剪辑速率,以及解码标准和定义。虽然我们的Android操作系统和Gstreamer已经被移植到X86,MIPS,ARM和SH4,在这个实验中部分,我们以S3C6410 ARM处理器为例。开发板是Real6410,具体参数为:ARM11三星S2C6410 667MHz主频,256MB移动DDR RAM,频率266MHz,1GB NAND闪存,Linux 2.6.28。在实验过程中,我们将的Gstreamer模块添加到Android,再将修改后的Android文件系统安装到开发中,然后安装Google发布的原始Java多媒体应用程序(无任何扩展名),以测试我们的工作。
4.2 实验结果
我们将四种常见视频容器格式的运行结果(即,AVI,RMVB,TS和FLV)与基于Gstreamer的多媒体框架的处理结果进行比较,其详细的性能评估见表1。
在表1的列中,1代表OpenCore方法的1个标准,2代表参考文献[1]中扩展的OpenCore,3代表Java+FFMpeg +NDK参考文献[2]和[3]中的方法,4涉及我们新的基于Gstreamer的扩展方法。
针对MP4和3GP格式的数据,OpenCore比Gstreamer处理的更高效。至于TS,MPEG等其他视频格式,Open Core无法处理它们,Gstreamer和参考文献[2]中提出的方法(Java+ NDK+FFMpeg)几乎具有相同的效率。此外,从表1我们可以发现,使用Gstreamer作为多媒体引擎对不同的视频格式具有很高的兼容性。
除此之外,我们的方法更可行。例如,如果需要一个新功能,我们只需要添加一些现有的插件。我们不需要更改Java API,而且所有Java应用程序都可以从我们的扩展中受益。此外,我们的新型多媒体框架可以在不同的CPU架构上良好地运行,并具有适当的执行效率,因此我们的扩展可以应用于不同的多媒体终端设备。而且,借助OpenMax IL Standard,我们的方法可以支持硬件视频的加速处理。所有的这些都表明,我们的方法可以显著扩展Android的多媒体处理能力,包括效率,兼容性,可行性和通用性。
5 结 论
本文针对如何提高Android的视频(音频)处理能力,对其核心媒体引擎OpenCore的扩展机制进行了讨论和分析,优化了常用的基于Gstreamer的Android多媒体框架,提出另一种具有更好工作效率,更高兼容性,可行性和通用性的Android多媒体框架。在位的研究与工作中,我们计划考虑一些其他因素,例如使用硬件覆盖系统,以加速视频显示输出。
参考文献:
[1] M Song,J Sun,X Fu,et al. Design and Implementation of Media Player Based on Android [J].International Conference on Wireless Communications,Networking and Mobile Computing,2010:1-4.
[2] M Song,J Sun,X Fu. Research on Architecture of Multimedia and Its Design Based on Android [J].International Conference on Internet Technology and Applications,2010:1-4.
[3] X Fu,X Wu,M Song,et al. Research on audio/video codec based on Android [J].International Conference on Wireless Communications,Networking and Mobile Computing,2010,54(1):1-4.
[4] Gaignard,B.GStreamer as multimedia framework in Android:a new alternative [J].CELF Embedded Linux Conference Europe(CELF ELF Europe),2010.
作者简介:涂晶晶(1983-),男,汉族,湖北人,技术总监,本科。研究方向:电子信息技术、图像处理技术。