基于Android 2.3的多媒体播放器软件解决方案

0 引言
android本义为“机器人”,是目前最流行的移动终端开发平台,依靠google的强大开发和媒体资源,android成为众多移动终端厂商竞相追逐的对象。当今全球信息时代,移动终端不再局限于通信业务,多媒体业务的应用才是终端厂商的发展方向。音视频播放作为一项不可或缺的多媒体业务,对于具有丰富的可编程扩展性的android操作系统,可以开发出个性化的音视频播放应用软件。
1 android平台
1.1 android系统架构
android是google于2007年11月5日宣布的基于linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成。从软件分层的角度来看,android平台自上而下由应用程序、应用程序框架、android运行时、库及linux内核共5部分构成。
1.2 android应用程序组件
android系统的基本组件包括activity(活动)、service(服务)、broadcastreceiver(广播接收者)和contentprovider(内容提供者)等,此外还包括专门负责在基本组件之间传递消息的intent(意向)组件。
2 软件解决方案
2.1 概述
基于android平台的多媒体播放器软件主要由3个模块组成:启动画面模块、音频播放模块、视频播放模块。该播放器具有播放列表预览、前进、后退、暂停、继续、进度拖曳和停止等功能。
2.2 用户界面设计
在android应用中,ui(用户界面)是人与手机之间传递、交换信息的媒介和对话接口,是android系统的重要组成部分。本文设计的多媒体播放器界面主要由主界面、音/视频资源列表界面、音/视频播放列表界面、音/视频播放界面等组成。本文重点介绍前2种界面设计。
2.2.1 主界面设计
主界面采用标签布局,使用tabhost(标签页视图)并定义2个标签,分别是音频播放列表标签页和视频播放列表标签页。
tabhost(标签页视图)必须配合tabactivity(标签activity组件)使用。该播放器主界面的mainactivity继承自tabactivity,初始化2个标签页,并为每个标签分配不同的用户activity(活动),musicactivitv(音频播放)和vedioactivity(视频播放),通过调用指定的intent来打开合适的activity(活动)。
2.2.2 资源列表界面设计
资源列表界面采用listview(列表视图)作为核心视图。以视频资源列表为例,sd卡中的视频资源列表如图1所示。
该列表的activity组件(videolibrary)继承自listactivity。通过android平台为基础数据类型(视频信息)装载contentprovider(内容提供器),来获取位于sd卡设备目录/data/data/com.android.providers.media/databases里的视频数据库信息,并使用simple curosr adapter适配器作为列表适配器将视频资源信息填充到列表视图中。
2.3 数据存储
android平台主要提供了4种数据存储机制:preferences(参数选项),databases(数据库),files(文件)和network(网络)。
preferences(参数选项)是一种轻量级的、用于存储或获取数据类型的“键-值”项的机制。它通常用来存放应用程序的配置信息。本文设计的多媒体播放器采用preferen ces机制来存储或获取音/视频历史播放信息等配置信息。
2.3.1 获取数据
若要获取preferences文件的数据,例如继续播放动作需要读取播放历史信息。首先通过调用context.getsharedpreferences(string name,int mode)方法传入preferences文件名和打开模式来获得一个shared preferences对象sp,若该preferences文件不存在,在提交数据后会创建该preferences文件。利用该sp对象调用getter方法,传入相应的键来读取数据。
在android平台中,所有音/视频文件的相关信息都是以content的形式提供给开发者的,所以历史播放信息是content://样式的uri,也就是前面提到的nowplaying。
2.3.2 存储数据
若要修改preferences文件的数据,例如暂停当前播放,或停止播放并退出该播放器软件会引起播放历史信息的变更。而产生该动作的原理是,每当播放新的音/视频文件首先将其uri赋值到全局变量nowplaying,然后在退出该播放软件时处理变更工作:利用shared prefer ences对象sp调用edit()方法获得一个内部类editor对象editor,利用该editor对象对preferences文件进行编辑,即读取nowplaying的数据,随后必须调用commit()方法才可以完成修改该preferences文件里键为uri_key的对应数值。
2.4 多媒体应用
2.4.1 多媒体宏观结构
android的多媒体部分框架涉及应用程序、java框架层、c语言框架、硬件抽象层等环节。其中android java框架层提供标准多媒体api供上层相关应用程序调用。而媒体的播放过程实际上是由下层的opencore和stagefright等实现的。android多媒体宏观结构如图2所示。
2.4.2 多媒体处理过程
典型数据流在多媒体播放器中的运行过程主要经过以下环节:最上层的java应用程序将媒体uri(媒体文件或者流媒体)作为输入设置到媒体播放器中(主要是通过android平台提供的标准接口api,如mediaplayer(媒体播放器接口)等),经过java框架层,jni和本地框架层,一直设置到pvplayer(opencore)。该过程中只是传递媒体uri路径,并无数据流传递。由pvplayer进行解析后,将媒体分成音频流(mp3,amr,aac等)和视频流(h263,h264,mpeg4等),经过编解码器的处理和同步(avsync)处理后转换成原始数据(音频通常是pcm,视频通常是yuv或rgb格式)。随后音视频原始数据将被送入音频和视频的输出环节(扬声器或者显示屏等硬件)。
2.4.3 多媒体播放接口
android平台提供android.media包来管理各种音频和视频的媒体接口,该包中的mediaplayer(媒体播放器接口)用于控制音频或视频文件和流的回放。另外在android.widget包中还提供video view(视频视图)组件用于播放视频文件,以简化相对于使用media player播放视频的繁琐控制过程。
(1)mediaplayer
对播放音频而言,通过mediaplayer.crea te(context context,uri uri)方法来获取播放器实例,无需播放准备,直接通过mediaplay er.start()方法来启动播放动作。其中nowplaying就是用户当前选中的待播放文件。
//开始播放
mediaplayer mplayer=mediaplayer.create(context,nowplaying);
mplayer.start();
通过播放器实例mp调用mediaplayer.pause()方法可以暂停当前播放行为,可以使用start()方法恢复播放。
首先调用mediaplayer.stop()停止当前播放行为,再调用释放与播放器相关资源的方法mediaplayer.release()来完成停止播放动作。
对于播放视频来说,通过mediaplayer(媒体播放器接口)的“setdatasource”方法可以指定视频文件路径。与播放音频数据不同的是,视频播放还要设置显示视频内容的承载体,使用mediaplayer的“setdisplay”方法为当前播放器实例设置一个用于显示视频内容、代表屏幕描绘的控制器。这样用于播放视频的播放承载体必须实现surface holder(表面视图处理接口)的视图组件。
(2)video view
首先视频播放布局资源中必须定义2个组件:“”标记定义视频视图组件,“”标记定义视频播放控制器组件。在acitity组件对布局资源填充完成后,获取布局资源中定义的视频视图和播放控制器组件实例(mvideo和mcontroller),视频视图实例mvideo指定要播放的视频文件路径或uri,用于承载待显示视频内容,并为mvideo设置播放控制器用于控制该视频文件的播放行为(如暂停、前进、后退和进度拖曳等),再调用videoview.start()方法启动播放行为。停止播放行为可以调用videoview.stopplayback()来停止回放行为。
3 测试
本文设计的多媒体播放器是在android sdk 2.3平台下开发完成的。该播放器以应用程序apk的形式分别集成到在android 2.3模拟器和htc a3380手机上,通过测试能够实现音/视频文件的本地播放功能,例如暂停、继续、停止、进度拖曳等。以音频播放为例,测试效果如图3所示。
4 结语
本文重点介绍基于android平台的多媒体播放器解决方案。侧重分析ui(用户界面)设计、音/视频数据信息读写,及音/视频播放等过程;并在android sdk2.3平台上进行功能性测试,测试结果满足预期,能够正常播放本地多媒体文件。随着用户对移动终端的媒体播放功能的需求日益增加,提供支持更高分辨率的视频播放,以及和网络结合的流媒体方面的功能将是下一步的研究重点。
stm32/stm8
意法半导体/st/stm

天津大学微波太赫兹波微电子系统实验室启用仪式暨太赫兹测量与应用论坛成功举行
怎样利用Python去快速创建矩阵?
Flask两种配置路由的方式说明
浅谈汽车连接器的分类和选择方法
“遥感十四号”卫星成功发射
基于Android 2.3的多媒体播放器软件解决方案
智慧高速的技术架构总体的三个层级
单片机测控系统的接地作用及方式
手柄沟槽信号蝶阀
基于人工智能的AlphaFold蛋白质破解
变压器中性点的接地方式有几种?各有何特点?
什么是10 GbE?10 GbE有多快?
DS2151 ANSI T1.231-1993的实施
AI落地制造业有哪些优点和缺点详细说明
事故频发的自动驾驶真的安全吗?
纸张表面瑕疵在线检测设备的原理及功能
自制收音机教程
AI也性别歧视?算法的歧视,AI不背锅!
AquiSense宣布新UV-C LED水处理系统通过美国国家卫生基金会认证
vr眼镜是干什么_vr眼镜伤眼睛么