目录结构

OpenCore的代码在如下目录中:external/opencore/。这个目录是OpenCore的根目录,其中包含的子目录以下所示:

* 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也是一样被注册的。

由上可知,Opencore中对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++函数

{"setDataSource", "(Ljava/lang/String;)V", (void *)android_media_MediaPlayer_setDataSource},

static void android_media_MediaPlayer_setDataSource(JNIEnv *env, jobject thiz, jstring path)

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

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实例,

PVPlayer的继承关系以下:

PVPlayer-->MediaPlayerInterface-->MediaPlayerBase

最后调PVPlayer的setDataSource()函数

status_t PVPlayer::setDataSource(const char *url)

status_t PVPlayer::prepare()

此函数开头执行ret = mPlayerDriver->enqueueCommand(new PlayerSetDataSource(mDataSourcePath,0,0));

将PlayerSetDataSource 的command类加入到PlayerDriver的command处理队列中,

在void PlayerDriver::Run()函数中处理此command,调用下面的handleSetDataSource函数。

void PlayerDriver::handleSetDataSource(PlayerSetDataSource* ec)

PVCommandId PVPlayerEngine::AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData)

This function allows a player data source to be specified for playback. This function must be called

PVMFStatus PVPlayerEngine::DoAddDataSource(PVPlayerEngineCommand& aCmd)

PVMFStatus PVPlayerEngine::DoSetupSourceNode(PVCommandId aCmdId, OsclAny* aCmdContext) java

以上,是前辈摸索出的一条线索,可是不全面,至少对我如今的工做来讲如此.node

其以WAV格式为突破口,止步于CreatePVMFWAVFFParserNode().最后这段代码位置是在 external/opencore/engines/player/config/linux_nj/pv_player_node_registry.cpp中.linux

咱们已经知道3gp格式是支持的,可是android代码中并无明确的有关3gp的文件解析node或者代码,在PVPlayer的方法中enqueueCommand(),再在playerdriver的Run()中,dequeueCommand()而且根据command->code(),作相应的操做.android

其中就有handleSetDataSource(),这个方法看上去与文件格式解析相关.c++

handleSetDataSource()中会调用pv_player_engine.cpp中的AddDataSource()方法,发出一个Command:“PVP_ENGINE_COMMAND_ADD_DATA_SOURCE”到队列中,数组

接着在Run()中的switch(...)语句中,执行DoAddDataSource(),在这里安全

if(iSourceFormat=SOURCEFORMAT_UNKNOWN)网络

{数据结构

retval = DoQuerySourceFormat(...);

}

else

{

...

}

在DoQuerySourceFormat()中,参数iPlayerRecognizerRegistry闪亮登场,其类型为PVPlayerRecognizerRegistry,经过

iPlayerRecognizerRegistry.QueryFormatType(iDataSource->GetDataSourceURL(), *this, (OsclAny*) context));

在QueryFormatType()中,会使用传入的文件路径建立一个PVMIDataStreamSyncInterfaceRefFactory对象,并强制转换成PVMFDataStreamFactory*.再使用PVMFRecognizerRegistry::Recognize(iRecSessionId, *iFileDataStreamFactory, NULL, iRecognizerResult, NULL);它会继续向下调用PVMFRecognizerRegistryImpl::Recognize(...),将参数保存,再生成一个CMD:PVMFRECREG_COMMAND_RECOGNIZE,再在PVMFRecognizerRegistryImpl::Run()中,经过switch(...)执行doRecognize().

能够理解为全部解析的node都保存在iRecognizerPluginFactoryList中,再在doRecognaize()中遍历,以得到合适的node(I am not sure!XD)

如下能够忽略

/*******************************************************************************************

初始化位置是在PVPlayerEngine::PopulateRecognizerRegistry(...)中,这个函数是被PopulateAllRegistries(...)调用,而PopulateAllRegistries(...)在PlayerEngine的Construct()中调用,而且其在调用PopulateRecognizerRegistry(...)以前,还会调用一个PopulateNodeRegistry(...),暂且把PopulateAllRegistries(...)放下不谈,回到PopulateRecognizerRegistry(...)中,首先经过读取config文件(/system/etc/pvplayer.conf),将其中与PV_RECOGNIZER_INTERFACE相同Uuid的动态库加载进来...(这里为何会指定一个Uuid呢?这个Uuid在config文件中对应的正是 libopencoremp4reg.so,也就是说,格式为UNKNOWN的,都用这个库来识别?...继续看). 这个库自己就是opencore的一个node,生成它的Android.mk位于"external/opencore/tools_v2/build/modules/linux_mp4/node_registry",能够看出,他其实就是nodes/pvmp4ffparsernode,到此,文件解析的动态库也已加载.明天来继续往下看,今天再温习一下流程,思索下...

*********************************************************************************************/

好吧,其实android 1.5不支持.MP4的现象是由于个人.mp4文件的声音部分是用的aac编码,而android自己只支持wav的音频编码...so,虽然可以识别出是video/mp4,可是却会致使播放器die(由于个人播放器没作纠错)

android 播放视频文件格式,Android视频文件格式解析相关分析相关推荐

  1. android 播放静态mp4,Android 使用VideoView播放MP4的简单实现

    使用VideoView播放MP4 播放示例 实现简单的播放功能,播放手机本地的MP4文件.不依赖任何第三方框架,不添加任何防腐剂. 添加一个系统自带的控制条. 申请权限 读取存储中的MP4文件 准备布 ...

  2. android 播放器封装,Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏、小窗视频播放器,附项目源码...

    原标题:Android视频播放最全总结:MediaPlayer+TextureView封装一个完美实现全屏.小窗视频播放器,附项目源码 作者:xiaoyanger 来源:http://www.jian ...

  3. android 播放器音量,Android应用实例之调节播放器音量——AudioManager的应用

    实现的功能:调节播放器音量. 实现的思路:1)用ProgressBar显示当前音量大小: 2)在Button单击事件中改变音量大小: 3)关键是用什么控制音量,百度了一下可以用AudioManager ...

  4. android播放系统音效,Android用SoundPool播放音效

    SoundPool可以用来播放一些较短的音效,如一些信息提醒之类的 先来说下会用到的参数 SoundPool(int maxStreams, int streamType, int srcQualit ...

  5. 开博尔android播放器,双核ANDROID网络播放器-开博尔C9-开箱 + 评测

    本帖最后由 ycchen226 于 2013-3-29 16:14 编辑 C9界面交互: C9的最大亮点 我认为是这个界面UI的设计 nEO_IMG_DSC00516.jpg (98.07 KB, 下 ...

  6. android播放mp3功能,Android编程实现播放MP3功能示例

    本文实例讲述了android编程实现播放mp3功能.分享给大家供大家参考,具体如下: 在android中播放mp3非常简单,也是项目中经常使用的,比如说要做项目的背景音乐,应用中某些功能的提示音等的. ...

  7. android播放器实例,android音乐播放器实例

    郑州app开发android音乐播放器实例.布局代码是一个imagebutton和seekbar. 下面是java代码 MainActivity.java package cn.xhhkj.music ...

  8. android 播放mp3 倒计时,Android实战 - 音心播放器 (MusicActivity - 倒计时 ,进度条实现)...

    1.背景 还是音乐播放界面,实现倒计时和进度条功能,基本实现过程: 当打开MusicActivity 的时候,MusicService会发送广播给MusicActivity ,后开始当前播放的时间进度 ...

  9. android 播放短铃声,Android使用SoundPool播放短音效

    前言 对于Android播放一些简短音效,例如提示音,或者铃声,相对于使用MediaPlayer,SoundPool可以节省更多资源,并且可以同时播放多个音效,而且可以针对不同音效设置不同播放品质 实 ...

  10. android播放mp3功能,Android Studio实现简单音乐播放功能的示例代码

    项目要求 基于Broadcast,BroadcastReceiver等与广播相关的知识实现简单的音乐播放功能,包括音乐的播放.暂停.切换.进度选择.音量调整. 设计效果 (进度条时间刷新功能还没有实现 ...

最新文章

  1. HitFilm Pro 12中文版
  2. hive建表映射到hbase
  3. debian linux系统下载工具,Debian For Linux
  4. VTK:Medical之GenerateModelsFromLabels
  5. SELECT 与 SET 对变量赋值的区别(存储过程)
  6. 使用Eclipse的Working Set管理项目
  7. 不生成Excel文件,将Datatable数据 Response.write 输出生成Excel (转载)
  8. 浅析机关单位人力资源内部控制
  9. 达梦数据库远程网页访问
  10. 聚类尝试-kmeans-step1数据预处理
  11. 随手笔记之逆序输出数字
  12. 云计算1+X平台运维与开发认证(初级)操作题详解
  13. 世界空战史上的头号王牌空中杀手
  14. Rocketmq broker迁移方案
  15. 使用.net core ABP和Angular模板构建博客管理系统(实现博客列表页面)
  16. SQL注入POST注入
  17. 温室大棚控制系统智能轻松种菜
  18. 全国世界城市列表API接口,免费好用
  19. 小程序抽奖老虎.机实现原理
  20. 沙尘暴ppt计算机,沙尘暴课件.ppt

热门文章

  1. 上门洗车软件的核心功能和技术选型
  2. 阿里云服务器1核1G内存1M带宽能放几个网站及多少流量
  3. 为什么sqlserver创建存储过程成功,却找不到这个存储过程呢
  4. 用huggingface.transformers在文本分类任务(单任务和多任务场景下)上微调预训练模型
  5. linux下搜狗拼音隐藏悬浮状态栏
  6. 媒体邀约展会展览发布会新品发布企业邀请媒体官方直播媒体
  7. 扫描文件转换成word软件
  8. linux系统手柄模拟器下载,Switch Amiibo模拟器(Windows|Linux PC + JoyControl + Bluetooth)...
  9. pve安装黑群晖直通硬盘_Promox VE(PVE)安装虚拟黑群晖实现硬盘休眠避坑指南
  10. php动态执行生成条码,PHP生成条形码 之二 开源之道