java实现超低延迟 webrtc 直播


文章目录

  • java实现超低延迟 webrtc 直播
  • 环境描述
  • 定义、首字母缩写词和缩略词
  • 目标
  • 主要流程
  • 信令服务器 -- RabbitMQ
  • Kurento
  • Coturn 搭建
  • 附页
  • NAT种类
  • NAT 穿透原理
  • ICE



通过转化 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/

如何用java写直播间 用java代码实现网络直播_如何用java写直播间

附页

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