0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

电子设计 作者:电子设计 2018-10-23 10:26 次阅读

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19135

    浏览量

    228931
  • 控制器
    +关注

    关注

    112

    文章

    16151

    浏览量

    177243
  • Android
    +关注

    关注

    12

    文章

    3921

    浏览量

    127088
收藏 人收藏

    评论

    相关推荐

    CEVA推出用于高能效多内核系统的AMF - Android多媒体框架

    全球领先的硅产品知识产权(SIP)平台解决方案和数字信号处理器(DSP)内核授权厂商CEVA公司针对基于Android系统推出全新低能耗软件框架,它使用异构CPU和DSP系统架构,能够有效地降低复杂多媒体应用所需的功耗。
    发表于 05-06 10:24 1625次阅读

    多媒体应用开发

    主要内容多媒体框架(MMF)客户端API音频程序开发视频程序开发摄像头使用
    发表于 03-08 22:50

    基于ARM Linux QT的掌上多媒体系统的设计和实现 (1)

    跟着人们糊口水平的进步,消费结构发生了巨大变化,消费者用于娱乐方面的支出在总支出中所占的比例正在不断扩大。掌上多媒体系统可以知足人们对于试听以及便携的需求,另外还可以实现一些其他功能,如图片浏览
    发表于 08-04 10:15

    多媒体空中鼠标

    项目说明:多媒体空中鼠标是一个集无线传输、多媒体控制、教学激光笔和传统鼠标功能于一身的创新生活作品。它摆脱了传统鼠标有数据线和必须放在平台上的命运,只要在空中摆动就可以实现指针的偏移,达到控制的目的
    发表于 10-31 18:07

    多媒体空中鼠标

    `作品进展:目前已处于调试状态,空中鼠标是利用静态重力感应来控制电脑的鼠标指针,多媒体的功能主要体现在对电脑的各个软件的控制和对家庭不同电器的控制,例如:控制PPT,控制音乐软件,控制视频播放软件
    发表于 12-15 18:15

    多媒体的FPGA实现PDF

    多媒体的FPGA实现PDF
    发表于 10-26 21:14

    采用Au1200实现多媒体播放终端设计

    终端的设计方案。 2 硬件设计 2.1 功能分析 表1对新一代网络播放终端与独立播放机进行了比较。为了实现网络远程控制播放,多媒体播放终端必须具备以下功能:1)连接服务器:启动后,自动连接远程服务器;2
    发表于 04-25 07:00

    怎么实现在嵌入式环境下使用QT多媒体框架

    要在嵌入式环境下使用QT多媒体框架,必须包含第3方多媒体库QT本身以插件的方式使用第3方多媒体库:1 插件是动态库方式,可以动态更新2 静态插件的方式,只是静态编译QT时集成插件,不可
    发表于 10-27 09:34

    ART-PI重力感应无线智能小车设计实现

    实现无线重力感应遥控小车。终极目标:发射板采用MPU6050采集陀螺仪数据,通过wifi+MQTT协议发布主题至Onenet服务器,控制板通过wifi+MQTT订阅主题,
    发表于 02-10 06:39

    HarmonyOS多媒体框架介绍

    可以通过该接口调用实现对音频数据的采集。Audio Manager提供了音频流类型、音量、音频设备管理等接口,开发者可以通过调用该接口实现对相关音频对象的管理。 以上是多媒体框架的相
    发表于 01-03 16:36

    凌阳多媒体获授权采用CEVA MM2000多媒体解决方案开发

    凌阳多媒体获授权采用CEVA MM2000多媒体解决方案开发便携式多媒体处理器 硅产品知识产权 (SIP) 平台解决方案和数字信号处理器 (DSP) 内核授权厂商CEVA公司宣布,凌
    发表于 09-16 09:59 894次阅读

    Viosoft推出针对MIPS-Based数字多媒体设计的A

    Viosoft推出针对MIPS-Based数字多媒体设计的Android采用套件 日前,Viosoft公司宣布针对MIPS-Based数字多媒体设计推出
    发表于 12-08 08:42 1203次阅读

    基于JMF的多媒体远程监控系统的设计

    首先简单介绍了多媒体远程监控系统的概念和Java多媒体框架(JMF)的优点;然后给出了多媒体远程监控系统的系统结构设计;并重点论述了实现
    发表于 09-20 16:05 15次下载
    基于JMF的<b class='flag-5'>多媒体</b>远程监控系统的设计

    软方电子:android车载多媒体终端

    Android车载多媒体终端,“硬件+软件”全套解决方案,具备很强的扩展性,丰富的免费应用,可以实现对汽车导航、信息、娱乐综合系统的深度定制。
    的头像 发表于 10-10 10:24 1926次阅读

    HarmonyOS多媒体框架介绍

    作为一款全新的面向全场景的分布式操作系统,不断创新,致力于为开发者提供更好、更高效的使用体验。接下来让我们一起学习了解下HarmonyOS中的多媒体框架的相关知识吧! 多媒体框架介绍结
    的头像 发表于 12-30 19:15 735次阅读