编辑: 苹果的酸 | 2019-07-02 |
3 模块设计与实现 3.1 视频集成模块 视频信号采集与编码设备分为两类: 一类是模拟 摄像机和视频服务器或编码器;
另一类为网络摄像机,
2016 年第25 卷第9期http://www.c-s-a.org.cn 计算机系统应用Research and Development 研究开发
283 它可以看作是由摄像机和视频编码设备组成的设备. 在数据组织形式的设计中, 把视频服务器或编码器定 义为视频设备, 把摄像机定义为视频设备的一个通道, 简称视频通道. 在此基础上, 以 视频设备-视频通道 两级目录的方式组织视频配置数据, 并进行了类图设 计, 如图
2 所示. 图2不同视频设备厂商 API 集成开发类图 对图
2 进行如下说明: ① 不同视频设备厂商的视频设备类继承视频设 备类CVideoDevice, 如海康威视的设备类CVideoDeviceHK、 大华的设备类 CVideoDeviceDH 等. 不同视频设备厂商的视频通道类继承视频通道类 CVideoChannel, 如海康威视的设备通道类CVideoChannelHK 、 大华的设备通道类CVideoChannelDH 等. ② 视频设备类 CVideoDevice 的子类和视频通道 类CVideoChannel 的子类均实现了相应视频设备厂商 提供的 API 接口, 根据面向对象设计的多态机制, 子 类均采用反射机制进行实例化. ③ 视频设备类 CVideoDevice 与视频通道类 CVideoChannel 是依赖关系, 视频通道类的实例化需 要有相对应的视频设备对象参数传入. ④ CVideoDevice 类及其子类负责视频设备的登 录登出以及设备参数的远程设置. ⑤ CVideoChannel 类及其子类负责单个视频通道 的播放与控制, 包含实时预览、远程回放、录像下载、 截图、语音控制、云台控制等, 其中, 录像下载和截图 等功能涉及到与本地文件系统的交互. 插件主要实现了三部分的视频功能: 实时预览功 能、本地录像文件播放功能和历史录像回放与下载功 能. 其中, 实时预览功能和历史录像回访与下载功能 主要通过调用厂商提供的网络库和软解码库的接口函 数实现, 本地录像文件播放功能主要通过调用厂商提 供的软解码库的接口函数实现. 三部分功能实现的流 程图如图
3 所示. 图3中虚线框部分由 CVideoDevice 类及其子类负责实现, 实现框部分由 CVideoChannel 类及其子类负责实现. 图3视频功能实现流程图 3.2 NPAPI 插件接口 NPAPI 标准提供了一套 JS 与插件的交互方法. 这 里主要介绍下 JavaScript 如何调用插件方法. 浏览器首先调用NPError NPP_GetValue(NPP instance, NPPVariable variable, void* value) 取得NPObject 对象的地址,variable 参数为NPPVpluginScriptableNPObject, 在取得 NPObject 对象 后浏览器就可以调用插件提供的 NPClass 函数. 插件 关于方法调用的函数如下: ① pluginHasMethod: 插件是否支持某一 JS 方法. ② pluginInvoke: 当插件支持某一 JS 方法时, 插件 将会调用该函数, 在该函数内部匹配并实现 JS 方法. 插 件如何在该函数内区分不同的方法呢, 分析这个函数: bool pluginInvoke(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
其中, obj 是插件里的 NPObject 对象地址;
name 表 示插件提供方法名称的 NPIdentifier 对象, 通过对比这 个参数来区分插件提供的不同方法;
args 和argcount 分计算机系统应用http://www.c-s-a.org.cn
2016 年第25 卷第9期284 研究开发 Research and Development 别表示 JavaScript 函数的参数地址和参数个数;