我正在尝试为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 文件的 bgRemoverFilterOpenCVImpl 中添加了两行,因此过滤器会向图像添加一个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客户端代码,并使用 npm link 将js generated文件夹添加到我的node.js项目中测试目的我使用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 ,但应用程序无法创建过滤器对象,我认为这是一个命名问题所以当我创建一个单词名称自定义模块时&#34; Harel的&#34;为了避免驼峰案例命名问题并安装它我列在列表中:
...
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返回:
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是我创建的自定义模块,它们在列表中。
我仍然不知道为什么当我使用camelcase名称作为bacgroundRemoverFilter我无法在javascript中加载模块时,生成的代码加载到我的node.js项目上,当它尝试创建过滤器时,应用程序发送&# 34;模块未安装错误&#34;
所以我开始使用所有减名,为我的模块&#34; harel&#34;当我尝试使用
创建媒体元素时,这没有任何问题 pipeline.create('harel.harel')...
过滤器已创建,但尝试使用
将其连接到webrtcEnpoint时失败 filter.connect(webRtcEndpoint, function(error) {
if (error) {
return callback(error);
}
return callback(null);
});
它返回错误:SyntaxError:sink param应该是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相同的属性。那么如果传递的物体几乎相同,那么同样的功能如何与ChromaFilter一起使用,而不是harel。这是我现在。将继续挖掘。
答案 0 :(得分:0)
我的流程存在的问题是我使用 npm link 将生成的client-js代码添加到我的node.js应用程序中。为了工作,我必须在client-js文件夹上安装kurento-client软件包,当我的应用程序运行时,它将使用与其使用的kurento-client不同的kurento-client生成自定义插件。
所以即使是Chroma-filter和我的harel模块看起来也是如此,它们来自两个不同的kurento-client类。
而不是使用npm-link我只是将生成的js-client代码复制到我的node-modules文件夹中,这样就可以了。
希望这对发现此错误的人有用。