您的位置:华清远见教育科技集团 >> Android资料 >> Android OpenCORE多媒体引擎  
 
Android OpenCORE多媒体引擎
分享到:

在《Android PVPlayer引擎的实现》一文中我们重点介绍了PVPlayerInterface播放引擎的实现过程,今天要学习的是OpenCORE中另外两种媒体引擎:记录引擎(PVAuthor Engine)和双向引擎(PV2way Engine)。

PVAuthorEngineInterface记录引擎

在记录引擎中,对音频、视频文件均提供了记录支持,其客户端可以分为两种类型:上层应用和适配器。其中适配器客户端作用在于将记录引擎的接口映射为其他框架或者应用所需的特定接口。

记录引擎支持的数据源包括摄像头、麦克风,甚至未经编码的元数据流等。经过记录引擎处理,源数据流会被编码为客户端指定的数据格式。

客户端通过PVAuthorEngineInterface、PVErrorEventObserver、PVInformationalEvent Observer、PVCommandStatusObserver等观察器来接受命令、状态信息和错误信息等。记录引擎的实现位于external\opencore\engines\author目录下,下图显示的是记录引擎的类图。

PVAuthor类继承关系图
PVAuthor类继承关系图

在记录引擎中,状态之间的变迁同样是通过状态机控制的,其状态包括PVAE_STATE_IDLE、PVAE_STATE_OPENED、PVAE_STATE_INITIALIZED、PVAE_STATE_ RECORDING、PVAE_STATE_PAUSED、PVAE_STATE_ERROR等,下图显示了记录引擎中的状态跃迁。

PVAuthor引擎状态图
PVAuthor引擎状态图

当执行多媒体记录时,首先要创建一个记录引擎,然后添加数据源。具体的执行过程如下图所示。

PVAutoor执行过程图
PVAutoor执行过程图

在添加完数据源后,还需要选择组合器和添加MediaTrack,才方能开始媒体记录。

CPV2WayInterface双向引擎

随着芯片处理能力和无线带宽的提高,3G技术得到不断推广,视频电话逐渐走进普通用户的视野。为了支持视频电话业务,在OpenCORE中,提供了依赖于平台的多媒体双向引擎,对H.324M(3G-324M在H.324M基础上指定了H.263作为强制基本标准,而把MPEG-4作为视频编码推荐标准,AMR作为音频编码强制标准,主要用于无线网络)、H.323(主要用于有线互联网,无QoS保障)、SIP(侧重NGN网络)等主流视频电话协议栈都提供了支持。

在3G移动终端中,通常采用的是3G-324M协议栈,目前拥有3G-324M协议栈核心技术的厂商主要有达丽星(Dilithium)、锐迪讯(Radvision)等。

随着无线移动网络进一步朝着IP化的方向演进和基于3G-324M协议栈控制复杂等缺陷方面的考虑,在3GPP R5版本中,正式引入了基于SIP协议族的多媒体子系统(IMS, IP Multimedia Subsystem),使基于SIP的移动视频通话业务成为可能。

双向引擎的输入数据可以有麦克风、摄像头等,输出数据源有显示屏、扬声器等。数据源和数据槽均由以应用或者适配层的形式存在的客户端添加。

客户端利用工厂类CPV2WayEngineFactory或者CPV2WayProxyFactory来获得一个继承CPV2WayInterface接口的双向引擎的引用(在目前的版本中,双向引擎为CPV324m2Way)。另外,客户端还必须实现双向引擎的观察者接口(PVCommandStatusObserver、PVInformationalEventObserver、PVErrorEventObserver),以获得收到命令完成情况、状态信息和错误信息的途径,并将这些接口传递给双向引擎。

客户端还应基于PV2WayMIO类或PVMFNodeInterface接口实现双向引擎所需的数据源和数据槽,数据源和数据槽在实现上都是基于Oscl_Vector向量的。客户端会通过CPV2WayInterface接口执行视频会话过程中的相关操作,如初始化、添加数据源、添加数据槽、连接、暂停、恢复、断连等。双向引擎的实现位于external\opencore\engines\2way目录下,下图所示为双向引擎的主要类的继承关系图。

PV2Way类继承关系图
PV2Way类继承关系图

在目前的设计中,OpenCORE的双向引擎内置了7种状态:空闲(EIdle)、初始化(EInitializing)、建立(ESetup)、连接中(EConnecting)、已连接(EConnected)、断连中(EDisconnecting)、重设(EResetting)。

其中“EIdle”状态模式为双向引擎对象的初创状态,尚没有任何资源被分配。

在“EInitializing”状态下,引擎尝试获得可用的设备资源(如编解码、内存等),准备接受建立参数和视频连接。如果成功,则引擎状态转换为“ESetup”状态,如果失败,则释放已请求成功的资源,转换为“EIdle”状态。

在收到编码、复用、捕获能力、渲染能力等建立参数的过程中,引擎处于“ESetup”状态,在引擎状态转换为“EConnecting”状态之前,有效的数据源和数据槽应被添加到双向引擎中。

当引擎对象收到一个请求连接的呼叫时,引擎转换为“ESetup”状态。在该模式下,移动终端将和远程终端交换媒体支持能力和信道配置信息,为接下来的媒体信道连接做好准备。

在协议栈的控制面信令完成通信后,终端开始尝试基于通信双方的支持能力建立音频、视频轨迹,数据源和数据槽将在这一过程中转入运行,引擎转换为“EConnecting”状态。

当因通信完成或者资源不足等原因,引擎决定断开信道和复用设备时,引擎的状态转换为“EDisconnecting”状态。

如果终端开始释放所有双向引擎占用的通信资源,则引擎转为“EResetting”状态。

下图显示了双向引擎的状态跃迁。

PV2Way状态图
PV2Way状态图

在Android中,目前支持的基于CPV2WayInterface接口的双向引擎为CPV324m2Way。数据源和数据槽均是基于PV2WayMIO类派生的。

为了进行视频通话,首先需要创建一个双向引擎,然后添加数据源和数据槽,具体的交互过程如下图所示。

PV2Way交互过程图
PV2Way交互过程图

OpenCORE所能支持的媒体格式参看pvmf_format_type.h。客户端和服务器进行通信协商编码的过程如下:

代码:FormatInList的实现

CodecSpecifier* PV2WayMIO::FormatInList(PVMFFormatType& type)
    {
        Oscl_Map< PVMFFormatType, CodecSpecifier*,
        OsclMemAllocator, pvmf_format_type_key_compare_class >::iterator it =
            iFormatsMap.begin();
        it=iFormatsMap.find(type); //查找匹配格式
        if (!(it==iFormatsMap.end()))
            return (*it).second;
        return NULL;
    }

本文为华清远见3G学院android培训原创资料,转载请注明出处!

 更多相关文章

·Android PVPlayer引擎的实现
·Android OpenIPMP服务器搭建
·Android CPM插件机制
·Android 封装式/嵌入式DRM对比
·Android DRM数字版权管理