定稿基于安卓android平台的音频编解码技术研究与应用毕业论文_第1页
定稿基于安卓android平台的音频编解码技术研究与应用毕业论文_第2页
定稿基于安卓android平台的音频编解码技术研究与应用毕业论文_第3页
定稿基于安卓android平台的音频编解码技术研究与应用毕业论文_第4页
定稿基于安卓android平台的音频编解码技术研究与应用毕业论文_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

编号 毕 业 论 文 ( 届本科)论文题目: 基于Android平台的音频编解码技术研究与应用学 院: 信息工程学院 专 业: 计算机信息与科学技术 班 级: 作者姓名: 指导教师: 完成时间: 基于Android平台的音频编解码技术研究与应用摘要:在这个经济飞速发展的时代,移动设备也日益完善,我们大家都已经有了在手机上听音乐看电影的习惯,在中国大陆,谷歌发布的Android手机因其手机系统的优越性,得以迅速推广,随着Android智能手机的普及,各种基于Android的应用软件也如雨后春笋般出现了。同时,随着3G网络大规模建设和智能手机迅速普及,移动互联网时代已经悄然而至。关键字:Android多媒体 OpenCore音频编码 音频解码 声音数据处理Audio codec technology research and application based on the Android platformLeiChao(Longdong UniversitySchool of Information Engineering, GansuQingyang745000)ABSTRACT: In this era of rapid econmic development,but also increasingly sophisticated mobile devices,we already have the habit of listening to music,watching movies on the phone,in china,Google releaed its Android mobile phone system superiority,rapid promotion with the popularity of Android smartphones,a variety of Android-based applications have sprung up.Meanwhile,with the large-scale construction of 3G networks and the rapidly growing popularity of smart phones,mobile internet era has quietly.KEYWORDS:Android MultimediaOpenCore Audio CodingAudio decoding Audio data processing 1 绪论1.1研究背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在市场上主流的手机操作系统有Windowsmobile(微软),SysBian(诺基亚),IOS(苹果)以及谷歌的Android操作系统,其中Android系统因为开发源代码而具有广阔的发展前景,已经和国内外诸多手机厂家开展了合作。Android操作系统是谷歌于2007年公布的开放式源代码手机系统,它的开放性相对有其它封闭式手机系统拥有明显的优势,任何人都可以根据自己的喜好和需求将Android系统的功能进行改进,在Android平台上开发属于自己的应用软件。这也让更多的人对这一操作系统有了更浓厚的兴趣。随着计算机的广泛应用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已逐渐成为了人们生活中必不可少的一部分了。但是原生Android系统因为版权法律原因,对一些音频编码格式不支持。这就限制了手机的使用范围。本文将重点介绍Android系统原生多媒体框架。通过NDK方式扩展其支持范围,方便用户使用。1.2论文的研究内容 Android是基于Linux内的的,不过仅仅在Linux下实现音频播放功能是不够的。它的音频播放功能是依附于Android下的音频系统的,Android下的音频系统的对外接口是AudioSystem接口类,应用程序可以通过此接口访问到音频资源。AudioSystem的实现类是AudioFlinger。本文研究的主要内容就是如何实现特定格式的音频文件的生成和播放。1.3课题研究的主要工作 Android系统是Google及其开发联盟推出基于Linux平台的开源手机操作系统。Android平台为开发者不仅提供了完整的多媒体解决方案,而且提供了统一、简单、易用的开发接口。本课题主要研究的内容是Android原生多媒体框架对音频文件的编码和解码操作。并通用使用系统自带的多媒体功能完成实际开发工作。满足人们多元化的音频数据需求。2 Android开发平台介绍Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。2.1 Android系统有如下的几大特性 l 应用程序框架:支持组件的重用与替换;l Dalvik虚拟机:专门为移动设备做了优化;l 内部集成浏览器:该浏览器基于开源的WebKit引擎;l 优化的图形库:包括2D和3D图形库、3D图形库基于OpenGL、ES;l SQLite:用作结构化的数据存储;l 多媒体支持:包括常见的音频、视频和静态印象文件格式(如MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF)l GSM电话(依赖于硬件);l 蓝牙Bluetooth、EDGE、3GandWiFi(依赖于硬件);l 照相机、GPS、指南针和加速度计(依赖于硬件);l 丰富的开发环境:包括设备模拟器、调试工具、内存及性能分析图表和Eclipse集成开发环境插件2.2 Android基本框架(AndroidArchitecture) 图2-2 Android系统框架图2.2.1 ApplicationsAndroid会同一个核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是用JAVA编写的2.2.2 ApplicationFrameWork开发者完全可以访问核心应用程序所使用的API框架。该应用程序架构用来简化组件软件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。该应用程序重用机制使得组建可以被用户替换。所有的应用程序都由一系列的服务和系统组成,包括:l 可扩展的视图(Views)可以用来建应用程序,包括列表(lists)、网格(grids)、文本框(textboxes)、按钮(buttons),甚至包括一个可嵌入的web浏览器;l 内容管理器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据;l 资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和分层文件(layoutfiles);l 通知管理器(NotificationManager)使得应用程序可以在状态栏中显示客户通知信息;l 活动类管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。2.2.3 Libraries库Android包括一个被Android系统中各种不同组件所使用的C/C+库集。该库通过Android应用程序框架为开发者提供服务。以下是一些主要的核心库:l 系统C库:一个从BSD继承来的标准C系统函数库(libc),专门为基于embeddedlinux的设备定制。l 媒体库:基于PacketVideoOpenCORE;该库支持录放,并且可以录制许多流行的音频视频格式,还有静态印像文件包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG。l SurfaceManager:对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝融合。l LibWebCore:一个最新的web浏览器引擎用来支持Android浏览器和一个可嵌入的web视图。l SGL:一个内置的2D图形引擎。l 3Dlibraries:基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。l FreeType:位图(bitmap)和向量(vector)字体显示。SQLite一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。2.2.4 AndroidRuntimeAndroid包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik是针对于同时高效地运行多个DVMs来实现的。Dalvik虚拟机执行.dex的Dalvik可执行文件,该格式文件针对最小内存使用做了优化。该虚拟机是基于寄存器的,所有的类都经由JAVA汇编器编译,然后通过SDK中的dx工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux的一些功能,比如线程机制和底层内存管理机制。2.2.5 Linux内核Android是运行于Linuxkernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。Android为了达到商业应用,必须移除被GNUGPL授权证所约束的部份,例如Android将驱动程序移到userspace,使得Linuxdriver与Linuxkernel彻底分开。bionic/libc/kernel并非标准的kernelheaderfiles。Android的kernelheader是利用工具由Linuxkernelheader所产生的,这样做是为了保留常数、数据结构与宏。目前Android的Linuxkernel控制包括安全(Security),存储器管理(MemoryManagement),程序管理(ProcessManagement),网络堆栈(NetworkStack),驱动程序模型(DriverModel)等。下载Android源码之前,先要安装其构建工具Repo来初始化源码。Repo是Android用来辅助Git工作的一个工具。2.3 Android系统的四大组件 在Android系统中,为我们提供了四大基本组件,每个组件是一个视图,但是有些是可见的,有些是不可见的视图,像Activity,ContentProvider是可见的视图,Service和BroadcastReceiver是不可见的,它们只在系统的后台运行。下面分别介绍四大组件:(1) Activity简介在Android系统中Activity提供可视化的用户界面,一个Android应用通常由多个Activity组成。多个Activity组成了Activity栈(Stack),当前活动的Activity处于栈顶。Activity有自己的生命周期,由Android系统来控制。(2) Service简介顾名思义Service就是运行在后台的一种服务程序,一般很少和用户交互,因此没有可视化界面定义一个Service类比较简单,只要继承Service类,实现其生命周期中的方法就可以了。一个定义好的Service必须在AndroidManifest.xml配置文件注册,通过元素声明才能使用.Service有自己的生命周期,我们可以调用startService()启动一个Service或者bindService()方法来绑定一个存在的Service。(3) BroadcastReceiver简介BroadcastReceiver顾名思义广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别的(例如,某个按钮的单击事件),而广播事件处理机制是系统级别的。到目前为止我们可以使用Intent来启动一个程序组件,我们还可以通过使用sendBroadcast()方法来发起一个系统级别的事件广播来传递消息。我们可以在你的应用程序中实现BroadcastReceiver来监听和响应这些广播的Intent。(4) ContentProvider简介ContentProvider用来保存和检索数据,并且使应用程序之间相互访问数据成为可能。它是跨应用程序共享数据的唯一方法。Android为常用的数据类型(如:音视频、图片和联系方式等)提供了大量的ContentProvider。它们被定义在vider包下面。通过这样定义好的ContentProvider我们可以方便的进行数据操作。当然我们必须拥有适当的权限。我们也可以自己来定ContentProvider共享我们的数据,方便用户的访问。2.4系统特点 :(1)开放性在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。5(2)挣脱运营商的束缚在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。(3)丰富的硬件选择这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。(4)不受任何限制的开发商Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。(5)无缝结合的Google应用如今叱咤互联网的Google已经走过10年度历史。从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。3 Android多媒体框架简介在Android中,与桌面Linux和Qtopia通常采用GStearmer、xine、MPlayer不同,Android采用的是基于PacketVideo的OpenCore的多媒体框架方案。由于OpenCore高度的模块化,采用OpenCore作为多媒体框架有利于加速将产品推向市场、减小操作成本和资源投入、扩展编解码器、增强用户体验等。在对数据源的支持上,除了本地文件,OpenCore还对内容目录、流媒体、OTA(Over-the-Air)下载,DRM等提供了支持。目前OpenCore已经应用于170多款移动终端中。2009年2月发布的OpenCore2.0已经提供了对基于3G-324M协议的视频电话的支持,同时在多媒体硬件加速方面也进行了优化。需要说明的是,OpenCore遵循OopenMax的接口规范,本质上是OpenMax的一种实现。OpenCore是Android的多媒体核心,它是一个基于C+的实现,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,个层次之间的接口多使用继承等方式。所有Android平台的音频,视频的采集以及播放等操作都是通过它来实现的。它也被称为PV(Packet Video),Packet Video 是一家专门提供多媒体解决方案的公司。程序员可以使用Open Core方便快捷地开发出想要的多媒体应用程序。例如:音视频的采集,回放,视频会议,实时的流媒体播放等应用。Open Core多媒体框架有一套通用可扩展的接口针对第三方的多媒体遍解码器,输入/出设备等等 具体功能如下:l 多媒体文件播放、下载,包括:3GPP,MPEG-4、AAC和MP3containers.l 流媒体的下载、实时播放、包括:3GPP,HTTP和RTSP/RTP流。l 动态视频和静态图片的编码、解码、包括例如:MPEG-4,H233和AVC(H.264),JPEG.l 语音编码格式:AMR-NB和AMR-WB.l 音乐编码格式:MP3、AAC、AAC+。l 视频和图像格式:3GPP、MPEG-4、JPEG。l 视频会议:基于H324-M标准。OpenCore是一个多媒体框架。从宏观上来看,它主要包含了两大方面的内容:l PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能。l PVAuthor:提供媒体流记录功能,完成各种音频(Audio)、视频(Video)流以及静态图片捕获功能。PVPlayer和PVAuthor以SDK的形式提供给开发者,可以在这个SDK之上构建多种应用程序和服务。在移动终端中常常使用的多媒体应用程序,例如媒体播放器、照相机、录像机、录音机等等。为了更好的组织整体的构架,OpenCore在软件层次在宏观上分成几个层次:l OSCL:Operating System Compatibility Library(操作系统兼容库),包含了一些操作系统底层的操作,为了更好的在不同操作系统移植,包含了基本数据类型、配置、字符串工具、IO、错误处理、线程等内容,类似一个基本的C+库。l PVMF:PacketVideo Multimeedia Framework(PV多媒体框架),在框架内实现一个文件解析(parser)和组成(composer)、编解码的NODE,也可以继承其通用的接口,在用户层实现一些NODE。l PVPlayer Engine:PVPlayer引擎。l PVAuthor Engine:PVAuthor引擎。3.1 OpenCore库 通过前面的描述可知, Media Framework处于Libraries这一层,我们知道Library是由CC+来实现的,它们通过Java的JNI方式来调用。Open Core的代码在Android代码的External/Opencore目录中,图3.1展示了OpenCore框架,其子目录及其具体功能描述如下:图3-1 OpenCore框架图l android:这里面是一个上层的库,它实现了一个为Android使用的音视频采集、播放接口,及DRM数字版权管理的接口实现。l baselibs:包含数据结构和线程安全等内容的底层库。l codecs_v2:音视频的编解码器,基于OpenMAX实现。l engines:核心部分多媒体引擎的实现。l exterm_libs_v2:包含了Khronos的OpenMAX的头文件。l fileformats:文件格式的解析(Parser)工具。l nodes:提供一些PVMF的NODE,主要是编解码和文件解析方面的。l oscl:操作系统兼容库。l pvmi:输入输出控制的抽象接口。l protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容。l pvcommon:pvcommon库文件的Androidmk文件,没有源文件。l pvplayer:pvplayer库文件的Androidmk文件,没有源文件。l pvauthor:pvauthor库文件的Androidmk文件,没有源文件。l tools_v2:编译工具以及一些可注册的模块3.2 OpenMax介绍OpenMAX是Khronos制定的API,Khronos也是OpenGL的制定者。OpenMAX是无授权费、跨平台的应用程序接口API,通过媒体加速组件能够在开发、集成和编程环节中实现跨多操作系统和处理器硬件平台,提供全面的流媒体编解码器和应用程序便携化。在架构底层上为多媒体codec和数据处理定义了一套统一的编程接口(OpenMAX IL API),对多媒体数据的处理功能进行系统级抽象,为用户屏蔽了底层细节。因此多媒体应用程序和多媒体框架通过 OpenMAX IL 可以以一种统一方式来使用codec和其他多媒体数据处理功能,具有了跨越软硬件平台的移植性。图3-2 OpenMax在系统中的位置图图3-2 OpenMax层次图OpenMax主要包含了一下几个模块:l OpenMAX AL (Appliction Layer)l OpenMAX AL API 在应用程序和多媒体中间件之间提供了一个标准化接口,多媒体中间件提供服务以实现被期待的 API 功能。 AL向多媒体接口提供应用册便携性。l OpenMAX IL(Integration Layer)l OpenMAX IL 作为音频,视频和图像编解码器,能与多媒体编解码器交互,并以统一的行为支持组件(例如资源和皮肤)。编解码器供应商必须写私有的或者封闭的接口集成进移动设备。IL的目的是使用特征集合为编解码器提供一个系统抽象,为解决多个不同媒体系统之间轻便性的问题。 l OpenMAX DL(Development Layer)l OpenMAX DL 定义了一个API,它是音/视频和图像功能的集合。硅供应商能够在一个新的处理器上实现并优化其,然后编解码供应商使用其来编写更广泛的编解码器功能。它包括音频信号的处理功能,如FFT和filter;图像原始处理,如颜色空间转换和视频原始处理,以实现例如MPEG-4、H.264、MP3、AAC和JPEG等编解码器的优化。 OpenMAX通过iDL 和aDL来支持加速, iDL使用OpenMAX IL结构,aDL向OpenMAX DL API增加了异步接口。3.3 Splitter的定义与初始化以wav的splitter为例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。4我们由底往上看,vwavfileparser.cpp中的PV_Wav_Parser类有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成员函数,此类应该就是最终的解析类。我们搜索PV_Wav_Parser类被用到的地方可知,在PVMFWAVFFParserNode类中有PV_Wav_Parser的一个指针成员变量。再搜索可知,PVMFWAVFFParserNode类是通过PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是在PVPlayerNodeRegistry:PVPlayerNodeRegistry()类构造函数中通过PVPlayerNodeInfo类被注册到Oscl_Vector的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。由上可知,Opencore中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。综述一下splitter的定义与初始化过程:l 每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。l 每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。l 播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector iType成员变量中。3.4当前Splitter的匹配过程PVMFStatusPVPlayerNodeRegistry:QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType&aOutputType,Oscl_Vector& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid。8从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c+函数:setDataSource,(Ljava/lang/String;)V,(void)android_media_MediaPlayer_setDataSource,static void android_media_MediaPlayer_setDataSource(JNIEnv *env, jobject thiz, jstring path)此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径。status_t MediaPlayer:setDataSource(const char *url)此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService,const sp& service(getMediaPlayerService();然后新建一个IMediaPlayer变量,sp player(service-create(getpid(), this, fd, offset, length);在spMediaPlayerService: create(pid_t pid, const sp&client, const char* url)中,调status_t MediaPlayerService:Client:setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。在MediaPlayerService:Client:setDataSource中,调sp MediaPlayerService:Client:createPlayer(player_type playerType)生成一个继承自MediaPlayerBase的PVPlayer实例,PVPlayer的继承关系如下:PVPlayer-MediaPlayerInterface-MediaPlayerBase最后调PVPlayer的setDataSource()函数status_t PVPlayer:setDataSource(const char *url)status_t PVPlayer:prepare()此函数开头执行ret= mPlayerDriver- enqueueCommand (new PlayerSetDataSource (mDataSourcePath,0,0) );将PlayerSetDataSource的command类加入到PlayerDriver的command处理队列中,在void PlayerDriver:Run()函数中处理此command,调用下面的handleSetDataSource函数。void PlayerDriver:handleSetDataSource(PlayerSetDataSource* ec)PVCommandId PVPlayerEngine:AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData)PVMFStatus PVPlayerEngine:DoAddDataSource(PVPlayerEngineCommand& aCmd)PVMFStatus PVPlayerEngine:DoSetupSourceNode(PVCommandId aCmdId, OsclAny* aCmdContext)3.5 Android MediaPlayer介绍在实际开发中我们并不会过多的研究Open Core的实现,Android提供了上层的Media API给开发人员使用,MediaPlayer和MediaRecorder。MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。MediaPlayer在底层是基于Opencore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。图3-5 MediaPlayer库结构图由图3-5可以看出在各个库中,libmedia.so与libmediaplayerservice.so位于核心的位置。libmedia.so对上层的提供的接口主要是MediaPlayer类,类libmedia_jni.so通过调用MediaPlayer类提供对JAVA的接口,并且实现了android.media.MediaPlayer类。libmediaplayerservice.so是Media的服务器,它通过继承libmedia.so的类实现服务器的功能,而libmedia.so中的另外一部分内容则通过进程间通讯和libmediaplayerservice.so进行通讯。libmediaplayerservice.so的真正功能通过调用OpenCore Player(库libopencoreplayer.so)来完成。图3-6整个MediaPlayer库和调用的关系图从框架结构上来看,IMediaPlayerService.h、IMediaPlayerClient.h和MediaPlayer.h三个类定义了MeidaPlayer的接口和架构,MediaPlayerService.cpp和mediaplayer.coo两个文件用于MeidaPlayer架构的实现,MeidaPlayer的具体功能在PVPlayer(库libopencoreplayer.so)中的实现。Media Player提供的基本接口如表3.5.1:我们可以看出MediaPlayer类提供了一个多媒体播放器的基本操作,播放,暂停,停止,设置音量等等。简单的例子:MediaPlayer mp = new MediaPlayer(); /构建MediaPlayer对象mp.setDataSource(PATH_TO_FILE); /设置文件路径mp.prepare(); /准备mp.start(); /开始播放表3.5.1 MediaPlayer的基本接口方法(Public Methods)说明static MediaPlayer create(Context context, Uri uri)构造方法创建一个要播放的多媒体(Convenience method to create a MediaPlayer for a given Uri.)int getCurrentPosition()得到当前播放位置(Gets the current playback position.)int getDuration()得到文件的播放时间 (Gets the duration of the file.)int getVideoHeight()返回视频的高度值(Returns the height of the video.)int getVideoWidth()返回视频的宽度值(Returns the width of the video. )boolean isPlaying()检查媒体是否播放(Checks whether the MediaPlayer is playing.)void pause()暂停播放(Pauses playback.)void prepare()准备播放(同步)(Prepares the player for playback, synchronously.)void prepareAsync()准备播放(异步)(Prepares the player for playback, asynchronously.)void release()释放MediaPlayer对象(Releases resources associated with this MediaPlayer object.)void start()开始播放(Starts or resumes playback.)void stop()停止播放(Stops playback after playback has been stopped or paused.)void reset()重置MediaPlayer对象(Resets the MediaPlayer to its uninitialized state.)void seekTo(int msec)指定播放的位置(Seeks to specified time position.)void setAudioStreamType(int streamtype)设置流媒体的类型(Sets the audio stream type for this MediaPlayer.)void setDataSource(String path)设置流媒体的数据来源(Sets the data source (file-path or http/rtsp URL) to use.)void setVolume(float leftVolume, float rightVolume)设置音量(Sets the volume on this player.)4 常见音频格式介绍要在计算机内播放或是处理音频文件,也就是要对声音文件进行数、模转换,这个过程同样由采样和量化构成,人耳所能听到的声音,最低的频率是从20Hz起一直到最高频率20KHZ,20KHz以上人耳是听不到的,因此音频的最大带宽是20KHZ,故而采样速率需要介于4050KHZ之间,而且对每个样本需要更多的量化比特数。音频数字化的标准是每个样本16位-96dB的信噪比,采用线性脉冲编码调制PCM,每一量化步长都具有相等的长度。在音频文件的制作中,正是采用这一标准。对于播放,Android支持各种各样的音频文件格式和编解码。对于录音的支持少一些。4.1 CD格式:天籁之音 当今世界上音质最好的音频格式是什么?当然是CD了。因此要讲音频格式,CD自然是打头阵的先锋。在大多数播放软件的“打开文件类型”中,都可以看到*.cda格式,这就是CD音轨了。标准CD格式也就是44.1K的采样频率,速率88K/秒,16位量化位数,因为CD音轨可以说是近似无损的,因此它的声音基本上是忠于原声的。CD光盘可以在CD唱机中播放,也能用电脑里的各种播放软件来重放。一个CD音频文件是一个*.cda文件,这只是一个索引信息,并不是真正的包含声音信息,所以不论CD音乐的长短,在电脑上看到的“*.cda文件”都是44字节长。4.2 WAV:无损的音乐是微软公司的一种声音文件格式,它符合 PIFFResource Interchange File Format 文件规范,用于保存WINDOWS平台的音频信息资源,被WINDOWS平台及其应用程序所支持。4.3 “*.WAV”格式支持MSADPCM、CCITT A LAW等多种压缩算法,支持多种音频位数、采样频率和声道,标准格式的WAV文件和CD格式一样,也是44.1K的采样频率,速率88K/秒,16位量化位数,看到了吧,WAV格式的声音文件质量和CD相差无几,也是目前PC机上广为流行的声音文件格式,几乎所有的音频编辑软件都“认识”WAV格式。 4.4 MP3:流行的风尚MP3格式诞生于八十年代的德国,所谓的MP3也就是指的是MPEG标准中的音频部分,也就是MPEG音频层。根据压缩质量和编码处理的不同分为3层,分别对应“*.mp1/“*.mp2”/“*.mp3”这3种声音文件。MPEG音频文件的压缩是一种有损压缩,MPEG3音频编码具有10:112:1的高压缩率,同时基本保持低音频部分不失真,但是牺牲了声音文件中12KHz到16KHz高音频这部分的质量来换取文件的尺寸,相同长度的音乐文件,用.mp3格式来储存,一般只有.wav文件的1/10,而音质要次于CD格式或WAV格式的声音文件。由于其文件尺寸小,音质好;所以在它问世之初还没有什么别的音频格式可以与之匹敌,因而为.mp3格式的发展提供了良好的条件。直到现在,这种格式还是风靡一时,作为主流音频格式的地位难以被撼动。但是树大招风,MP3音乐的版权问题也一直是找不到办法解决,因为MP3没有版权保护技术,说白了也就是谁都可以用。4.5 MIDI:作曲家的最爱经常玩音乐的人应该常听到MIDI(Musical Instrument Digital Interface)这个词,MIDI允许数字合成器和其他设备交换数据。MID文件格式由MIDI继承而来。MID文件并不是一段录制好的声音,而是记录声音的信息,然后在告诉声卡如何再现音乐的一组指令。这样一个MIDI文件每存1分钟的音乐只用大约510KB。今天,MID文件主要用于原始乐器作品,流行歌曲的业余表演,游戏音轨以及电子贺卡等。.mid文件重放的效果完全依赖声卡的档次。.mid格式的最大用处是在电脑作曲领域。.mid文件可以用作曲软件写出,也可以通过声卡的MIDI口把外接音序器演奏的乐曲输入电脑里,制成.mid文件。4.6 WMA:最具实力的敌人WMA (Windows Media Audio) 格式是来自于微软的重量级选手,后台强硬,音质要强于MP3格式,更远胜于RA格式,它和日本YAMAHA公司开发的VQF格式一样,是以减少数据流量但保持音质的方法来达到比MP3压缩率更高的目的,WMA的压缩率一般都可以达到1:18左右,WMA的另一个优点是内容提供商可以通过DRM(Digital Rights Management)方案如Windows Media Rights Manager 7加入防拷贝保护。这种内置了版权保护技术可以限制播放时间和播放次数甚至于播放的机器等等,这对被盗版搅得焦头乱额的音乐公司来说可是一个福音,另外WMA还支持音频流(Stream)技术,适合在网络上在线播放,作为微软抢占网络音乐的开路先锋可以说是技术领先、风头强劲,更方便的是不用象MP3那样需要安装额外的播放器,而Windows操作系统和Windows Media Player的无缝捆绑让你只要安装了windows操作系统就可以直接播放WMA音乐,新版本的Windows Media Player7.0更是增加了直接把CD光盘转换为WMA声音格式的功能,在Windows操作系统中,WMA是默认的编码格式,大家知道Netscape的遭遇,现在“狼”又来了。WMA这种格式在录制时可以对音质进行调节。同一格式,音质好的可与CD媲美,压缩率较高的可用于网络广播。虽然现在网络上还不是很流行,但是在微软的大规模推广下已经是得到了越来越多站点的承认和大力支持,在网络音乐领域中直逼.mp3,在网

温馨提示

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

评论

0/150

提交评论