存档2020年6月15日

Kurento

主页: http://www.kurento.org/
github: https://github.com/kurento
服务端采用C++实现: https://github.com/Kurento/kurento-media-server
Docker https://hub.docker.com/r/kurento/kurento-media-server
说明文档 https://doc-kurento.readthedocs.io/en/stable/

Kurento模块分为三类:
主要模块与Kurento Media Server开箱即用合并:
kms-core:Kurento Media Server的主要组件。
kms-elements:Kurento Media Elements的实现(WebRtcEndpoint,PlayerEndpoint等)
kms-filters:
Kurento过滤器的实现(FaceOverlayFilter,ZBarFilter等)
内置模块Kurento团队开发的额外模块,用于增强Kurento Media Server的基本功能。到目前为止,有四个内置模块,分别是:
kms-platedetector:用于检测视频流中的车牌的过滤器。
kms-pointerdetector:基于颜色跟踪检测视频流中指针的过滤器。
kms-chroma:过滤器,它在顶层使用颜色范围并使之透明,从而在后面显示另一个图像。
kms-crowddetector:用于检测视频流中人聚集的过滤器。
定制模块

 docker run --name kms -d -p 8888:8888 \
  -e KMS_STUN_IP= \
  -e KMS_STUN_PORT=3478 \
  -e KMS_TURN_URL=user@password:urlorIp:3478 \
   kurento/kurento-media-server:latest

  -e KMS_NETWORK_INTERFACES= \
  -e KMS_EXTERNAL_ADDRESS= \
  -e KMS_MIN_PORT= \
  -e KMS_MAX_PORT= \
  -e KMS_MTU=1200 \
    kurento/kurento-media-server:latest
配制文件位置
/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
/etc/kurento/modules/kurento/BaseRtpEndpoint.conf.ini
#查看KMS日志
docker logs kms
#实时查看:
docker logs -f kms
日志输出
    docker logs --follow kms >"kms-$(date '+%Y%m%dT%H%M%S').log" 2>&1

    检查KMS是否已启动并正在侦听连接,请使用以下命令:
curl \
    --include \
    --header "Connection: Upgrade" \
    --header "Upgrade: websocket" \
    --header "Host: 127.0.0.1:8888" \
    --header "Origin: 127.0.0.1" \
    http://127.0.0.1:8888/kurento
应该得到类似于以下内容的响应:
HTTP/1.1 500 Internal Server Error
Server: WebSocket++/0.7.0

#进入镜像
docker exec -it kms /bin/bash
#安装vim
apt-get update
apt-get install vim
#进入配置文件夹
cd /etc/kurento/modules/kurento/
#编辑配置文件
vim WebRtcEndpoint.conf.ini
stunServerAddress=xx.xx.xx.xx
stunServerPort=pp
turnURL=username:userpwd@xx.xx.xx.xx:pp?transport=tcp
or
修改docker运行的kms配置文件方法
1.复制容器中的 配置文件到 宿主机中
docker cp  kms:/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini  ~/WebRtcEndpoint.conf.ini
2.修改配置文件
vim ~/WebRtcEndpoint.conf.ini
3.宿主机配置文件 复制到 kms容器中
 docker cp ~/WebRtcEndpoint.conf.ini kms:/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini

#查看当前启动的容器
docker ps
docker restart  {kurento容器ID}

kurento相关配置
1、Kurento Media Server 日志
Kurento Media Server日志文件存储在 /var/log/kurento-media-server/文件夹中。 此文件夹的内容如下:
    media-server_.<log_number>.<kms_pid>.log: Kurento Media Server的当前日志
    media-server_error.log: 第三方错误
    logs: 包含KMS已旋转日志的文件夹
2、Kurento Media Server 配置
    /etc/default/kurento-media-server 默认配置
    /etc/kurento/kurento.conf.json 通用配置
    /etc/kurento/modules/kurento/MediaElement.conf.ini Media Elements 通用参数。
    /etc/kurento/modules/kurento/SdpEndpoint.conf.ini SdpEndpoints的音频/视频参数( 例如: WebRtcEndpoint and RtpEndpoint)。
    /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini WebRtcEndpoint 特定参数。
    /etc/kurento/modules/kurento/HttpEndpoint.conf.ini HttpEndpoint 特定参数。

#### kurento-hello-world
““
git clone https://github.com/Kurento/kurento-tutorial-java.git
cd kurento-tutorial-java/kurento-hello-world
vim src/main/resources/static/js/index.js
在函数function uiStart()里,增加一个叫iceservers的变量,格式如下:
var iceservers={
“iceServers”:[
{
urls:”stun:xx.xx.xx.xx:3478″
},
{
urls:[“turn:xx.xx.xx.xx:3478″]
username:”xxxx”,
credential: “xxxx”
}
]
}
再修改底下的options变量:
const options = {
localVideo: uiLocalVideo,
remoteVideo: uiRemoteVideo,
mediaConstraints: { audio: true, video: true },
onicecandidate: (candidate) => sendMessage({
id: ‘ADD_ICE_CANDIDATE’,
candidate: candidate,
}),
configuration: iceservers //修改在这里,增加了一个configuration的key
};

启动项目
mvn -U clean spring-boot:run -Dkms.url=ws://xx.xx.xx.xx:8888/kurento

用 idea 打开 kurento-hello-world 项目,下载 maven 依赖完成后,在 run configurations 中添加 new configurations。
选择 maven , command line 中输入:
spring-boot:run -Dkms.url=ws://:8888/kurento # 这里的 public-ip 添你安装 kms 的服务器公网 ip 地址

启动完之后用谷歌或者火狐浏览器打开demo页面https://localhost:8443/
点击start启动

运行 hello world 示例时,会遇到 使用websocket传输内容过长的问题
//项目中创建 package org.kurento.tutorial.helloworld.config
//config 包下创建类
package org.kurento.tutorial.helloworld.config;

@Configuration
//@ComponentScan
//@EnableAutoConfiguration
public class WebAppRootContext implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println(“org.apache.tomcat.websocket.textBufferSize”);
servletContext.addListener(WebAppRootListener.class);
servletContext.setInitParameter(“org.apache.tomcat.websocket.textBufferSize”,”1024000″);
}

}
““

API Java SDK for Kurento Media Server

https://github.com/Kurento/kurento-java

Kurento tutorials for Node JS

https://github.com/Kurento/kurento-tutorial-node

信令服务器与web客户端 kurento-room

https://github.com/Kurento/kurento-room

NUBOMEDIA

NUBOMEDIA Autonomous Installer
https://nubomedia.readthedocs.io/en/latest/tools/autonomous-installer/

Android客户端开源库

https://github.com/nubomedia-vtt/nubo-test

iOS客户端开源库

https://github.com/nubomediaTI/Kurento-iOS

ffmpeg转发模块

利用ffmpeg可执行文件将本地RTP流封装转发成RTMP推送出去,具体可以参考这个开源工程:
kurento-rtmp https://github.com/godka/kurento-rtmp

gstreamer转发模块

RTP解包 —— 音视频转换 —— FLV封包 —— RTMP推流

openssl 生成公钥、密钥及.pem文件

首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情:
o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key
o Creation of X.509 Certificates, CSRs and CRLs # 创建证书
o Calculation of Message Digests #
o Encryption and Decryption with Ciphers # 加密、解密
o SSL/TLS Client and Server Tests # SSL 服务器端/客户端测试
o Handling of S/MIME signed or encrypted Mail # 处理签名或加密了的邮件

1、生成RSA密钥的方法生成根证书私钥(pem文件)
openssl genrsa -des3 -out privkey.pem 2048
这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,(转换无密码key:openssl rsa -in privkey.pem -out privkey_nopass.pem);
or 如果你不想要每次都输入密码,可以改成:
openssl genrsa -out privkey.pem 2048
建议用2048位密钥,少于此可能会不安全或很快将不安全。

2、生成一个证书请求CSR 生成根证书签发申请文件(csr文件)
openssl req -new -key privkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥privkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。

#自签发根证书(cer文件)
openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey privkey.pem -in cert.csr -out cacert.pem
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem

3、使用数字证书和密钥
有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了

#生成服务端私钥
openssl genrsa -out key.pem 2048
#生成证书请求文件
openssl req -new -key key.pem -out server.csr -subj “/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myServer”
#使用根证书签发服务端证书
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA cacert.pem -CAkey privkey.pem -CAserial cert.srl -CAcreateserial -in server.csr -out cert.pem
#使用CA证书验证server端证书
openssl verify -CAfile cacert.pem cert.pem