Android中对于图形界面以及多媒体的涉及操作者较为更容易构建。而且对于大多数手机用户来说,他们主要也就是根据这些方面的功能来对系统那个展开改动。我们可以通过本文讲解的Android多媒体框架的源码理解,来具体分析一下这方面的基本知识。 Android多媒体框架的代码在以下目录中:external/opencore/。
这个目录是Android多媒体框架的根目录,其中包括的子目录如下右图: *android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK构建了一个为Android用于的Player和Author。 *baselibs:包括数据结构和线程安全性等内容的底层库 *codecs_v2:这是一个内容较多的库,主要包括编解码的构建,以及一个OpenMAX的构建 *engines:包括PVPlayer和PVAuthor引擎的构建 *extern_libs_v2:包括了khronos的OpenMAX的头文件 *fileformats:文件格式的据明确解析(parser)类 *nodes:编解码和文件解析的各个node类。 *oscl:操作系统相容库 *pvmi:输入输出掌控的抽象化模块 *protocols:主要是与网络涉及的RTSP、RTP、HTTP等协议的涉及内容 *pvcommon:pvcommon库文件的Android.mk文件,没源文件。
*pvplayer:pvplayer库文件的Android.mk文件,没源文件。 *pvauthor:pvauthor库文件的Android.mk文件,没源文件。
*tools_v2:编译器工具以及一些可登记的模块。 Splitter的定义与初始化 以wav的splitter为事例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录上有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h,pvmf_wavffparser_port.h等文件。 我们由底往上看,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《PVPlayerNodeInfo,OsclMemAllocator》的vector中,在这个构造函数中,AMR,mp3等node也是某种程度被登记的。 由上由此可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似于,都是在框架的初始化时登记的,只不过Opencore登记的是每个splitter的factory函数。
综述一下splitter的定义与初始化过程: 每个splitter都在fileformats目录下有个对应的子目录,其上有各自的解析类。 每个splitter都在nodes目录下有关对应的子目录,其上有各自的统一模块的node类和nodefactory类。 播出引擎PVPlayerEngine类中有PVPlayerNodeRegistryiPlayerNodeRegistry成员变量。 在PVPlayerNodeRegistry的构造函数中,将AMR,AAC,MP3等splitter的输出与输入类型标明和nodefactory类中的createnode与releasedelete模块通过PVPlayerNodeInfo类push到Oscl_Vector《PVPlayerNodeInfo,OsclMemAllocator》iType成员变量中。
当前Splitter的给定过程 PVMFStatusPVPlayerNodeRegistry::QueryRegistry(PVMFFormatTypeaInputType,PVMFFormatTypeaOutputType,Oscl_Vector《PVUuid,OsclMemAllocator》aUuids)函数的功能是根据输出类型和输入类型,在已登记的nodevector中找寻否有给定的node,有的话传到其唯一辨识标识PVUuid。 从QueryRegistry这个函数至底向上搜寻可获得,在android中splitter的给定过程如下: android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时寻找对应的c++函数 1.{setDataSource,(Ljava/lang/String;)V,(void*) android_media_MediaPlayer_setDataSource}, 2.staticvoidandroid_media_MediaPlayer_setDataSource (JNIEnv*env,jobjectthiz,jstringpath) 此函数中再行获得当前的MediaPlayer实例,然后调用其setDataSource函数,起源于路径 3.status_tMediaPlayer::setDataSource(constchar*url) 此函数通过调getMediaPlayerService()再行获得当前的MediaPlayerService,constsp《IMediaPlayerService》service(getMediaPlayerService()); 然后新建一个IMediaPlayer变量,sp《IMediaPlayer》player(service-》create(getpid(),this,fd,offset,length)); 在sp《IMediaPlayer》MediaPlayerService::create(pid_tpid,constsp《IMediaPlayerClient》client,constchar*url)中 调status_tMediaPlayerService::Client::setDataSource(constchar*url)函数,Client是MediaPlayerService的一个内部类。
在MediaPlayerService::Client::setDataSource中,调sp《MediaPlayerBase》MediaPlayerService::Client::createPlayer(player_typeplayerType) 分解一个承继自MediaPlayerBase的PVPlayer实例。 以上就是对Android多媒体框架的源代码的理解。
本文来源:银河163-www.maishengdp.cn