联系我们 分类
Android重力感应实现方式简介-银河163发布日期:2024-02-01 浏览次数:
本文摘要:Android中对于图形界面以及多媒体的涉及操作者较为更容易构建。

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

本文来源:银河163-www.maishengdp.cn

官方微信关闭