采用Android多媒体框架实现重力感应

2022-04-09 12:44:10诸宜韦
导读 大家好,我是本期栏目编辑小友,现在为大家讲解采用Android多媒体框架实现重力感应问题。 Android这个词的本义是指“机器人”,也是谷歌在2

大家好,我是本期栏目编辑小友,现在为大家讲解采用Android多媒体框架实现重力感应问题。

Android这个词的本义是指“机器人”,也是谷歌在2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,号称是第一个真正面向移动终端的开放完整的移动软件。目前最新的版本是安卓2.4姜饼和安卓3.0蜂巢。安卓是基于Linux内核的操作系统,是谷歌在2007年11月5日公布的移动操作系统。它采用软件栈(也称为软件栈)的架构,主要分为三个部分。底层的Linux内核只提供基本功能,其他应用软件都是公司自己开发的,有些程序是用Java编写的。我们可以通过本文介绍的安卓开放核心的源代码解读来详细分析这方面的基础知识。

重力感测装置包括感应器、处理器和控制器。传感器负责检测存储器的状态,计算存储器的重力加速度值;处理器判断加速度值是否超过安全范围;控制器负责控制磁头从安全停车区的锁定或释放。一旦传感器检测到,处理器判断当前重力加速度超过安全值,控制器就会通过硬件控制磁头停止读写,快速回到位置,锁定在专属磁头停放区。这一系列动作将在200毫秒内完成。当传感器检测到加速度值回到正常范围时,产品将不再工作。

Android开放内核的代码在以下目录:external/opencore/。该目录是Android open core的根目录,包含如下子目录:

*安卓:这是一个上层库,基于PVPlayer和PVAuthor的SDK为安卓实现了一个Player和Author。

* baselibs:包含数据结构和线程安全性的基础库。

* codecs_v2:这是一个内容非常丰富的库,主要包括codec的实现和OpenMAX的实现。

*引擎:包括PVPlayer和PVAuthor引擎的实现。

* extern_libs_v2:包含khronos的OpenMAX的头文件。

* fileformats:文件格式的数据解析器类。

*节点:编解码器和文件解析的每个节点类。

* oscl:操作系统兼容性库

* pvmi:输入输出控制的抽象接口

*协议:主要涉及RTSP、RTP、HTTP等与网络相关的协议

* PV common : PV common库文件的Android.mk文件没有源文件。

* pvplayer : pvplayer库文件的Android.mk文件没有源文件。

* pvauthor : pvauthorlibrary文件的Android.mk文件没有源文件。

* tools_v2:编译工具和一些可注册的模块。

拆分器的定义和初始化

以wav的分路器为例。在fileformats目录中,有一个解析WAV文件格式的文件PVwavfileparser.cpp。在nodes目录中,有PVMF _ waffparser _ factory.cpp、PVMF _ waffparser _ node.h、PVMF _ waffparser _ port.h等文件。

从下到上,我们可以看到vwavfileparser.cpp中的PV_Wav_Parser类有解析Wav格式的成员函数,比如InitWavParser()、GetPCMData()、RetrieveFileInfo()等。这个类应该是最终的解析类。当我们搜索PV_Wav_Parser类的使用位置时,可以看到在PVMFWAVFFParserNode类中有一个PV_Wav_Parser的指针成员变量。

搜索显示pvmfwaffparsernode类是由PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是通过PVPlayerNodeInfo类在Oscl_vector的Vector中注册的,该类位于PVPlayerNodeInfo:pvplayernoderegistry()类的构造函数中。在这个构造器中,还注册了AMR、mp3等节点。

从上面可以看出,Android Opencore中拆分器的管理类似于ffmpeg,ffmpeg是在框架初始化时注册的,只不过Opencore注册了每个拆分器的工厂功能。

总结拆分器的定义和初始化过程:

每个拆分器在fileformats目录下都有一个对应的子目录,下面有自己的解析类。

每个拆分器都与节点目录下对应的子目录相关联,并且在它下面有自己的统一接口。

的node类和node factory类。

播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。

在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector iType成员变量中。

当前Splitter的匹配过程

PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid.

从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:

android_media_MediaPlayer.c++pp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数

1.{“setDataSource”, “(Ljava/lang/String;)V”, (void *)

android_media_MediaPlayer_setDataSource},

2.static void android_media_MediaPlayer_setDataSource

(JNIEnv *env, jobject thiz, jstring path)

此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径

3.status_t MediaPlayer::setDataSource(const char *url)

此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const sp& service(getMediaPlayerService());

然后新建一个IMediaPlayer变量, sp player(service-》create(getpid(), this, fd, offset, length));

在sp MediaPlayerService::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实例。

以上就是对Android多媒体框架的源代码的解读。

Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread和Android 3.0 Honeycomb.Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。我们可以通过本文介绍的Android多媒体框架的源码解读,来具体分析一下这方面的基本知识。

重力感应装置包括感应器、处理器和控制器三个部分。感应器负责侦测存储器的状态,计算存储器的重力加速度值;处理器则对加速度值是否超出安全范围进行判断;而控制器则负责控制将磁头锁定或者释放出安全停泊区。一旦感应器侦测并经处理器判断当前的重力加速度超过安全值之后,控制器就会通过硬件控制磁头停止读写工作,并快速归位,锁定在专有的磁头停泊区。这一系列动作会在200毫秒内完成。当感应装置探测到加速度值恢复到正常值范围之后,产品才会恢复工作。

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 的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。

由上可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。

综述一下splitter的定义与初始化过程:

每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。

每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。

播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。

在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_Vector iType成员变量中。

当前Splitter的匹配过程

PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid.

从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:

android_media_MediaPlayer.c++pp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数

1.{“setDataSource”, “(Ljava/lang/String;)V”, (void *)

android_media_MediaPlayer_setDataSource},

2.static void android_media_MediaPlayer_setDataSource

(JNIEnv *env, jobject thiz, jstring path)

此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径

3.status_t MediaPlayer::setDataSource(const char *url)

此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const sp& service(getMediaPlayerService());

然后新建一个IMediaPlayer变量, sp player(service-》create(getpid(), this, fd, offset, length));

在sp MediaPlayerService::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实例。

以上就是对Android多媒体框架的源代码的解读。

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content: "广告"; } .dfma img { display: block; }
免责声明:本文由用户上传,如有侵权请联系删除!