当前位置:首页>> Android重力感应实现方式简介

Android重力感应实现方式简介

发布时间:2016-03-26作者:智汇小新

  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类和node factory类。

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

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

  当前Splitter的匹配过程

  PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType& aInputType, PVMFFormatType& aOutputType, Oscl_Vector《PVUuid, OsclMemAllocator》& aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的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.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《IMediaPlayerService》& service(getMediaPlayerService());

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

  在sp《IMediaPlayer》 MediaPlayerService::create(pid_t pid, const sp《IMediaPlayerClient》& client, const char* url)中

  调status_t MediaPlayerService::Client::setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。

  在MediaPlayerService::Client::setDataSource中,调sp《MediaPlayerBase》 MediaPlayerService::Client::createPlayer(player_type playerType)

  生成一个继承自MediaPlayerBase的PVPlayer实例。

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

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1