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 的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.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& 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多媒体框架的源代码的解读。

时间: 2024-10-17 09:33:31

Android重力感应实现方式简介的相关文章

Android重力感应示例

android中的很多游戏的游戏都使用了重力感应的技术,就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的 方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴 朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10): 手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z )的值分别为(0,0,-10): 手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,0): 手机竖直(y轴朝天)向上的时候,(x,y,z)的值分别为(0,10,0)

Android数据的存储方式简介

作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放于"data/data/程序包名"目录下,所以要实现数据共享,正确方式是使用Content Provider. SQLite SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式.Android为此数据库

Android编程之重力感应用法分析_Android

本文实例讲述了Android编程之重力感应用法.分享给大家供大家参考,具体如下: 重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉.还是得根据真机的实际情况来做开发,下面主要讨论加速度传感器的具体实现方式,传感器名称如下: 加速度传感器(accelerometer) 陀螺仪传感器(gyroscope) 环境光照传感器(light)

Android编程实现的重力感应示例代码_Android

本文实例讲述了Android编程实现的重力感应效果.分享给大家供大家参考,具体如下: android中的很多游戏的游戏都使用了重力感应的技术,就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10): 手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10): 手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,

Android 重力传感器在游戏开发中的应用_Android

      手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.        一.何为传感器        所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.        二.Android提供了哪些传感器        1.加速度传感器(重力传感器)        2.陀螺仪传感器        3.光传感器        4.恒定磁场传感器       

3月7日蚕豆网不推荐的Android应用:《重力感应球》

前言:如雨后春笋般杂乱滋生的Android app遍布于网络中.下载平台中.用户的手机中,目前由于监管不严.开放性过大这些应用的安全性便成了当前Android手机最大问题.通讯录被复制.私人照片丢失.信息被公开等等事件的出现,其罪魁祸首当属那些存在安全隐患.内藏恶意代码的Android手机应用.鉴于此情况, 蚕豆网联合<安全管家>定期为大家审查Android应用的安全性,尽我们最大力量来帮助用户来认清app.选择app,把最安全.最稳定的Android环境奉献给广大用户.应用名称:<重力

Android基于Sensor感应器获取重力感应加速度的方法_Android

本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法.分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器... 很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器 一 介绍Sensor类 SDK只有一句介绍"Class representing a

Android基于Sensor感应器获取重力感应加速度的方法

本文实例讲述了Android基于Sensor感应器获取重力感应加速度的方法.分享给大家供大家参考,具体如下: FETC项目指导老师提出了新的需求,想要在游戏地图中表现出用户用户当期移动的方向,再用GPS的话显然很不靠谱,所以想到了android强大的感应器... 很多移动设备都内置了感应器,android通过Sensor和SensorManager类抽象了这些感应器,通过这些类可以使用android设备的传感器 一 介绍Sensor类 SDK只有一句介绍"Class representing a

Android编程实现的重力感应示例代码

本文实例讲述了Android编程实现的重力感应效果.分享给大家供大家参考,具体如下: android中的很多游戏的游戏都使用了重力感应的技术,就研究了一下重力感应 以屏幕的左下方为原点,箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象以下情形: 手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10): 手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10): 手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(10,0,