Kurento模块开发指南之一:模块开发简介

17.1 Kurento 模块
Kurento是一个可插拔的框架,这些插件,在Kurento中被称之为模块。
Kurento定义了三种类型的模块:
• 主模块, Kurento Media Server即插即用的组成部分
– kms-core:     Kurento Media Server的主要组成;
– kms-elements: Kurento Media组件(包括WebRtcEndpoint,PlayerEndpoint等)的实现;
– kms-filters:    Kurento 滤镜(FaceOverlayFilter, ZBarFilter,GStreamerFilter)的实现;


• 内建模块, 由Kurento团队为了提升KMS基本能力的额外模块。
  到目前为止,开发了有四个内建模块:
– kms-pointerdetector: 它是一个基于颜色跟踪的检查视频流中线索的滤镜。
这个模块的安装命令为:
$ sudo apt-get install kms-pointerdetector
  –  kms-chroma: 使顶层的特定的色度范围透明,从而显示出后面另一个图像的滤镜;
     这个模块的安装命令为:
         $ sudo apt-get install kms-chroma
  –  kms-crowdetector: 检测视频流中人群的聚集的滤镜;
         $ sudo apt-get install kms-crowddetector
  –  kms-platedetector: 检测视频流中机动车车牌的滤镜;
         $ sudo apt-get install kms-platedetector

•  定制模块, 为KMS提供新的媒体功能的扩展模块。
   如果你想开发自己的定制模块,就需要仔细看下面的章节。


17.1.1 如何开发Kurento模块

可以通过自己开发模块来扩展KMS。 KMS支持两种方式的定制化开发模块:
•  基于OpenCV的模块,如果你想开发计算机视频滤镜类的模块,这种方式是比较合适的。
•  基于GStreamer的模块,这种方式开发的模块功能更强,但开发成本也更高。
   它要求要有GStreamer的开发能力。

开发一个滤镜首先要做的就是创建这个滤镜的框架。
因此,你需要使用kurento-module-scaffold 工具。这个工具是和kurento-media-server-6.0-dev包一起发布的。使用下面的命令可以安装这个工具:
$ sudo apt-get install kurento-media-server-6.0-dev

这个工具的使用方式是依据选择开发方式的不同而不同:
1. OpenCV 模块:
$  kurento-module-scaffold.sh <module_name> <output_directory> opencv_filter

2. Gstreamer 模块:
$  kurento-module-scaffold.sh <module_name> <output_directory>

这个工具会生成文件夹树,所有需要的CmakeLists.txt文件,Kurento模块描述文件(.kmd)的示例文件。
这些文件描述了我们的模块,而构造函数,方法,属性,事件和复杂的类型定义是由开发者实现的。

当kmd文件完成后,就可以生成代码了。
工具 kurento-module-creator 将生成服务端的胶水代码。
在模块的根目录下:
$ cd build
$ cmake ..

下面的章节详细地讲解了依赖于你选择的是OpenCV还是GStreamer来创建自己的模块:
OpenCV 模块:
在目录src/server/implementation/objects/ 下有四个文件:
ModuleNameImpl.cpp
ModuleNameImpl.hpp
ModuleNameOpenCVImpl.cpp
ModuleNameOpenCVImpl.hpp.
前面两个文件不需要修改。
后面两个文件包含了你模块的逻辑。
文件ModuleNameOpenCVImpl.cpp包含你需要实现的模块处理逻辑的方法和参数。
同时,这个文件还包含一个叫process的函数。这个函数会被每个新的数据帧调用,因此,你需要在这个函数中实现你的滤镜的处理逻辑。

GStreamer 模块
在这种开发模式下,在src文件夹下有两个目录。
gst-plugins 文件夹包含了你的GStreamer组件 (the kurento-module-scaffold generates a dummy filter)的实现。
src/server/implementation/objects/ 文件夹下有两个文件:
ModuleNameImpl.cpp
ModuleNameImpl.hpp
在ModuleNameImpl.cpp文件中,你需要激活你的GStreamer组件的方法。而模块的处理逻辑则在GStreamer组件中实现。

两种模块共同的:
如果你需要额外的编译依赖项,你可以在 src/server目录下的CmakeLists.txt文件中的generate_code函数下,给kurento-module-creator添加额外的编译规则,下面的编码参数是可用的:
• MODELS (required):  
这个参数接收模块(.kmd文件)所在的文件目录。
• INTERFACE_LIB_EXTRA_SOURCES, 
INTERFACE_LIB_EXTRA_HEADERS,
INTERFACE_LIB_EXTRA_INCLUDE_DIRS, 
INTERFACE_LIB_EXTRA_LIBRARIES: 
   这些参数允许添加额外的源代码到静态库。
   INTERFACE_LIB_EXTRA_HEADERS下所包含的头文件会被安装到系统作为这个库的头文件。
   所有的这些参数以一个输入列表的方式接受;
• SERVER_IMPL_LIB_EXTRA_SOURCES, 
SERVER_IMPL_LIB_EXTRA_HEADERS,
SERVER_IMPL_LIB_EXTRA_INCLUDE_DIRS, 
SERVER_IMPL_LIB_EXTRA_LIBRARIES:
   这些参数允许添加额外的源代码到接口库。
   SERVER_IMPL_LIB_EXTRA_HEADERS下所包含的头文件将被安装到系统作库库的头文件。
   所有的这些参数以一个输入列表的方式接受;
• MODULE_EXTRA_INCLUDE_DIRS, 
MODULE_EXTRA_LIBRARIES: 
  这些参数允许给模块添加额外的头文件路径和库;
• SERVER_IMPL_LIB_FIND_CMAKE_EXTRA_LIBRARIES:
   这个参数接收一系列字符串,每个字符串都依据格式:
libname[libversion range]
   range可使用符号 AND OR < <= >>= ^ and ~ :
^ indicates a version compatible using Semantic Versioning
~ Indicates a version similar, that can change just last indicated version character
• SERVER_STUB_DESTINATION (required): 
你需要修改生成的代码将这个参数指定生成的文件夹。

当新模块的逻辑开发并编译完成后,你需要将这个模块安装到你的系统,
可以使用下面的两种方式:
/etc/default/kurento: 你可以生成Debian包(debuild –us -uc)并安装它(dpkg -i), 
或者在文件 /etc/default/kurento 中添加下列环境变量:
  KURENTO_MODULES_PATH=<module_path>/build/src
GST_PLUGIN_PATH=<module_path>/build/src.

Now, you need to generate code for Java or JavaScript to use your module from the client-side.
现在,你需要为使用你模块的客户端生成Java 或 JavaScript代码。
• 对于Java, 需要在创建路径下执行命令:
      cmake .. -DGENERATE_JAVA_CLIENT_PROJECT=TRUE 
来生成Java文件夹及客户端代码。你可以使用命令:
      java_install
将你的模块安装到你的Maven的本地仓库中。
如果要在Maven工程中使用这个模块,则在pom.xml文件中添加如下的依赖:
<dependency>
<groupId>org.kurento.module</groupId>
<artifactId>modulename</artifactId>
<version>moduleversion</version>
</dependency>

• 对于JavaScript, 需要执行命令:
      cmake .. -DGENERATE_JS_CLIENT_PROJECT=TRUE
这个命令会生成一个js文件夹及客户端代码。
这样,你就可以手动添加JavaScript库在你应用程序中使用新开发模块。
同样的,你也可以使用Bower(for JavaScript for browser) or NPM (for JavaScript for Node.js).
这之后,你应当添加你的JavaScript模块作为bower.json或package.json的依赖项,
如下所示:
"dependencies": {
"modulename": "moduleversion"
}

示例
这两种开发模式的简单示例在GitHub中有:
• OpenCV module   : https://github.com/Kurento/kms-opencv-plugin-sample
• GStreamer module  :https://github.com/Kurento/kms-plugin-sample

如何定义方法,参数或事件,在我们的内建模块中有更多示例:
• kms-pointerdetector :https://github.com/Kurento/kms-pointerdetector/tree/master/src/server/interface
• kms-crowddetector : https://github.com/Kurento/kms-crowddetector/tree/master/src/server/interface
• kms-chroma      : https://github.com/Kurento/kms-chroma/tree/master/src/server/interface
• kms-platedetector  : https://github.com/Kurento/kms-platedetector/tree/master/src/server/interface

而且,所有我们开发模块会要使用到的开发方法,可以参考主模块:
• kms-core     : https://github.com/Kurento/kms-core
• kms-elements  : https://github.com/Kurento/kms-elements
• kms-filters    : https://github.com/Kurento/kms-filters

下图显示了KMS所有的模块的架构:
  Kurento模块开发指南之一:模块开发简介_第1张图片
Figure 17.1: Kurento modules architecture.
Kurento Media Server can be extended with built-it modules
 (crowddetector,pointerdetector, chroma, platedetector) and also with other custom modules.

将内建模块考虑进来,Kurento工具扩展后如下:
  Kurento模块开发指南之一:模块开发简介_第2张图片
Figure 17.2: Extended Kurento Toolbox.
The basic Kurento toolbox (left side of the picture) is extended with more computer vision and augmented reality filters 
(right side of the picture) provided by the built-in modules.


下面的章节将介绍四个内建模块(kms-pointerdetector,kms-chroma, kms-crowddetector, kms-platedetector)
如何被用于开发简单的应用(示例教程),以显示如何使用他们

你可能感兴趣的:(Kurento模块开发指南之一:模块开发简介)