java实现超低延迟 webrtc 直播 2021-02-14 程序之旅,记录 1 条评论 1839 次阅读 ## java实现超低延迟 webrtc 直播 [TOC] 通过转化 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进行消息交互。 ### 主要流程 ```sequence 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日) 安装所需依赖 ```shell $ 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 ```shell $ 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 ``` 配置 ```shell $ 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](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/20210214121230.png) ### 附页 #### 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 打赏: 微信, 支付宝 标签: java, webrtc, kurento, rtsp, stun, turn, ice, nat 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
个人来说,会把参考文献的超链挂上,这样有些略过不讲的部分,游客也可以比较方便的分享到你搜集到的资源。