java实现超低延迟 webrtc 直播

  • Post author:
  • Post category:java




java实现超低延迟 webrtc 直播

通过转化 RTSP/ RTMP 视频流为 webrtc 推送到云端,实现超低延迟的视频直播,涉及到许多计算机网络的知识,这里就不深入讲解,感兴趣的可以自行研究。



环境描述


软件环境

  • JDK 1.8
  • kurento
  • RabbitMQ
  • coturn


硬件环境

  • 海康摄像头
  • 腾讯/阿里云 centos7



定义、首字母缩写词和缩略词

  • NAT (Network Address Translator)
  • STUN (Simple Traversal of UDP Through NAT): NAT会话穿越应用程序
  • TURN (Traversal Using Relays around NAT)
  • ICE (Interactive Connectivity Establishment): 互动式连接建立



目标

摄像头连接局域网,服务器拉取摄像头 RTSP 流,通过广域网推送到流媒体服务器,浏览器实时播放摄像头影像。如果网络环境运行,实现 P2P 的视频传输。基于JAVA进行消息交互。



主要流程

sequenceDiagram
A - 信令服务: connect
B - 信令服务: connect
A - A: 创建 Offer
A - stun/turn: bing request
A - 信令服务: 发送 SDP Offer
信令服务 - B: 发送 SDP Offer
B - B: 创建 Answer
B - stun/turn: bing request
B - 信令服务: 发送 SDP Answer
信令服务 - A: 发送 SDP Answer
stun/turn - A: OnICECandidate
A - 信令服务: 发送 candidate
信令服务 - B: 发送 candidate
stun/turn - B: OnICECandidate
B - 信令服务: 发送 candidate
信令服务 - A: 发送 candidate
A ->> B: 音视频传输



信令服务器 – RabbitMQ

可以手动写一个 socket 服务进行SDP等消息交互,由于前端可以直接连接 MQ 服务,这里就直接使用 MQ 服务进行消息交互,不再手写信令服务,感兴趣的人可以自行手写 java 版的信令服务项目。

消息传输使用 RabbitMQ 中的 topic 模式进行消息传输。主要的消息类型

  • start:开启视频流推送,传输 SDP (Answer/Offer)消息
  • iceCandidate:获取
  • heart:设备心跳消息
  • stop:停止视频流推送
  • reload:重载视频流
  • list:获取摄像头列表

一方手机到所有候选者后,通过信令传给对方;同样,另一方收到候选者后,也做收集工作;当双方拿到全部列表后,将候选者进行配对



Kurento

kurento 已经完成 STUN/TURN 协议的交互,无需自己进行协议解析。

// todo



Coturn 搭建

  • libevent 版本 2.1.12 (2021年2月14日)

  • coturn 版本 3.2.5.9 (2021年2月14日)

安装所需依赖

$ yum install gcc -y
$ yum install openssl openssl-libs libevent2 libevent-devel 
# 如果libevent2安装失败
$ wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
$ tar xvfz libevent-2.1.12-stable.tar.gz
$ cd libevent-2.1.12-stable && ./configure make && make install && cd ..

安装 coturn

$ wget https://github.com/coturn/rfc5766-turn-server/archive/3.2.5.9.tar.gz
$ tar zxf 3.2.5.9.tar.gz
$ cd rfc5766-turn-server-3.2.5.9
$ ./configure && make && make install

配置

$ find / -name turnserver.conf
/usr/local/turnserver/etc/turnserver.conf
/usr/local/turnserver/share/examples/turnserver/etc/turnserver.conf
/root/coturn/turnserver-4.5.0.8/examples/etc/turnserver.conf
$ vim /usr/local/turnserver/etc/turnserver.conf
relay-device=eth0
listening-ip=172.17.0.13
listening-port=3478
tls-listening-port=5349
external-ip=121.*.*.153
relay-threads=50
lt-cred-mech
cert=/usr/local/turnserver/etc/webrtc.mufeng.info_chain.crt
pkey=/usr/local/turnserver/etc/webrtc.mufeng.info_key.key
pidfile="/var/run/turnserver.pid"
user=liurui:***
cli-password=qwerty
min-port=40000
max-port=60000
realm=webrtc.mufeng.info

部分参数说明

  • external-ip:外网ip

  • listening-ip:内网ip

测试工具

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

image-20210214121228250



附页



NAT种类

  1. 全锥型(Full Cone)

  2. 受限锥型(Restricted Cone), 或者说是IP受限锥型

  3. 端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型

  4. 对称型(Symmetric)



NAT 穿透原理

STUN 试探每种组合进行打洞

全锥形 客户端2 P2P
全锥形 全锥形
全锥形 对称型
全锥形 受限制锥形
全锥形 端口端口受限锥形
受限制锥形 对称型
受限制锥形 受限制锥形
受限制锥形 端口端口受限锥形
端口端口受限锥形 端口端口受限锥形
端口端口受限锥形 对称型 无法打通
对称型 对称型 无法打通



ICE

candidate 类型

  • 主机候选者(Host candidate):本机所有 IP 和指定端口
  • 反射候选者(Reflexive Candidate):STUN/TURN
  • 中继候选者(Relay Candidate):TURN



版权声明:本文为qq_34178764原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。