opencore Init的调用流程

本文详细介绍了Opencore框架中播放媒体文件的节点组合原理,特别是针对MP3和WAV的播放。重点讲解了实现sourcenode的最小接口,包括PVMF_TRACK_SELECTION_INTERFACE_UUID,PVMF_DATA_SOURCE_INIT_INTERFACE_UUID和PvmfDataSourcePlaybackControlUuid。通过实例展示了如何处理H264码流的播放,解释了节点注册、查询和初始化过程,以及PVPlayerEngine的关键函数如AddDataSource和Init的调用流程。

      在Opencore框架下要播放一个媒体文件或者流媒体数据,是通过将对应的各个功能的node组合起来实现的,例如对于MP3播放,共有三种node:PVMP3FFparserNode,PVOMXAudioDecNode,PVMediaIONode他们分别完成Mp3文件解析,Mp3数据解码,Pcm声音播放的功能,opencore框架将这些node连接在一起,完成MP3播放的数据应用。而如果是播放WAV,则只有2个node被创建:

PVWavFFParserNode, PVMediaIONode,因为wav文件中直接读取的就是PCM数据,不用进行解码。因此2个node足够完成整个的功能。

     在 第二章:第三节:PVPlayerEngine的实现 中,我简要描述了PVPlayerEngine实例在运行过程中要进行的动作。其中简要描述了datasource在整个的PVPlayerEngine的实例中作用的过程。这里将详细datasource所起的作用,如何进行初始化,如何辨认其中的track。

      本文包含以下内容:实现一个sourcenode的最少接口,sourcenode在Player这些接口在一个player session的生命周期中会如何被调用。以及给出一个简单的H264码流的播放的example node的代码。本文也将围绕如何实现这样一个简单的sourcenode来展开描述。

 

      实现一个sourcenode必须实现的接口:PVMF_TRACK_SELECTION_INTERFACE_UUID, PVMF_DATA_SOURCE_INIT_INTERFACE_UUID, PvmfDataSourcePlaybackControlUuid。

也就是,你如果要实现自己的sourcenode类的话,必须继承以下类:

PVMFDataSourceInitializationExtensionInterface,

PVMFTrackSelectionExtensionInterface,

PvmfDataSourcePlaybackControlInterface,

否则,opencore会认为你的sourcenode类不是一个合法的sourcenode,无法完成PVPlayerEngine::Init或者PVPlayerEngine::Prepare动作。

 

     在 第 二章:第三节:PVPlayerEngine的实现 一文中提到,对于PVPlayerEngine::AddDataSoure这个动作过程中有个FormatRecognizer的过程,用来识别文件媒体类型,为了简化描述,我们这里默认后缀名为264的文件就是我们要播放的码流。

Playerengine 中,只有对 PVMF_MIME_FORMAT_UNKNOWN 的格式才用 formatrecognizer 来进行识别,并创建合适的 sourcenode 。那么在函数 PlayerDriver::handleSetDataSource 中,可以改变一下,比如可以判断一下文件名后缀,如果是 .264 ,那么就调用 mDataSource->SetDataSourceFormatType((const char*) PVMF_MIME_H264_VIDEO_RAW) ;那么等调用到函数 PVPlayerEngine::DoAddDataSource 以后,由于 iSourceFormatType 已经判断为: PVMF_MIME_H264_VIDEO_RAW ,那么将直接调用到函数 DoSetupSourceNode ,这个函数将调用

iPlayerNodeRegistry.QueryRegistry(iSourceFormatType, outputformattype, foundUuids) 来查找符合要求的 sourcenode iPlayerNodeRegistry 是一个注册器,系统中所有的 node 都将注册到其中,在需要的时候提供查询这里采用的是静态注册的方式, opencore 还提供一种动态库注册的方式,以后再提及。

注册所有 node 的函数实现在文件 engines/player/config/core / pv_player_node_registry_populator.cpp   中,函数来实现的 PVPlayerRegistryPopulator::RegisterAllNodes ,在函数的最后添加上如下代码:

nodeinfo.iInputTypes.clear();

    nodeinfo.iInputTypes.push_back(PVMF_MIME_H264_VIDEO_RAW);

    nodeinfo.iNodeUUID = KPVMFH264FFParserNodeUuid;

    nodeinfo.iOutputType.clear();

    nodeinfo.iOutputType.push_back(PVMF_MIME_H264_VIDEO_MP4);

nodeinfo.iNodeCreateFunc = PVMFH264FFParserNodeFactory::CreatePVMFH264FFParserNode;

nodeinfo.iNodeReleaseFunc = PVMFH264FFParserNodeFactory::DeletePVMFH264FFParserNode;

aRegistry->RegisterNode(nodeinfo); <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值