使用Kurento搭建一个流媒体服务器,实现在网页查看Rtsp流

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Kurento搭建一个流媒体服务器,实现在网页查看Rtsp流相关的知识,希望对你有一定的参考价值。

参考技术A 环境和工具: Java 8 、 Maven 3.5.0 、 Node.js 0.10.48 、 Bower 、 git.

文章所有均在 Ubuntu16.04 上进行的。

安装配置好上方环境后,可参考官方安装文档:

https://doc-kurento.readthedocs.io/en/stable/user/installation.html

另符两个安装参考连接:

https://blog.csdn.net/running17/article/details/78268034?utm_medium=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-4.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-4.nonecas

https://blog.csdn.net/ai_xao/article/details/98871813

1.Git官方源码Domo

git clone https://github.com/Kurento/kurento-tutorial-java.git

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

【中文标题】自定义模块未安装在 kurento 媒体服务器上,但出现在 kurento-media-server --list【英文标题】:Custom Module is not installed on the kurento media server but appears on the kurento-media-server --list 【发布时间】:2018-03-03 19:52:53 【问题描述】:

我正在尝试为 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 生成的文件夹添加到我的 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 上加载了模块,但应用程序无法创建过滤器对象,我认为这是一个命名问题,所以当我创建一个单词名称自定义模块时“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 返回:

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 项目中加载,当它尝试创建过滤器时,应用程序发送“模块未安装错误”

所以我开始使用所有减号,对于我的模块“harel”,它可以毫无问题地加载,当我尝试使用创建媒体元素时

  pipeline.create('harel.harel')... 

过滤器已创建,但尝试将其连接到 webrtcEnpoint 时失败

 filter.connect(webRtcEndpoint, function(error) 
                if (error) 
                    return callback(error);
                

            return callback(null);
        );

返回错误:SyntaxError: sink param should be a MediaElement, not harel

原来错误是由 /node_modules/kurento-client-core/lib/abstracts/MediaElement.js:489:3 在调用函数 Checktype 时发送的

  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 一起工作。这就是我现在的样子。将继续挖掘。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于使用Kurento搭建一个流媒体服务器,实现在网页查看Rtsp流的主要内容,如果未能解决你的问题,请参考以下文章

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

如何检查 Kurento 媒体服务器的流量

事件未到达 kurento java 服务器

流媒体服务器的搭建问题

Kurento媒体服务器抛出“处理方法时出现意外错误:未找到工厂'PlayerEndPoint''”

如何修改仅使用 Kurento 录制音频的答案 SDP?