《基于Android平台的音视频流媒体播放器》_第1页
《基于Android平台的音视频流媒体播放器》_第2页
《基于Android平台的音视频流媒体播放器》_第3页
《基于Android平台的音视频流媒体播放器》_第4页
《基于Android平台的音视频流媒体播放器》_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-5"\h\z绪论2提出问题2研究现状2研究思路与方法4Android操作系统整体结构分析6Android系统简介6Android整体结构7Android架构7特征9Android应用组件9活动(Activity)10服务(Services)11广播接收者(Broadcastreceivers)12内容提供者(Contentproviders)12AndroidNDK工具13FFmpeg流媒体平台介绍与研究14FFmpeg简介14FFmpeg的编译与运行14流媒体播放器应用分析16系统功能需求分析16系统整体结构需求分析17系统业务流程分析18媒体播放模块业务流程18媒体文件管理模块业务流程19系统设置模块业务流程21流媒体播放器应用设计22系统设计模型22系统UI设计23媒体播放模块设计23媒体文件管理模块设计25系统设置模块设计29系统数据库设计31SQLite简介31播放器库表说明31Android平台的流媒体播放器应用实现33Android应用程序开发33Android开发环境33Android应用开发特点34FFmpeg移植36FFmpeg音视频解码39流媒体播放功能的开发与实现41总结46致谢错误!未定义书签。参考文献47#图5-5音频播放设计图5.2.2.媒体文件管理模块设计媒体文件展示在媒体文件管理模块界面UI设计中主要分三个布局块。如图5-7所示,顶部布局块,UI元素包括应用logo、应用标题/歌曲标题、刷新按钮、系统设置按钮;选项卡布局快,UI元素包括历史记录选项卡、视频列表选项卡、音乐列表选项卡;内容显示布局块中分三个主要内容:视频文件、音频文件和历史播放记录。点击选项卡可切换到相应内容的子界面,其中视频文件内容子界面与音频内容子界面顶部有一栏操作布局,视频子界面的操作栏中只有包括一个删除按钮,音频子界面的操作栏中包括左侧的音频播放/暂停按钮和右侧的删除按钮。控制音频播放/暂停按钮只有在音频正在播放时才显示。<7參沏T@13G?1G驚R13:39仔畳&■|i3GvlG秽k佃:04yintian_473834_mDQPlayer播放器正在播放:wc_Boy0:历史视频音乐历史视频音乐历史视频音乐<7參沏T@13G?1G驚R13:39仔畳&■|i3GvlG秽k佃:04yintian_473834_mDQPlayer播放器正在播放:wc_Boy0:历史视频音乐历史视频音乐历史视频音乐rnfwq_RuGuoA3.mp300:05:01M范玮琪討fwq_QiCheng3.mp300:04:3811范玮琪片名:第一季DVD追加时间:00:10:27片名:[USAVICH.监狱...时间:00:01:32片名:[USAVICH.监狱…时间:00:01:30厂翼私片名:【USAVICH.监狱…L如鼻)时间:00:0130片名:[USAVICH.监狱兔]….时间:00:01:30片名:[USAVICH.监狱兔].时间:00:01:30片名:r(JSAVICH阵漱诽1X删除片名:[USAVICH>狱兔].时间:00:01:30toutoudeai_1030291...未知00:03:42wc_Boys.mp3未知00:04:19whenyoubelieve.m...CelticWoman00:04:31yintian_473834_m.m...未知00:04:01yinweixian_390726_...未知00:04:18youexistin_1319052未知00:03:29"暂停播放芙删除*71jjiipiint1nA图5-7媒体文件管理模块设计图2.媒体文件操作长按视频或音频列表项可弹出文件操作对话框,如5-8所示,对话框中有三个操作选项,以列表方式布局,分别是“重命名”、“删除”、“基本信息”选项,以列表方式布局,分别是“重命名”、“删除”、“基本信息”Q着挣罕働3GWG^llE21:26DQPlayer播放器历史视频音乐DQPlayer播放器历史视频音乐片名:[USAVICH>狱兔],…片名:[USAVICH>狱兔],…片名:[USAVICH,监狱兔F:1文件操作重命名删除基本信息LJ时间:00:01:30时间:00:01:30图5-8媒体文件操作设计图点击“重命名”操作选项后弹出重命名对话框,如图5-9所示,对话框中的UI元素有:标题、文件名称编辑框、格式标题、确认按钮和取消按钮。编辑框中默认显示了当前文件名称,用户在编辑框中修改了文件名后点击“确认”按钮将成功修改文件名,点击“取消”按钮则取消操作。

历史视频音乐X删除重命名文件名:[USAVICH.监狱兔].|.mp4确定取消T-r-glDQPlayer播放器片名:[USAVICH.监狱兔]….片名:[USAVICH.DQPlayer播放器片名:[USAVICH.监狱兔]….片名:[USAVICH.监獄兔].图5-9媒体文件重命名设计图点击“删除”操作选项弹出确认删除对话框,如图5-10所示,对话框中的UI元素

有:确认删除提示标题、确认删除文件复选框、确认按钮和取消按钮。对话框中可勾选

“同时删除媒体文件”复选框,勾选后可在删除列表项的同时删除媒体文件,否则只删除列表项中数据。点击“确认”按钮执行删除操作,点击“取消”按钮则取消删除操作。存曇為号戲3G刃G帝R22:mDQPlayer播放器DQPlayer播放器历史视频音乐荚删除时间:00:01:30时间:00:0130片名:[USAVICH,荚删除时间:00:01:30时间:00:0130片名:[USAVICH,监狱兔…片名:[U5AVICH.监獄兔]…图5-10媒体文件单个删除设计图点击“基本信息”操作选项弹出媒体文件基本信息展示对话框,如图5-11所示,对话框中显示了媒体文件的基本信息,信息以列表方式显示,如“名称”、“格式”等。点击“确认”按钮将关闭对话框。

图5-11媒体文件基本信息显示设计图点击音视频内容子界面中右上方的“删除”按钮,显示出如图5-12所示的批量删除操作界面。标题栏中则显示出几个操作UI元素:全选复选框、取消操作按钮、确认操作按钮。每个列表项左侧都会显示一个复选框进行删除项选择,若需要删除所有媒体文件可点击左上角“全选”复选框,将选中所有文件。点击操作栏右上角“确认”删除按钮将弹出确认删除对话框,之后的操作与单个文件删除操作相同。点击操作栏右上方“取消”按钮则取消批量删除操作。图5-12媒体文件批量删除设计图

5.2.3.系统设置模块设计点击主界面右上方H“更多”按钮将弹出系统设置对话框,如图5-13所示。系统设置模块以对话框来体现,对话框中分别有“版本更新”、“睡眠设置”、“网络设置”、“关于软件”四个功能选项。©鼻旣3GY'G誓R23:01DQPlayer播放器DQPlayer播放器历史视频版本更新睡眠设置聲購近厂网络设置关于软件■历史视频版本更新睡眠设置聲購近厂网络设置关于软件■片名:[USAVICH.监獄兔]时间:00:01:30片名:[USAVICH.监狱兔]时间:00:01:30片名:[USAVICH.监獄兔]时间:00:01:30片名:[USAVICH.监獄兔I…片名:[USAVICH.监狱兔]….时间:00:01:30图5-13系统设置设计图点击对话框中“版本更新”选项,当有最新更新时将在系统通知栏中显示一个下载列表项,如图5-14所示。列表项中主要体现几个UI元素:applogo、应用名称、进度

表、已进度百分比。下载完毕后将自动安装版本安装包。若无最新版本则在界面中显示一个提示信息框,如图5-15所示。片曇片V&3GV,G看E23:22DQPlayer播放器历史视频音乐荚删除片名:片曇片V&3GV,G看E23:22DQPlayer播放器历史视频音乐荚删除片名:[USAVICH.监狱兔]….时间:00:0130片名:[USAVICH.监狱兔]….时间:00:01:30片名:[USAVICH.监狱兔]….片名:[USAVICH.监狱兔]….时间:00:01:30时间:00:0130片名:[USAVICH,监狱兔]….片名:[USAVICH.监狱兔]….图5-14最新版本下载设计图图5-14最新版本下载设计图图5-15最新版本提示设计图点击对话框中“睡眠时间设置”选项将弹出设置对话框,对话框中主要体现的UI元素:标题、时间设置滚动视图、确定设置按钮,如图5-16所示。时间以小时为单位,选择了时间后点击“设置”按钮就成功设置了睡眠时间。图5-16睡眠时间设置设计图点击对话框中“网络设置”选项将弹出跳转至系统网络设置界面,如图5-17所示,用户自行设置或切换2G/3G或WIFI网络环境。图5-17系统网络设置界面图点击对话框中“关于软件”选项将弹出软件信息对话框,如图5-18所示。对话框中体现的UI元素:标题、applogo、版本信息(包括名称、版本号、作者)确定按钮。版本信息以列表方式布局排列。点击“确定”按钮则关闭对话框。图5-18关于软件设计图5.3.系统数据库设计SQLite简介SQLite,是一款轻型的数据库,是遵守ACID的嵌入式的关系型数据库管理系统,许多嵌入式系统产品都使用SQLite,资源占用率十分低,这也是SQLite一个重要特点,实际设备中,几百KB的内存就足够SQLite的存储了。SQLite的首个版本诞生于2000年的5月,至今发展了12年之久,也迎来SQLite3.0版本的发布。它能够在主流操作系统上支持,如Windows、Unix与Linux操作系统,同时也能兼容多种编程语言,还有ODBC接口,比起PostgreSQL、Mysql这两款世界著名的开源数据库管理系统上来说,SQLite的处理效率比两者都快[16]播放器库表说明播放器唯一使用数据库的功能模块为历史播放记录功能,改功能是将用户播放过的媒体文件记录下来,以便日后方便的查阅先前播放过的媒体文件,是的应用更加人性化。在设计过程中,将流媒体播放器应用的数据库名称命名为“DQPLAY_DB”,数据库已文件形式存数在手机系统内存中,系统会自动分配相应的目录给予数据库文件存数。下面介绍下媒体基本信息表和媒体播放历史记录表的数据结构及数据说明。

表5-1媒体基本信息表ID字段类型Null默认额外注释1IdintegerunsignedPKauto_increment流水id2mediaidvarchar(20)NO媒体文件在系统中存储的id3mediatitlevarchar(50)NO媒体文件标题4pathvarchar(80)NO文件路径5artistvarchar(30)NO作者6durationlongNO媒体播放时长7albumvarchar(30)NO专辑名8displaynamevarchar(50)NO媒体文件全名9filesizelongNO媒体文件大小10mimetypeVarchar(lO)NO媒体格式表5-2媒体播放历史记录表ID字段类型Null默认额外注释1IdintegerunsignedPKauto_increment流水id媒体文件在系统中存储的2mediaidvarchar(20)NOid根据此id可查询出媒体文件的详细信息3mediatypeintegerNO媒体文件类型4createtimedatetimeNO记录创建时间6.Android平台的流媒体播放器应用实现Android应用程序开发Android应用程序开发是Android开发中最上面的一个层次,它们构建在Android系统提供的API之上。Android应用程序的基础是Android提供的各个Java类,这些类组成了Android系统级的API。Android应用程序可以基于两种环境来开发:AndroidSDK和Android源代码。Android系统本身内置了一部分标准应用(也包括内容提供者),在仿真器(包括SDK环境和源代码环境)中已经包含这些内置的程序。用户自行开发的应用程序和Android内置的应用层程序包位于同一个层次,都是基于Android框架层的API来构建的,它们的区别仅仅在于他们是否被包含在默认的Android系统中[17]Android开发环境1•系统和软件需求使用Androidsdk来开发Android应用程序,就需要适合的操作系统和开发环境:(1)操作系统WindowsXP或Vista・MacOSX10.4.8或者更高版本(仅支持x86)Linux(LinuxUbuntuDapperDrake版本已测试)(2)开发环境EclipseIDEEclipse3.3(Europa),3.4(Ganymede)-EclipseJDT插件(大多数的EclipseIDE包包含)■WST(可选,包含在mostEclipseIDEpackages中)JDK5或JDK6(只有JRE是不够的)AndroidDevelopmentTools插件(可选)♦不兼容GNUJava编译器(gcj)•其他IDEJDK5或JDK6(仅有JRE不够)ApacheAnt1.6.5或者更高层版本(Mac和Linux环境下),1.7或更高层版本(Windows环境下)不兼容GNUJava编译器(gcj)若电脑上已装有jdk的情况下,确定版本是在5.0以上。有些linux版本可能包含有jdk1.4或者java的gnu编译器,在Android开发中不支持它们。Android应用开发特点系统开放性2007年11月5日,在Google的领导下,成立开放手持设备联盟(OpenHandsetAlliance),最早的一批成员包括Broadcom公司、HTC、Intel、LG、Marvell等公司。开放手持设备联盟的创建目的是为了创建一个更加开放自由的移动电话环境。2008年12月9日,新一批成员加入开放手持设备联盟,包括ARM、华为、索尼等公司[18。正是由于Android操作系统是完全开源免费的,可以让任何手机厂商在不经Google公司的授权任意来使用和修改Android操作系统,而且还拥有全球各地开发者组成的开源社区来专门负责开发Android应用程序和第三方Android操作系统来延长和扩展Android的功能和性能。除了google的logo与应用程序不可随意使用,使用Google的应用需要Google公司证明其生产的产品设备符合Google兼容性定义文件,主要才能在手机上预装GooglePlay、Gmail等。Activity栈式管理(1)Activity栈Android的界面活动(Activity)主要是使用Activity栈来进行管理的。当一个Activity被创建时,系统根据调用的方式,将这个Activity存入一个内存栈中。当使用者按下手机的Back键或程序调用finish。方法时,这个Activity会退出内存栈并被销毁;当有新的Activity入栈或返回至桌面程序时,在它之前的所有Activity并未被销毁,而是它们的状态转变为暂停(Paused)状态。当最前的Activity被销毁时,其之后的activity显示到屏幕上,变成(Resume)状态。(2)TaskTask是Android中与Activity相关的另一个重要概念,其与Activity栈有着密切的联系。一个Task可以理解为是Activity的栈,Task是用户体验期间做造成的逻辑单元结果,Task可以由不同的应用组成,例如长按“home”按键弹出的界面中显示运行的就是Task而不是应用。Task的属性主要由tasked、numActivities、clearOnBackBroud、affinityintent、realActivity、affinity等;它的定义类文件在系统目录frameworks\base\services\java\com\android\server\am\下。(3)Activity生命周期Activity的生命周期就是它被创建一直到被销毁的这个过程。在它的生命周期中有几个状态上的变化,下图就是演示Activity在整个周期活动中的状态变化过程。图6-1activity活动生命周期Activity生命周期中状态迁移执行的方法如下:protectedvoidonCreate(BundlesavedlnstanceState)protectedvoidonStart()protectedvoidonRestart()protectedvoidonResume()protectedvoidonPause()protectedvoidonStop()protectedvoidonDestroy()在Activity被创建时第一个调用的是onCreate()方法,由于它只在Activity开始运行的时候调用一次,所以主要做一些一次性初始化的工作。随后调用的是onStart()和onResume(),onStart()也可做数据的初始化工作;当进入新的界面或系统切换到其他应用程序时,Activity并未被销毁,会被推入Task栈中,这时会调用onPause()与onStop()方法,这时可做该Activity的数据保存工作,将以后可用的数据存入内存或固定存储中;当activity再次显示在屏幕时,onRestart将被调用,同时又会执行onResume()方法;当程序执行了finish。方法,onDestroy()被调用,activity将被彻底销毁,结束生命周期。FFmpeg移植设定编译工具链使用手动指定交叉编译工具链的位置,其中$NDK为NDK的根目录。以下是手动指定gcc,并编译foo.c:SYSROOT=$NDK/platforms/android-8/arch-arm#API的版本可更改版为对应的版本,如当前使用的是API8的版本。exportCC=“$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc--sysroot=$SYSROOT“$CC-ofoo.o-cfoo.c设定编译参数运行configure脚本的时候有很多选项,可根据自己的需求进行自定义设置,运行./configure-help可显示所有选。先编辑configure文件,由于Linux中的回车为'\n',所以将'\r\n'替换成'\n'。而后新建一个“config.sh”文件,添加以下内容:NDK=你的NDK所在目录SYSROOT=$NDK/platforms/android-9/arch-armPREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86./configure--disable-ffmpeg--disable-ffplay--disable-ffserver\--disable-ffprobe--disable-swscale--disable-postproc\--disable-bsfs--disable-filters\--disable-avdevice--disable-network--disable-devices\

--disable-encoders--disable-muxers\#屏蔽编码相关组件--disable-protocols--enable-protocol=file\#只保留本地文件协议--enable-cross-compile--target-os=linux\--arch=arm--cpu=armv7-a\--enable-shared\#直接用make编译时加上--sysroot=$SYSROOT\--cc=$PREBUILT/bin/arm-linux-androideabi-gcc\--enable-memalign-hack\--extra-cflags=“-march=armv7-a-mfloat-abi=softfp-mfpu=neon“#编辑保存后在Cygwin中cdffmpeg到源文件夹,输入以后命令:$chmod+xconfig.sh/*改变config.sh执行权限*/$./config.sh若配置正确无误的情况下则会答应出以下文字:License:nonfreeandunredistributableCreatingconfig.makandconfig.h...1-编译库文件(1)编写Android.mk以libavcodec为例,摘抄以下内容:#partsneededformanydifferentcodecsOBJS-$(CONFIG_AANDCT)+=aandcttab.o#意思是如果config.mak中CONFIG_AANDCT=yes,则添加到变量OBJSOBJS-$(CONFIG_AC3DSP)OBJS-$(CONFIG_CRYSTALHD)OBJS-$(CONFIG_ENCODERS)OBJS-$(CONFIG_DCT)OBJS-$(CONFIG_DWT)OBJS-$(CONFIG_AC3DSP)OBJS-$(CONFIG_CRYSTALHD)OBJS-$(CONFIG_ENCODERS)OBJS-$(CONFIG_DCT)OBJS-$(CONFIG_DWT)+=ac3dsp.o+=crystalhd.o+=faandct.ojfdctfst.ojfdctint.o+=dct.odct32_fixed.odct32_float.o+=dwt.oOBJS-$(CONFIG_DXVA2)+=dxva2.o必须将以上内容添加到新建的Android.mk文件中,新建在libavcodec/Android.mk下,复制libavcodec/Makefile有关OBJS的语句,当中所有的*.o替换为*.c,指定需要编译的源代码文件。在每个需要编译的目录下都要创建Android.mk。还需要在编译的顶层目录写一个调用子目录的Android.mk文件。本论文在开发中编译其中的三个解码必须模块,1ibavutillibavcodeclibavformat。其中libavutil依赖libz,libavcodec依赖libavutil,libavformat依赖前两者[⑼(2)编译目前为止,使用C/C++编写Android应用程序有两种方式:第一种用C/C++编写主要的逻辑层,再用java编写界面并且调用C/C++的库或再对调用C/C++库返回的数据进行处理。这种方法较为通用,主要由于java开发Android应用程序的界面相对简单些。另一种用C/C++直接开发完整的应用程序,完全不用java,此开发方法在Android2.3系统之后的版本才支持,这种方法较为复杂并且较少开发者使用。要编译NDK首先要搭建linux环境,本论文主要使用的操作系统为windows,所以使用一个linux模拟环境cygwin,通过它,可以在不安装linux的情况下使用NDK来编译C、C++代码。使用“ndk-build”命令可编译才C/C++源文件。以下为AndroidNDK的目录结构,在android-ndk目录中,包含5个子目录和2个文件:•apps目录是Android工程的保存目录,子目录hello-jni和tow-libs为NDK自带的两个范例目录;・build目录保存了配置文件、交叉编译工具和编译脚本;・docs目录保存的是帮助文档;docs目录中的帮助文件说明:・out目录保存输出的so文件,是交叉编译的输出目录;・sources目录保存的是C/C++源代码文件,包含hello-jni和tow-libs子目录,分别保存了NDK自带示例所需要的C/C++源代码文件;・GNUmakfile文件和README.TXT文件分别是make工具的配置文件和NDK的说明文件[20]

FFmpeg音视频解码图6-2FFmpeg解码过程上图清晰地表达了FFmpeg解码媒体文件的每一个步骤,下面详细阐述下重点的几个步骤:1.利用av_register_all()方法获取视频文件中的媒体流,从而初始化libavformat/libavcodec。当打开注册库中含有的所有可用的文件格式和编码器的一个文件时,它们才能够自动选择相应的文件格式和编码器。由于av_register_all()只需调用一次,所以将其放在初始化代码段中;开始打开文件,调用如下代码:AVFormatContext*pFormatCtx;constchar*filename="myvideo.mpg";av_open_input_file(&pFormatCtx,filename,NULL,0,NULL);//打开视频文件av_open_input_file中的前三个参数描述了文件格式、缓冲区大小与视频输出格式参数;通过赋值null或0告诉libavformat去自动探测文件格式并且使用默认的缓冲区大小;取出包含在文件中的流信息:av_find_stream_info(pFormatCtx);//取出流信息AVFormatContext结构体dump_format(pFormatCtx,0,filename,false);//使用这个函数把获取到得参数全部输出。for(i=0;ivpFormatCtx->nb_streams;i++)〃区分视频流和音频流if(pFormatCtx->streams->codec.codec_type==CODEC_TYPE_VIDEO){〃找到视频流,这里也可以换成音频videoStream=i;break;}寻找解码器,解码媒体文件通过以下代码:AVCodec*pCodec;pCodec=avcodec_find_decoder(pCodecCtx->codec_id);avcodec_open(pCodecCtx,pCodec);//打开解码器给视频帧分配空间以便存储解码后的图片:AVFrame*pFrame;pFrame=avcodec_alloc_frame();执行完上述代码后就可以对媒体文件进行解码工作。首先读取数据,通过读取数据包来获取到整个媒体流,而后将其解码成帧,最后转换格式并且保存,通过以下代码:while(av_read_frame(pFormatCtx,&packet)>=0){〃读数据if(packet.stream_index=videoStream){〃判断是否视频流avcodec_decode_video(pCodecCtx,pFrame,&frameFinished,packet.data,packet.size);〃解码if(frameFinished){img_convert((AVPicture*)pFrameRGB,PIX_FMT_RGB24,(AVPicture*)pFrame,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height);〃转换}SaveFrame(pFrameRGB,pCodecCtx->width,pCodecCtx->height,i);〃保存数据av_free_packet(&packet);//释放}其中av_read_frame()读取数据包后将数据保存到AVPacket结构体中。avcodec_decode_video()把包转换成帧;转换时每当得到下一帧的时候,

avcodec_decode_video()为设置了帧结束标志frameFinished;接着,使用img_convert()把帧从原始格式转换成为RGB的格式。可以把一个AVFrame结构体的指针转换为AVPicture结构体的指针。最后,把帧和高宽基本信息传递给SaveFrame函数。这些数据最终可以在最后使用av_free_packet()来释放掉。流媒体播放功能的开发与实现1.媒体播放实现界面效果图图6-3媒体文件播放实现效果图2.媒体播放模块类图ActivityTOC\o"1-5"\h\zonCreate():voidonStart():voidonPause():voidonStop():voidonResume():voidonDestory():voidSufaceHoider-SURFACETYPEPUSHBUFFERS:intSufaceHoider-SURFACETYPEPUSHBUFFERS:int+surfaceDestroyed(SurfaceHolderholder)+surfaceCreated(holderSurfaceHolder)+surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheigl+setTvpe()PlayerActivityTimingThread+TimingThread():void+run():void-mediaPlayerMediaPlayer=null-surfaceViewSurfaceView=null-playBtImageButton-stopBtImageButton-previousBtImageButton-nextBtImageButton-seekBarSeekBar-Attribute8:mt#onCreate():void#onResume():void#onPause():void+onClick():void#onStop():void-play():void-pause():void-reset()+stop():inttintMediaPlayer+MEDIA_ERROR_SERVER_DIED:int+Attribute_2:int+Attribute3:int+setDataSource(Stringpath):String+prepare():void+reset():void+seekTo(intmsec):void+start():void+stop():void+pause():voidHandler-msg:Message+handleMessage():void图6-4媒体播放模块类图媒体播放模块主要类描述媒体播放模块主要的功能就是音频、视频媒体文件的播放,它主要用到了PlayActivity、MediaPlayer、SurfaceHolder、TimingThread、Handler这几个实体类,它们之间的关系如图4-9所示,下面我分别描述下这几个类的用途。PlayActivity类:是音视频媒体文件播放的重要类,主要负责音媒体的承载、解码后的处理、数据初始化和播放。MediaPlayer类:主要负责音视频媒体文件的解码工作,以及媒体在播放过程中的操作与控制。Surfac田older类:是一个接口,通过它来监听Surface中图片或动画的创建、改变和销毁,可以很方便地获得SurfaceView所对应的Surface所对应的Surfac田older。TimingThread类:继承自Thread类,用来访问非本地数据或计算较长、较复杂的算法,且不影响主线程正常运行的情况,提高客户端流畅度,提高用户体验。Handler类:用来处理Thread类执行后的数据处理和计算工作。如界面数据的变更就需要在Handler中处理,在Thread中无法处理。媒体播放模块关键代码界面在配置文件中注册vactivityandroid:name="com.dqplayer.module.PlayerActivity"android:label="@string/title_activity_player"android:configChanges="orientationlkeyboard"android:theme="@android:style/Theme.NoTitleBar">v/activity>媒体操作功能/***播放*/privatevoidplay(){if(mediaPlayer==null){mediaPlayer=newMediaPlayer。;//设置多媒体流类型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置用于展示mediaPlayer的容器mediaPlayer.setDisplay(surfaceHolder);try{mediaPlayer.setDataSource(filePath);mediaPlayer.prepare();讦(fileType==1){mediaPlayer.start();}elseif(fileType==2){Intentintent=newIntent(PlayerActivity.this,AudioService.class);intent.putExtra("filePath",filePath);intent.putExtra("filePath",filePath);startService(intent);}seekBar.setMax(mediaPlayer.getDuration());//设置进度条值seekBar.setEnabled(true);timingThread=newTimingThread();//进度条移动监听线程实例timingThread.start();讦(videoPlayPosition>0){mediaPlayer.seekTo(videoPlayPosition);videoPlayPosition=0;}}catch(IOExceptionioe){ioe.printStackTrace();讦(fileType==1){Toast.makeText(PlayerActivity.this,R.string.not_play_this_video,Toast.LENGTH_SHORT).show();}else讦(fileType==2){Toast.makeText(PlayerActivity.this,R.string.not_play_this_audio,Toast.LENGTH_SHORT).show();}finish。;}catch(Exceptione){e.printStackTrace();Log.i(“通知","播放过程中出现了错误哦“);Toast.makeText(PlayerActivity.this,R.string.play_error,Toast.LENGTH_SHORT).show();finish();}}else{mediaPlayer.start();}isPause=false;/***暂停*/privatevoidpause(){〃点击了暂停按钮讦(mediaPlayer!=null){Log.i("isPlaying2",String.valueOf(mediaPlayer.isPlaying()));if(mediaPlayer.isPlaying()){讦(isPause==false){mediaPlayer.pause();isPause=true;}else{mediaPlayer.start();isPause=false;}/***重置*/privatevoidreset(){〃点击了reset按钮f(mediaPlayer!=null){Log.i("reset_isPlaying",String.valueOf(mediaPlayer.isPlaying()));f(mediaPlayer.isPlaying()){//跳转到视频的最初进度mediaPlayer.seekTo(O);mediaPlayer.start();}/***停止*/privatevoidstop(){〃点击了stop按钮f(mediaPlayer!=null){Log.i("stop_isPlaying",String.valueOf(mediaPlayer.isPlaying()));mediaPlayer.stop();mediaPlayer.release();mediaPlayer=null;playBt.setImageResource(R.drawable.play2);isPause=true;seekBar.setProgress(O);//进度条归0timingThread=null;seekBar.setEnabled(false);//禁用进度条}总结随着3G通信技术的日益成熟及4G高速无线网络的快速发展,移动服务提供商可以在不同的频带网络和无线通信平台下提供无线服务,这将极大地满足用户对移动通信的各种需求,因此越来越多的用户开始使用移动流媒体业务。本论文主要研究的工作有以下几点:(1)研究了Android系统的主体框架,主要应用了应用程序层、应用框架层和程序库层。在此基础上对Android的四大组件活动(Activity)、广播接收者(Broadcastreceivers)、服务(Service)、内容提供者(contentprovider)进行了研究,对于组件的深入研究对客户端的开发发挥着重要的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论