Android的MediaPlayer架构介绍(自己总计的)
基于Android的多功能视频播放器的系统设计说明

文档编号:基于Android的多功能视频播放器系统设计说明书目录1引言 (4)1.1目的 (4)1.2适用围 (4)2系统架构 (5)2.1硬件架构 (5)2.2软件架构 (9)3完整功能结构图 (11)4系统数据库设计 (11)4.1 E-R图设计 (11)4.2字段设计 (11)4.2.1本地视频文件记录表 (11)4.2.2历史播放文件表 (12)4.2.3 收藏文件表 (12)5视频播放器部署图 (13)6 系统需求 (13)6.1系统界面需求 (13)6.2系统性能需求 (13)6.1系统开发环境需求 (14)7视频播放器流程图 (14)1引言1.1目的本文档是多通道同步数字记录仪升级换代项目的系统设计文档。
从系统的高层角度对系统的硬件架构、软件架构、网络架构、系统部署、系统运行方式进行设计,为下一步各个模块的详细设计提供系统级的视图。
1.2适用围本文用于描述多通道同步数字记录仪升级换代项目的系统设计,给出系统的主要架构与配置项,对相关运行、数据、用户接口、容错与复用和重要模块进行分析,作为项目后续详细设计与开发实现的依据。
本说明书的阅读对象为:跟我们同龄的有一定基础的大学生,以及相关的项目开发人员等等。
.. .. ..2系统架构2.1硬件架构2.1.1 JDK安装JDK是Java语言的原创者推出的原始开发环境。
采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,有利于理解Java面向对象的设计思想。
在Windows上安装JDK非常简单,访问Oracle官方下载页面,网址为www.oracle./technetwork/indexes/downloads/index.html,也可从其他下载。
下载完成后,双击运行JDK安装程序并根据提示设定环境变量。
2.1.2 Android SDK安装以及系统设置下载好SDK包后,将zip文件解压缩至合适的地方。
在下文中,默认SDK安装目录为$SDK_ROOT 。
使用MediaPlayer和SurfaceView播放视频

Button play=(Button)findViewById(R.id.play); //获取“播放”按钮
final Button pause=(Button)findViewById(R.id.pause); //获取“暂停/继续”按钮
Button stop=(Button)findViewById(R.id.stop);
}
11
知识点小结
通过今天学习: 使用MediaPlayer和SurfaceView播放视频
12
感谢您的学习
Android应用开发技术课程开发组
感谢您的学习
Android应用开发技术课程开发组
5.为MediaPlayer对象添加事件监听器:
//为MediaPlayer对象添加完成事件监听器
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
public void onClick(View v) {
if(mp.isPlaying()){
mp.stop();
//停止播放
sv.setBackgroundResource(R.drawable.bg_finish);
//改变
SurfaceView的背景图片
pause.setEnabled(false);
sv.setBackgroundResource(R.drawable.bg_finish); //改变SurfaceView的背景图
片
Toast.makeText(MainActivity.this, "视频播放完毕!",
Android多媒体MediaPlayer使用详解

Android多媒体MediaPlayer使⽤详解现在的⼿机功能越来越丰富了,遥想10年前,MP3,MP4,MP5,还是很流⾏的,博主当时读⾼中时很想拥有⼀台,可以听⾳乐和看电影。
可是条件有限,学校也禁⽌此东西,所以只能偷偷的玩。
⽽现在我们的⼿机也很早以前就⽀持了这些功能,⽽且界⾯和功能也远远超过了MP4。
好吧,说多了,今天本⽂介绍的是Andriod系统⾃带的Mediaplayer,和VideoView实现简单的⾳乐和视频的播放,⾄于想做出如酷狗⾳乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。
Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界⾯上,Music和Video两个应⽤程序都是调⽤MediaPlaer来实现的。
⼀、播放⾳频⽂件⾸先看看MediaPlaer的⽣命周期下⾯是MediaPlayer提供的常⽤⽅法⽅法说明MediaPlayer构造⽅法create创建⼀个要播放的多媒体getCurrentPosition得到当前播放位置getDuration得到⽂件的时间getVideoHeight得到视频的⾼度getVideoWidth得到视频的宽度isLooping是否循环播放isPlaying是否正在播放pause暂停prepare准备(同步)prepareAsync准备(异步)release释放MediaPlayer对象相关的资源reset重置MediaPlayer对象为刚刚创建的状态seekTo指定播放的位置(以毫秒为单位的时间)setAudioStreamType设置流媒体的类型setDataSource设置多媒体数据来源(位置)setDisplay设置⽤SurfaceHolder来显⽰多媒体setLooping设置是否循环播放setOnButteringUpdateListener⽹络流媒体的缓冲监听setOnErrorListener设置错误信息监听setOnVideoSizeChangedListener视频尺⼨监听setScreenOnWhilePlaying设置是否使⽤SurfaceHolder来保持屏幕显⽰setVolume设置⾳量start开始播放stop停⽌播放MediaPlayer的⼯作流程是这样的:1,⾸先创建MediaPlaer对象; *2,然后调⽤setDataSource()⽅法来设置⾳频⽂件的路径;**3,再调⽤prepare()⽅法使MediaPlayer进⼊到准备状态;4,调⽤start⽅法就可以播放⾳频。
编译好的ijkmediaplayer用法

Ijkmediaplayer是Android强大的多媒体播放器库。
它被广泛用于Android应用程序的开发,用于播放各种媒体格式,包括视瓶和音频。
在本篇文章中,我们将探索预编译的ijkmediaplayer库的用途,以及如何将其融入Android项目。
使用预编译的ijkmediaplayer库的第一步是从冠方仓库下载库文件。
库文件以zip格式提供,可以方便地提取以获取必要的文件。
一旦获得库文件,它们可以通过在项目建设中加入必要的依赖性来整合到一个Android项目中。
格莱尔档案。
这使得项目能够利用ijkmediaplayer库提供的功能。
在库被整合到项目中后,可以通过创建IjkMediaPlayer类实例和将数据源设定为理想的媒体文件来播放媒体文件。
可以使用SetData Source方法进行,这种方法将媒体文件的文件路径或URL作为参数。
一旦数据源被设定,媒体文件可以通过调用readyAsync方法来准备回放。
这种方法在背景中准备媒体文件,并在文件准备回放后触发回调。
一旦媒体文件准备好,就可以通过调用启动方法来播放。
这开始播放媒体文件,并允许用户通过挖掘,停止,或寻求媒体文件与玩家互动。
IjkMediaPlayer类还提供了控制音量,播放速度,显示设置的方法,允许完全定制的播放体验。
除了基本的回放功能,ijkmediaplayer库还支持视瓶流,字幕渲染,音频可视化等高级功能。
这些功能可以很容易地集成到一个Android 应用程序中,为用户提供丰富而沉浸的媒体回放体验。
预编译的ijkmediaplayer库为将多媒体回放能力整合到Android应用中提供了一个方便而强大的解决方案。
凭借其简易的集成过程和对高级功能的支持,它对于寻求通过媒体回放功能增强应用程序的开发者来说是一个流行的选择。
流行的媒体播放器应用"VLC for Android"利用ijkmediaplayer库为其用户提供无缝和内容丰富的媒体回放体验。
android mediarecorder 原理

android mediarecorder 原理[Android MediaRecorder 原理]在Android开发中,我们经常会遇到需要使用摄像头和麦克风进行视频和音频录制的需求。
而为了满足这一需求,Android系统提供了一个非常方便的类——MediaRecorder。
MediaRecorder类可以用来实现音频和视频的录制,并且可以设置多种参数以满足不同的需求。
本文将会详细解释Android MediaRecorder的原理,包括其基本用法、内部实现原理以及一些常见问题的解决方法。
# 什么是MediaRecorder?MediaRecorder是Android系统提供的一个多媒体录制类,可以用来录制音频和视频。
使用MediaRecorder可以方便地实现录制功能,无需自己实现复杂的音视频处理逻辑。
同时,MediaRecorder还提供了丰富的配置选项,可以满足不同场景下的录制需求。
# MediaRecorder的基本用法要使用MediaRecorder进行音视频录制,首先需要获取摄像头和麦克风的权限。
一般情况下,我们需要在AndroidManifest.xml文件中添加相应的权限声明:xml<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.RECORD_AUDIO" />接着,我们需要通过Camera类获取摄像头实例,并且初始化MediaRecorder:javacamera = Camera.open();mediaRecorder = new MediaRecorder();然后,我们需要设置MediaRecorder的参数,例如设置音频源、视频源、输出格式、输出文件路径等。
mediarecorder

Android的MediaRecorder框架介绍框架AndroidJNI应用服务器多线程第一部分 MediaRecorder概述Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
以开源的Android为例MediaRecorder的代码主要在以下的目录中:JAVA程序的路径:/packages/apps/SoundRecorder/src/com/android/soundrecorder/SoundRecorder.java JAVA Framework的路径:frameworks/base/media/java/android/media/MediaRecorder.javaJAVA本地调用部分(JNI):frameworks/base/media/jni/android_media_MediaRecorder.cpp这部分内容编译成为目标是libmedia_jni.so。
主要的头文件在以下的目录中:frameworks/base/include/media/多媒体底层库在以下的目录中:frameworks/base/media/libmedia/这部分的内容被编译成库libmedia.so。
多媒体服务部分:frameworks/base/media/libmediaplayerservice/MediaRecorder和MeidaPlayer使用相同的服务。
基于OpenCore部分PVAuthor是基于OpenCore的AuthorEngine的Android实现,代码在以下路径中: external/opencore/android/author这部分内容被编译成库libopencoreauthor.so。
Android媒体库框架(mediascanner)
Android平台上的媒体文件管理和桌面系统不同。
在桌面系统上,不同目录下的媒体文件呈树状结构显示给用户,用户需要进入不同目录寻找该目录下的文件。
而在Android平台上,不同目录下的媒体文件则以一层列表方式显示给用户,用户不需进入子目录就可以列出(某种类型的)所有媒体文件。
在Android上,为了实现这种模式的媒体文件管理,对所有管理的媒体文件抽取其元数据,也就是ID3(mp3文件包含的元数据可参考/wiki/ID3),存储在数据库中,并作为一个content provider提供给其他应用使用。
用户的每一次显示媒体文件的操作,就是对这个数据库的一次查询操作。
在多媒体管理模块中,主要分成三个模块:多媒体数据库MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。
这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作,多媒体数据库的使用方法和SQLITE3的方法是一样的。
MediaStore中的数据是在MediaScanner扫描后通过MediaProvider中的一个service进行更新的。
框架图如下:MediaScanner在Android系统中,多媒体库是通过MediaScanner去扫描磁盘文件,对元信息的处理,并通过MediaProvider保存到MediaStore中。
下图为MediaScannerr 框架:图1-1 MediaScanner框架流程MediaScanner可以通过手动控制,在ANDROID系统中,已经定制了三种事件会触发MediaScanner去扫描磁盘文件:ACTION_BOOT_COMPLETED、ACTION_MEDIA_MOUNTED、ACTION_MEDIA_SCANNER_SCAN_FILE。
移动应用开发中的音频和视频播放控制
移动应用开发中的音频和视频播放控制随着智能手机和平板电脑的普及,移动应用开发已成为一个热门领域。
在众多应用种类中,音频和视频播放控制是一个不可或缺的功能。
本文将探讨移动应用开发中的音频和视频播放控制的重要性、技术细节以及潜在的挑战。
音频和视频的播放控制是许多移动应用的核心功能之一。
无论是音乐播放器、视频播放器还是在线教育应用,都需要提供流畅、可靠的音频和视频播放体验。
用户希望能够随时开始、暂停、停止和调整播放进度,同时还期望能够调整音量和音频设置。
因此,在移动应用中实现优秀的音频和视频播放控制是至关重要的。
在技术实现方面,移动应用开发者可以选择使用现有的多媒体框架或开发自己的播放控制逻辑。
对于Android平台,开发者可以使用Android框架提供的MediaPlayer类来实现音频和视频播放控制。
MediaPlayer类提供了各种方法,如start()、pause()、stop()和seekTo(),以满足不同的播放需求。
此外,Android还提供了AudioManager类,用于控制音量和音频焦点。
通过这些类的组合使用,开发者可以实现丰富的音频和视频播放控制功能。
相比之下,IOS平台的实现方式略有不同。
IOS开发者可以使用AVFoundation 框架来实现音频和视频播放控制。
AVFoundation提供了强大的多媒体功能,包括播放、暂停、停止和调整播放进度。
此外,IOS还提供了MPVolumeView类来控制音量,以及MPNowPlayingInfoCenter类来显示媒体信息。
通过这些类的使用,开发者可以实现出色的音频和视频播放控制体验。
尽管有现成的多媒体框架可供使用,但在实际开发中,开发者仍然面临一些挑战。
首先是对不同音频和视频格式的支持。
不同设备和平台对音频和视频格式的支持可能各不相同,因此开发者需要确保应用能够良好地处理多种格式。
其次是网络条件的考虑。
在移动应用中,音频和视频通常是通过网络流传输的,因此网络状况的好坏直接影响着播放的流畅性。
android mediarouter用法
android mediarouter用法(实用版)目录1.Android MediaRouter 简介2.MediaRouter 的组件3.MediaRouter 的使用方法4.MediaRouter 的优点与局限性正文【Android MediaRouter 简介】Android MediaRouter 是一个用于实现多媒体路由功能的框架,可以让用户更方便地选择媒体输出设备,例如在电视或扬声器上播放音频或视频。
通过 MediaRouter,开发者可以为用户提供统一的媒体控制中心,简化媒体设备的切换操作。
【MediaRouter 的组件】MediaRouter 主要包括以下几个组件:1.MediaRouter:负责管理媒体路由,用于创建和配置MediaRouterSession。
2.MediaRouterSession:表示一个媒体路由会话,用于存储路由信息和操作媒体路由。
3.MediaRouterController:媒体路由控制器,继承自MediaAppController,用于控制媒体应用的路由。
4.MediaRouterChooser:媒体路由选择器,用于选择可用的媒体输出设备。
5.MediaRouterTransportController:媒体路由传输控制器,用于控制媒体数据传输。
【MediaRouter 的使用方法】要使用 MediaRouter,需要创建一个 MediaRouterSession,然后通过 MediaRouterController 来控制媒体路由。
以下是一个简单的示例:1.创建一个 MediaRouterSession:```javaMediaRouterSession session = new MediaRouterSession(this);```2.创建一个 MediaRouterController:```javaMediaRouterController controller = newMediaRouterController(this, session);```3.获取可用的媒体输出设备,并设置默认设备:```javaMediaRouterChooser chooser = new MediaRouterChooser();List<MediaRouterDevice> devices = chooser.getDevices();if (!devices.isEmpty()) {MediaRouterDevice defaultDevice = devices.get(0);controller.setDefaultRoute(defaultDevice);}```4.通过 MediaRouterController 来控制媒体路由,例如播放、暂停、停止等操作。
androidMediaplayer各种属性和方法简单介绍
主要涉及类:MediaPlayer(1)当一个MediaPlayer对象被创建或者调用reset()方法之后,它处于空闲状态,调用release()方法后处于结束状态1,一个MediaPlayer对象调用了reset()方法后,再调用其它方法可能会触发OnErrorListener.onError()事件,未调用reset()方法则不会触发2,当Mediaplayer对象不再被使用时,最好调用release()方法对其进行释放,使其处于结束状态,此时它不能被使用3,Mediaplayer对象被创建时(调用构造方法)处于空闲状态,若使用create()方法创建后则处于准备状态。
(2)一般情况下,一些常用的播放控制操作可能因为音频、视频的格式不被支持或者质量较差以及流超时,也有可能由于开发者的疏忽使得Mediaplayer对象处于无效状态等而导致错误。
此时可通过注册setOnErrorListener方法实现监控。
如果发生了错误,Mediaplayer对象将处于多雾状态,可以使用reset()方法来回复错误。
(3)任何Mediaplayer对象都必须先处于准备状态,然后才开始播放(4)要开始播放Mediaplayer对象都必须成功调用start()方法,可通过isPlaying()方法来检测是否正在播放(5)当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause()方法暂停播放,stop()方法停止播放。
处于暂停暂停时可通过start()方法恢复播放,但是处于停止状态时则必须先调用prepare()方法使其处于准备状态,再调用start()方法。
主要方法:Mediaplayer:构造方法create:创建一个要播放的多媒体getCurrentPosition:得到当前播放位置getDuration:得到文件的时间prepare:准备(同步)prepareAsync:准备(异步)seekTo:指定播放的位置(以毫秒为单位)setAudioStreamType:设置流媒体的类型setDataSource:设置数据来源setDisplay:设置用SurfaceHolder来显示多媒体setOnBufferingUpdateListener:网络流媒体的缓冲监听setOnErrorListener:设置错误信息监听setOnVideoSizeChangedListener:视频尺寸监听setScreenOnWhilePlaying:设置是否使用SurfaceHolder来显示setVolume:设置音量//获取sd卡上的音频文件setDataSource(“/sdcard/test.mp3”);//装载资源中的音乐MediaPlayer.create(Activity01.this,R.raw.test);//目前存在问题,不能循环解析出音频文件原因:.android_secure文件夹受保护,无法获取里面的文件信息播放视频相关类:VideoView方法说明:getBufferPercentage:得到缓冲的百分比getCurrentPosition:得到当前播放位置getDuration:得到视频文件的时间resolveAdjustedSize:调整视频显示大小setMediaController:设置播放控制器模式(播放进度条)setOnCompletionListener:当视频文件播放完时触发事件setVideoPath:设置视频源路径setVideoURI:设置视频源地址录音相关类:MediaRecorder方法说明:MediaRecorder:构造方法getMaxAmplitude:得到最大幅度setAudioEncoder:设置音频编码setAudioSource:设置音频源setCamera:设置摄像机setMaxDuration:设置最长录音时间setMaxFileSize:设置文件的最大尺寸setOutputFile:设置输出文件setOutputFormat:设置输出文件格式setPreviewDisplay:设置预览setVideoEncoder:设置视频编码setVideoFrameRate:设置视频帧的频率setVideoSize:设置视频的宽度和高度(分辨率)setVideoSource:设置视频源File类下的方法:public static File createTempFile(String prefix, String suffix, File directory) Creates an empty temporary file in the given directory using the given prefix and suffix as part of the file name.系统会自动在prefix和suffix之间加上一些数字来构建完整的文件名实现录音的一般步骤:1,实例化MediaRecorder mr,调用构造方法2,初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)3,配置DataSource:设置输出文件格式/路径,编码器等4,准备录制:mr.prepare()5,开始录制:mr.start()6,停止录制:mr.stop()7,释放资源:mr.release()注:2,3不可调换顺序添加许可:<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO"> 相机设置相关类:Camera,它是专门用来连接和断开相机服务的类Camera的几个事件:Camera.AutoFocusCallback:自动调焦功能Camera.ErrorCallback:错误信息捕捉Camera.Parameters:相机的属性参数Camera.PictureCallback:拍照、产生图片时触发Camera.PreviewCallback:相机预览设置Camera.ShutterCallback:快门设置Camera.Size:图片的尺寸Camera类没有构造方法,可通过open()方法来打开相机设备Camera类的方法介绍:autoFocus:设置自动对焦getParameters:得到相机参数open:启动相机服务release:释放相机服务setParameters:设置参数setPreviewDisplay:设置预览startPreview:开始预览stopPreview:停止预览takePicture:拍照注:takePicture方法要实现3个回调函数作为它的三个参数:Camera.ShutterCallback (快门),和两个Camera.Picture.Callback(图像数据)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
An droid 的MediaPlayer 架构介绍【IT168技术文档】本文主要介绍的是Android中很重要也最为复杂的媒体播放器( MediaPlayer)部分的架构。
对于Android这样一个完整又相对复杂的系统,一个MediaPlayer功能的实现不在其具体的功能,而是具体功能如何适应Android系统Android MediaPlayer的主要具体实现在OpenCore的Player中,这部分不是本文的关注点。
本文关注的是MediaPlayer系统的架构,其他的一些Android的应用程序也使用类似的架构。
对于开源事业在中国的发展,hanchao3c认为应该共享的不仅仅是代码,文档、设计思想、理念甚至对于技术的理解都应该得到充分的共享。
Android为中国人进入大规模的开源项目提供了很好的机遇,对于走在技术前沿的人们,不应将技术视为私有财产,而应该将自己理解更好地奉献给大众,提高大众的学习速度,从中也可以得到反馈,从而促进自己的进步。
仅以此文奉献给所有关系技术的朋友,希望可以抛砖引玉,促进我们共同的技术进步!第一部分MediaPlayer概述Android 的MediaPlayer 包含了Audio 和video 的播放功能,在Android 的界面上,Music 和Video 两个应用程序都是调用MediaPlayer实现的。
MediaPlayer 在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer 程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是An droid基本库中的Bin der 机制。
以开源的An droid为例MediaPlayer的代码主要在以下的目录中:JAVA程序的路径:packages/apps/Music/src/com/a ndroid/music/JAVA类的路径:frameworks/base/media/java/a ndroid/media/MediaPlayer.javaJAVA本地调用部分(JNI):frameworks/base/media/j ni/a ndroid media MediaPlayer.cpp 这部分内容编译成为目标是libmedia_j ni.so 。
主要的头文件在以下的目录中:frameworks/base/i nclude/media/多媒体底层库在以下的目录中:frameworks/base/media/libmedia/这部分的内容被编译成库libmedia.so 。
多媒体服务部分:frameworks/base/media/libmediaplayerservice/文件为mediaplayerservice.h 禾口mediaplayerservice.cpp这部分内容被编译成库libmedi aplayerservice.so 。
基于OpenCore的多媒体播放器部分exter nal/ope ncore/ 这部分内容被编译成库libope ncoreplayer.so 。
从程序规模上来看,libope ncoreplayer.so 是主要的实现部分,而其他的库基本上都是在其上建立的封装和为建立进程间通讯的机制。
第二部分MediaPlayer 的接口与架构2.1整体框架图MediaPlayer的各个库之间的结构比较复杂,可以用下图的表示AndroidtnflHMediaPlayer LntcrfaccVorbiscodec'1* 1J 旳 50在各个库中,libmedia.so位于核心的位置,它对上层的提供的接口主要是MediaPlayer类,类libmedia_jni.so 通过调用MediaPlayer 类提供对JAVA 的接口,并且实现了android.media.MediaPlayer 类。
libmediaplayerservice.so是Media的服务器,它通过继承libmedia.so的类实现服务器的功能,而libmedia.so 中的另外一部分内容则通过进程间通讯和libmediaplayerservice.so进行通讯。
libmediaplayerservice.so的真正功能通过调用OpenCore Player来完成。
MediaPlayer 部分的头文件在frameworks/base/include/media/ 目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/media/libmedia/ 相对应的。
主要的头文件有以下几个:IMediaPlayerClient.hmediaplayer.hIMediaPlayer.hIMediaPlayerService.hMediaPlayerlnterface.h在这些头文件mediaplayer.h提供了对上层的接口,而其他的几个头文件都是提供一些接口类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。
整个MediaPlayer库和调用的关系如下图所示:整个MediaPlayer 在运行的时候,可以大致上分成 Client 和Server 两个部分,它们分别在两个进程中 运行,它们之间使用 Binder 机制实现IPC 通讯。
从框架结构上来看,IMediaPlayerService.h 、IMediaPlayerClient.h 和 MediaPlayer.h 三个类定义了 MeidaPlayer 的接口和架构,MediaPlayerService.cpp 和 mediaplayer.coo 两个文 件用于 MeidaPlayer 架构的实现, MeidaPlayer 的具体功能在 PVPlayer (库libopencoreplayer.so )中的实现。
2.2 头文件 IMediaPlayerClient.hAndreidin?f:lA hanch-ao3<原rVFIayeiI» nd roi[i_i]iecHa_Me (Jia I'lajerI MediaPlavrr<'lien : IMtd iaPhyer ServiceMi*<linPlaytrln tvrfacvIMeditPU^rrCljent5iUn M cdiB Plain crt^liciiiEin^lodia 『1 rv ireZiHn^ledlaMMcrMrtilaII«>crSc rv in; X lie ntI MediaplayerMedinFlaysrServi ceClientServerI lI * Ik'Jui PLii> trSvr t is耶i I i i l l I i Im<'dlBphi^cr1IMediaPlayerClient.h用于描述一个MediaPlayer客户端的接口,描述如下所示:class IMediaPlayerClie nt: public lln terface{public:DECLARE_META_INTERFACE(MediaPlayerClie nt);virtual void no tify(i nt msg, int ext1, int ext2) = 0;};class BnMediaPlayerClient: public BnlnterfacevIMediaPlayerClient>{public:virtual status_t onTran sact( uin t32_t code,const Parcel& data,Parcel* reply, uin t32_t flags = 0);};在定义中,IMediaPlayerClient 类继承llnterface,并定义了一个MediaPlayer客户端的接口,BnMediaPlayerClient 继承了BnInterface<IMediaPlayerClient> ,这是为基于Android 的基础类Binder 机制实现在进程通讯而构建的。
事实上,根据Bnlnterface类模版的定义BnInterface<IMediaPlayerClient>类相当于双继承了Bnlnterface 和ImediaPlayerClient。
这是Android 一种常用的定义方式。
2.3 头文件mediaplayer.hmediaplayer.h是对外的接口类,它最主要是定义了一个MediaPlayer类:class MediaPlayer : public BnM ediaPlayerClie nt{public:MediaPlayer。
;~MediaPlayer();void onF irstRef();void disc onn ect();status_t setDataSource(c onst char *url);status_t setDataSource(i nt fd, i nt64_t offset, i nt64_t len gth);status_t setVideoSurface(c onst sp<Surface>& surface);status_t setListener(const spvMediaPlayerListener>& listener);status_t prepare();status_t prepareAs yn c();status_t start();status_t stop();status_t pause();bool isPlay in g();status_t getVideoWidth( int *w);status_t getVideoHeight(i nt *h);status_t seekTo(i nt msec);status_t getCurre ntPositi on (i nt *msec);status」 getDurati on (i nt *msec);status_t reset();status_t setAudioStreamType(i nt type);status_t setLoop in g(i nt loop);status_t setVolume(float leftVolume, float rightVolume);void no tify(i nt msg, int ext1, int ext2); staticsp<IMemory> decode(c onst char* url, uin t32_t *pSampleRate, int* pNumCha nn els);static sp<IMemory> decode(i ntuin t32_t *pSampleRate, i nt* pNumCha nn els);//……fd, in t64_t offset, in t64_t len gth,}从接口中可以看出MediaPlayer类刚好实现了一个MediaPlayer的基本操作,例如播放(start)、停止(stop)、暂停(pause)等。