自定义模块未安装在 kurento 媒体服务器上,但出现在 kurento-media-server --list 上

Custom Module is not installed on the kurento media server but appears on the kurento-media-server --list

我正在尝试为 Kurento-media-server 开发自定义模块,但我发现了两个障碍,按照 documentation 上的说明,我已经能够:

使用以下命令创建自定义模块文件夹:

kurento-module-scaffold.sh <module_name> <output_directory>

他们生成的文件包含:

cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make && sudo make install

我在 /src/server/objects/bgRemoverFilterOpenCVImpl.cpp 文件的 bgRemoverFilterOpenCVMpl 中添加了两行,因此过滤器添加了一个 hello world文字到图片。

void bgRemoverFilterOpenCVImpl::process (cv::Mat &mat)
{
 cv::Point textOrg(50, 50);
 putText( mat, "Hello World", textOrg, 1, 2, cv::Scalar(0, 0, 0) );
}

我用 debuild -us -uc 构建 .deb 文件并成功安装,这样当我 运行 kurento-media -server --list 命令我在列表中看到我的新自定义模块:

....
bgRemoverFilter
bgremoverfilter.bgRemoverFilter
....

我使用命令 cmake .. -DGENERATE_JS_CLIENT_PROJECT=TRUE 生成了 js 客户端代码,并将 js 生成的文件夹添加到我的 node.js 项目中npm link 出于测试目的,我正在使用 Kurento-node-repository 中的 Kurento-Chroma 项目,所以我修改了它以注册我的模块并创建我的自定义过滤器色度之一。为此对第 28 行和第 249 行的 server.js 文件进行了更改:

  ...
  //kurento.register('kurento-module-chroma');
  kurento.register('kurento-module-bgremoverfilter');
  ...
  pipeline.create('bgremoverfilter.bgRemoverFilter', options,   function(error, filter) {
        if (error) {
            return callback(error);
        }
        return callback(null, webRtcEndpoint, filter);
    });

节点应用程序 运行 正确,但是当我开始环回以获取应用了过滤器的视频源时,它会发送此错误消息:

 Error message from server: Exiting with error SyntaxError: Module 'bgRemoverFilter' is not installed in the Kurento Media Server

尽管模块被加载到 kurento-media-server --list 应用程序无法创建过滤器对象,我认为这是一个命名问题所以当我创建一个单词名称自定义模块,如 "harel" 以避免驼峰式命名问题并安装它我在列表中:

  ...
  harel
  harel.harel
  ...

当尝试在同一个 kurento-chroma 示例上创建和使用此滤镜时,我得到了一个不同的错误:

  SyntaxError: sink param should be a MediaElement, not harel
at ChecktypeError (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/checkType.js:32:10)
at checkMediaElement (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client-core/lib/abstracts/MediaElement.js:1082:11)
at checkType (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/checkType.js:84:25)
at WebRtcEndpoint.MediaElement.connect (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client-core/lib/abstracts/MediaElement.js:489:3)
at connectMediaElements (/home/ubuntu/www/kurento-chroma/server.js:260:20)
at /home/ubuntu/www/kurento-chroma/server.js:197:17
at /home/ubuntu/www/kurento-chroma/server.js:254:20
at callback2 (/home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/KurentoClient.js:527:7)
at /home/ubuntu/www/kurento-chroma/node_modules/kurento-client/lib/KurentoClient.js:385:7
at Object.dispatchCallback [as callback] (/home/ubuntu/www/kurento-chroma/node_modules/kurento-jsonrpc/lib/index.js:613:9)

那么,我是不是在安装过程中遗漏了什么?我怀疑第一种情况下 JS 生成的代码有问题。

关于第二种情况,当使用单个单词名称时,为什么会这样?该应用程序能够创建过滤器,但在尝试将其连接到 webrtcEndPoint

时失败

我查看了我能找到的所有问题和主题,但没有得到任何答案。 here is a repository with my custom filter code including the generated js library

请提供帮助,如果需要更多说明或详细信息,请向他们提出要求。

更新 我写信给一位 kurento 开发人员,建议我使用 kurento-media-server --version 来获取加载模块的实际列表,这是后续的:

kurento-media-server --version returns:

Version: 6.7.0~1.g6ebaa27
Found modules:
        Module: 'backgroundremoval' version '0.0.1~3.g045ef96'
        Module: 'bgremoverfilter' version '0.0.1~0.g3a1e793'
        Module: 'chroma' version '6.6.1~3.g6df8f1d'
        Module: 'core' version '6.6.3'
        Module: 'elements' version '6.6.3'
        Module: 'filters' version '6.7.0~1.g0314843'
        Module: 'harel' version '0.0.1~0.gaec7e6d'

是的,backgroundremoval、bgremoverfilter 和 harel 是我创建的自定义模块,它们在列表中。

我仍然不知道为什么当我使用驼峰命名作为 bacgroundRemoverFilter 时我无法加载模块 javascript 虽然生成的代码在我的 node.js 项目尝试创建时加载应用程序发送 "module not installed error"

的过滤器

所以我开始使用所有负名称,对于我的模块 "harel" 这加载没有问题,当我尝试使用

创建媒体元素时
  pipeline.create('harel.harel')... 

过滤器已创建,但在尝试使用

将其连接到 webrtcEnpoint 时失败
 filter.connect(webRtcEndpoint, function(error) {
                if (error) {
                    return callback(error);
                }

            return callback(null);
        });

它 returns 错误:SyntaxError:sink 参数应该是 MediaElement,而不是 harel

原来调用函数 Checktype

时 /node_modules/kurento-client-core/lib/abstracts/MediaElement.js:489:3 发送了错误
  checkType('MediaElement', 'sink', sink, {required: true});

所以我在创建滤镜后添加了一个 console.log() 以查看色度滤镜和我的自定义滤镜之间的区别,这是结果:

harel {
 domain: null,
 _events:
  { removeListener: [Function],
    newListener: [Function],
_describe: [Function: bound emit],
_rpc: [Function: encodeRpc],
release: { [Function: bound onceWrapper] listener: [Function] } },
 _eventsCount: 5,
 _maxListeners: undefined,
 id: 'ad5e2447-3801-4d96-81b4-c40390b16248_kurento.MediaPipeline/18e8c6b9-df88-4d52-851c-  8c664a26ee3d_harel.harel' }

ChromaFilter {
 domain: null,
 _events:
  { removeListener: [Function],
    newListener: [Function],
    _describe: [Function: bound emit],
    _rpc: [Function: encodeRpc],
    release: { [Function: bound onceWrapper] listener: [Function] } },
     _eventsCount: 5,
     _maxListeners: undefined,
     id: '97f370b5-81ae-45e1-a979-       dab6c1c4cd28_kurento.MediaPipeline/06658282-67bf-47bc-  b006-9f0dbae01767_chroma.ChromaFilter' }

两个对象都具有相同的 id 属性 excetp。那么,如果传递的对象几乎相同,那么同一个函数如何与 ChromaFilter 一起工作而不与 harel 一起工作。这就是我现在的样子。会继续挖掘。

我的过程的问题是我使用 npm link 将生成的 client-js 代码添加到我的 node.js 应用程序。为此,我必须在 client-js 文件夹上安装 kurento-client 包,当我的应用程序 运行 时,它将生成自定义插件,其 kurento-client 与它的插件不同正在使用。

所以甚至认为 Chroma-filter 和我的 harel 模块看起来一样,它们来自两个不同的 kurento-client 类。

我只是将生成的 js-client 代码复制到我的 node-modules 文件夹中,而不是使用 npm-link,这就成功了。

希望这对发现此错误的人有用。