基于Android的流媒体播放器的研究与设计

2014-11-20 08:18郑建宏杨小明
电视技术 2014年5期
关键词:占用率播放器数据流

魏 涛,彭 涛,郑建宏,杨小明

(重庆邮电大学移动通信技术重庆市重点实验室,重庆400065)

近年来,随着移动通信技术的不断发展和移动终端性能的大幅提升,人们已不再满足于单纯的文本、图像和声音文件。多媒体信息因其直观、信息量大而得到广泛应用。因此,移动流媒体成为无线网络技术和多媒体技术的新的发展方向,手机终端上的流媒体应用也日益受到人们的青睐。本文主要基于现有Android手机系统框架提出了一种流媒体播放器设计方案,包括播放器总体分层结构设计、数据处理流程、控制流程、状态机设计和多线程模式设计。

1 流媒体播放器设计

1.1 总体分层设计

播放器在播放本地媒体文件或者网络媒体文件时,都有3个基本阶段:获取媒体数据、音视频数据流的解码和媒体数据显示[1]。根据这3个阶段,基于分层的思想,设计播放器总体结构:从下至上依次为数据获取层、数据预处理层、音视频解码层和用户界面层。分层结构设计使各模块独立完成任务,降低了模块之间的耦合性,各模块可独立进行设计和优化,增强了整体可控性。流媒体播放器系统分层结构如图1所示。

图1 流媒体播放器系统结构

数据获取层主要获取本地媒体文件、通过网络获取流媒体数据和处理摄像头控制信息。本地文件获取通过手机本地存储,流媒体文件则需要播放器的网络模块与无线通信网的交互来获取。网络流媒体文件获取包括会话协商、数据接收和数据缓存等过程。媒体文件信息协商过程需要使用RTSP协议来完成,主要协商媒体流常规信息。

数据预处理层主要对本地文件和网络媒体文件进行解封装,使上层解码模块数据一致。对于本地文件,该层完成按照其媒体的格式解封装,并将解封装后的数据放入上层解码缓冲区。对于网络媒体文件,需要去除RTP包头信息,并将媒体文件数据进行组帧,然后将数据帧传递到上层解码缓冲区等待解码。摄像头的控制信息封装也在该层完成。

音视频解码层的功能是解码组件选择、解码器选择和多路媒体流同步处理。音视频解码层通过本地文件或者网络媒体文件的文件头中所带的格式信息,选择对应的解码器对媒体流进行解码[2]。该层由FFmpeg的libavcodec 完成解码功能[3]。

用户界面主要用于提供用户对播放的控制,用户控制信息通过界面与播放器之间的交互接口下发后进行控制。本设计采用Android自带的界面风格,主要完成功能按钮的实现[4]。

1.2 数据处理流程

数据流处理主要在Android系统驱动层进行,底层对数据流进行下载、memorycopy、解码和回放处理。

如图2所示,在流媒体播放的数据流程中:1)通过无线信道接收数据;2)将经过DSP处理后的数据送给ARM,DSP中的DSP_DMA用于高效的数据搬移;3)数据搬移操作,一般可通过memorycopy或者AXIDMA高速数据搬移来完成;4)媒体数据在ARM中的处理分为两种,媒体数据软解码是媒体数据在ARM中通过软件算法完成解码,解码后的数据在DDR中就能送给音视频输出模块;媒体数据硬解码是在ARM中仅对数据进行简单处理后送到DDR的环形缓冲区,DSP音视频解码模块将对该环形缓冲区中的数据进行解码;5)将DSP解码后的数据写回DDR相应的缓存中,为音视频输出提供数据;6)音频输出通路,解码生成的PCM数据被传递到IIS设备输出音频;7)将解码完成的数据取出,传递到Image DMA设备进行高速数据搬移,然后传递到格式转换器进行格式转换;8)视频输出通路,经格式转换的数据通过LCD设备输出。其中1)、2)、3)中数据流是双向的,因为除了下行的数据流外,还有一部分RTSP协议数据上传到网络服务器。此外,缓冲区的设计采用动态可配置大小的策略,可根据具体解码时的数据流大小来协调整个系统的资源,既高效又避免系统资源的浪费。

图2 流媒体播放数据处理流程

1.3 控制流程

控制流程主要是调用底层DSP提供的接口函数来完成。如图3所示,当用户触发一个播放流程时,播放器就开始对本地文件或者网络获取的数据流进行解析,将文件的类型和大小传递给ARM多媒体驱动层,传递的参数中还包括LCD显示参数和音量信息。ARM端接收到播放事件后,调用dsp_devinit(),播放器进入idle状态,player_create()的作用是创建一个播放器实例,player_init()将LCD参数和音量传递给DSP,函数player_play(PLAYER_HANDLE id,startpts,0)执行后表明DSP已进入播放阶段,该函数中第2个参数指定播放的起始位置(时间),第3个参数表明从文件的开头来解析文件。控制流程中,上层下发的暂停、恢复、快进/快退、指定点跳转、停止播放和删除播放实例分别调用底层的 player_pause(),player_resume(),player_scan(),player_goto(),player_stop(),player_delete()。

图3 流媒体播放控制流程

此外,网络媒体文件的播放在控制流程中还有不同之处。用户执行播放命令后,ARM首先与网络建立连接,然后向流媒体服务器请求数据。播放器通过RTP服务器将媒体数据流缓冲到DDR中,之后根据缓冲区信息直接读取数据流。为取得良好的控制,网络数据流下载控制需与播放器的暂停、恢复和停止等动作对应。

1.4 状态转移机制设计

状态转移如图4所示,当用户通过客户端软件向流媒体服务器发出请求并成功建立连接后,客户端便通过网络向流媒体服务器获取数据流,当数据达到一定量后,客户端开始播放。此过程中,播放器通过维护一个工作状态机来完成在用户下发命令后的状态跳转。

图4 流媒体播放器状态图

1.5 多线程模式设计

本播放器采用多线程的实现模式:开始播放时,系统同时创建并运行控制线程、视频解码回放线程、音频解码回放线程和网络线程。控制信息和数据流在各个线程运行过程中的传递如图5所示。

图5 多线程实现模式

控制线程:控制音视频解码回放,主要负责接收用户发出的命令信息,发送控制信息给回放线程、网络线程,并响应用户发出的控制命令。视频解码回放线程:一方面从数据缓冲队列中取出视频数据,送入解码模块进行解码;另一方面在音视频同步处理的控制下,将解码生成的数据发送到终端的LCD。音频解码回放线程:在系统控制下,每播放完一段音频数据便启动该线程。该线程从数据缓冲队列中获取音频数据,经过音频解码器解码后,将PCM数据流放入特定的缓存区等待播放。网络线程:负责与服务器建立连接、接收媒体数据流以及向服务器发送反馈信息,线程的创建和启动包含连接过程中的监听子线程。

2 性能测试与结果分析

2.1 测试环境搭建

流媒体播放器的性能指标主要有解码、CPU负载和内存消耗。播放器CPU负载和内存消耗既影响整个系统资源的性能,又直接反映在用户体验上。本播放器的性能通过完成一帧数据所消耗的时间和CPU占用率来体现。

在嵌入式系统中,配置ARM核主频为600 MHz以内、RAM为256 Mbyte的应用平台,构建流媒体播放器并进行性能测试。将编译生成的镜像文件烧写到开发板Flash中,启动开发板,在PC端安装adb驱动并使用Android自带的adb连接到PC端。测试数据主要通过Android系统自带的top等工具和跟踪信息打印来获取。

2.2 测试及结果分析

在EDGE/TD-SCDMA网络环境下,以点播一个网络视频(HVGA)为例进行测试。网络视频总长度为90 s,根据流媒体播放过程将分成6个阶段进行测试分析:1)0~20 s,系统主要进行网络数据缓冲,点播开始4 s后播放视频。该过程中I/O操作频繁,消耗内存大,CPU负载较高,CPU占用率为27% ~29%;2)21~40 s,正常播放阶段,播放器下载数据进行缓冲,同时进行解码播放,I/O操作多且CPU计算量大,CPU占用率保持在30%以内,波动较小,如图6所示;3)41~49 s,用户下发暂停播放命令,播放器停止解码播放进程,数据缓存继续进行,CPU占用率在10%以内,如图7所示;4)50~59 s,用户下发命令恢复播放,进入正常播放阶段,由于前面的数据缓冲,I/O操作相对减少,CPU占用率在27%以内;5)60~79 s,用户快进/快退,数据缓冲量大,I/O操作相对增加,内存消耗变大,CPU占用率在25% ~29%之间;6)80~90 s,恢复正常播放,直至播放结束。网络下载停止,内存释放,I/O操作急剧减少,CPU占用率在3%以内。

图6 稳定播放时系统资源消耗情况

图7 播放暂停时系统资源消耗情况(截图)

经多次测试表明,流媒体播放时,从打开到正常播放保持在10 s以内,网络状况不佳的情况下,播放缓冲延时控制在5 s以内;流媒体播放的媒体文件清晰度达到HVGA;播放过程中,CPU占用率控制在30%以内,暂停或者停止播放时,CPU占用率大幅下降。

3 结束语

本文对流媒体播放器的分层结构和重要处理流程进行了设计,实现了关键技术与核心功能模块。重点在Android平台上设计了播放器总体分层结构、各层模块和数据处理流程、控制流程,对播放器的状态机模型和线程实现模式进行了设计,主要设计了播放器的状态转移模型,并对运行过程中各个线程的功能和多线程的实现模型进行了描述。

本文设计的流媒体播放器已经在基于Linux 2.6.32内核的Android 4.1定制版本上实现,被应用于国家重大专项“TD-SCDMA增强型多媒体手机终端的研发和产业化”中,同时使Android手机终端具备了强大的软件解码和流媒体应用功能。

[1]王震,林小川,周运练,等.基于QT4&Linux多媒体播放器系统的设计与实现[J].贵州大学学报:自然科学版,2009(1):60-64.

[2] MICHAEL H,ANTHONY J,FAOUZIK,et al.H.264/AVC baseline profile decoder complexity analysis[J].IEEE Trans.Circuits and Systems for Video Technology,2003,13(7):704-716.

[3]余志龙,王世江.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2009.

[4]张正政,林耀荣.基于Android系统的影音播放器开发[J].现代电子技术,2011,34(2):5-8.

猜你喜欢
占用率播放器数据流
汽车维修数据流基础(上)
汽车维修数据流基础(下)
Walkman诞生40周年 索尼适时发布NW-ZX500和NW-A100系列播放器
降低CE设备子接口占用率的研究与应用
基于STM32的MP3播放器设计
Moon ACE播放器/放大器一体机
解析交换机CPU占用率
基于数据流聚类的多目标跟踪算法
基于排队论的区域路内停车最优泊位占用率研究
播放器背板注塑模具设计