代码结构:
Open Core 的代码在Android 代码的 External/Opencore 目录中 。这个目录是OpenCore 的根目录,其中包含的子目录如下所示 :
-
android :这里面是一个上层的库,它实现了一个为Android 使用的音视频采集,播放的接口,和DRM 数字版权管理的接口实现。
-
baselibs :包含数据结构和线程安全等内容的底层库
-
codecs_v2 :音视频的编解码器,基于 OpenMAX 实现
-
engines :核心部分 ,多媒体 引擎的实现
-
extern_libs_v2 :包含了 khronos 的 OpenMAX 的头文件
-
fileformats :文件格式的解析( parser )工具
-
nodes :提供一些PVMF 的NODE ,主要是编解码和文件解析方面的。
-
oscl :操作系统兼容库
-
pvmi : 输入输出控制的抽象接口
-
protocols :主要是与网络相关的 RTSP 、 RTP 、 HTTP 等协议 的相关内容
-
pvcommon : pvcommon 库文件的 Android.mk 文件,没有源文件。
-
pvplayer : pvplayer 库文件的 Android.mk 文件,没有源文件。
-
pvauthor : pvauthor 库文件的 Android.mk 文件,没有源文件。
-
tools_v2 :编译工具以及一些可注册的模块。
本文主要介绍Android MediaPlayer的架构,主要由OpenCore 里的PV Player来实现的。
1.概述
Android的MediaPlayer包含了Audio和Video的播放功能,Music和Video两个应用程序都是调用MediaPlayer实现的。
代码主要分布在以下的目录中:
JAVA程序的路径:
packages/apps/Music/src/com/android/music/
JAVA类的路径:
frameworks/base/media/java/android/media/MediaPlayer.java
JAVA本地调用部分(JNI):
frameworks/base/media/jni/android_media_MediaPlayer.cpp
编译为 libmedia_jni.so
头文件:
frameworks/base/include/media/
多媒体库:
frameworks/base/media/libmedia/
编译为 libmedia.so
多媒体服务:
frameworks/base/media/libmediaplayerservice/
编译为 libmediaplayerservice.so
具体实现:
external/opencore/
编译为 libopencoreplayer.so
libopencoreplayer.so是主要的实现部分,其他的库基本上都是在其上建立的封装和为建立进程间通讯的机制。
2.框架
在各个库中,libmedia.so位于核心的位置,它对上层的提供的接口主要是MediaPlayer类,libmedia_jni.so通过调用MediaPlayer类提供对JAVA的接口,并且实现了android.media.MediaPlayer类。
libmediaplayerservice.so是Media的服务器,它通过继承libmedia.so的类实现服务器的功能,而libmedia.so中的另外一部分内容则通过进程间通讯和libmediaplayerservice.so进行通讯。libmediaplayerservice.so的真正功能通过调用PV Player来完成。
MediaPlayer部分的头文件在frameworks/base/include/media/目录中,这个目录是和libmedia.so库源文件的目录frameworks/base/media/libmedia/相对应的。主要的头文件有以下几个:
IMediaPlayer.h
IMediaPlayerClient.h
IMediaPl