# Useful-WebRTC-LiveRoom-Project **Repository Path**: da-ji/useful-web-rtc-live-room-project ## Basic Information - **Project Name**: Useful-WebRTC-LiveRoom-Project - **Description**: 基于WebRTC搭建的P2P实时直播投屏解决方案,具有学习性质,包括学习笔记(见Readme.md),主要技术栈包括并不限于WebRTC、FFmpeg、SpringBoot、Nginx、Node.js、Coturn等。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-24 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Useful-WebRTC-LiveRoom-Project # 介绍 基于WebRTC搭建的P2P实时直播投屏解决方案,本工程其实是负责接收视频的客户端。 项目具有学习性质,包括学习笔记(见Readme.md),主要技术栈包括并不限于WebRTC、FFmpeg、SpringBoot、Nginx、Node.js、Coturn等。 # 客户端使用说明: 必须使用管理员权限打开此应用!!!! 必须使用管理员权限打开此应用!!!! 必须使用管理员权限打开此应用!!!! 必须使用管理员权限打开此应用!!!! 必须使用管理员权限打开此应用!!!! 按Alt+W键控制显示和隐藏; 按Alt+.键可以点击按钮(聚焦) 按Alt+P键退出整个应用。 安装说明:双击打开exe文件,会自动安装(如果没有自动安装,需要用cmd运行该文件) # 学习资料来源 [小破站WebRTC最强教学,从原理到实战一对一/一对多实时通话讲解/音视频开发](https://www.bilibili.com/video/BV1D14y1W7qp) # 总体思路 # 直播客户端 一台手机,默认打开后置摄像头 # 服务端(连接公网的云服务器) 是一台 Ubuntu 20.04.6 LTS ,所有部署在服务器的应用,都是基于这个 Ubuntu 20.04.6 LTS 的。 服务端负责搭建信令服务器和TURN服务器。为什么不用STUN 服务器? 因为只依赖STUN的打洞,现实中大约有 10-20% 的用户环境(特别是企业网、蜂窝网络、某些对称 NAT)无法建立直接 P2P,必须依赖 TURN。所以不如一步到位直接搭建TURN ## TURN服务器:Coturn安装 为啥会用到Coturn? > 在 WebRTC 网络传输模块中,当遇到 NAT 之间无法打通的情况下,会使用 TURN 协议通过中转的方式实现端与端之间的通信。Coturn 就是一种开源的 STUN/TURN 服务器,它可以让你轻松地搭建一个能够在 NAT 防火墙和代理服务器背后运行的实时通信系统。Coturn 支持各种协议和技术,包括 STUN(Session Traversal Utilities for NAT)、TURN(Traversal Using Relays around NAT)和 ICE(Interactive Connectivity Establishment)。Coturn 可以用于向 WebRTC 应用程序提供 TURN 服务器,这些应用程序需要在 P2P 通信中转储流量。 简单说来,是为了解决STUN服务器无法直接建立点对点连接。直接使用Coturn转发数据,作为一个数据的中转站。TURN 服务器会中转所有音视频数据。 基础安装和配置: 配置文件: ```bash sudo vim /etc/turnserver.conf ``` 配置文件没啥用,一般就用启动命令就行: ```bash sudo nohup turnserver -L 192.168.1.114 --external-ip=1.94.180.78/192.168.1.114 -u daji:123456 -v -f -r daji.gov --no-tls --no-cli --no-auth & ``` 这个启动命令折腾了我非常非常长的时间,原因猜测是云服务器原因。 问题根源分析(云服务器环境特有) 双重 NAT 问题: 云服务器通常位于虚拟网络之后(如 AWS VPC、阿里云 VPC) 您的公网 IP 1.94.180.78 实际上是弹性公网 IP,不是直接绑定到服务器网卡 需要配置内外网 IP 映射关系 安全组/防火墙限制: 云平台的安全组默认阻止 UDP 流量 需要显式开放端口 IP 绑定问题:-L 0.0.0.0 绑定到所有接口,但云服务器有公网和内网两个 IP 首先云服务器要放开安全组和udp端口,等等。其次,启动命令要改一下公网ip和内网ip。 操作完成之后,看上面的启动命令: ### 杀死所有进程命令: ps aux | grep turn 将查到的全部结束掉。 ### 云服务器下启动命令详解 首先,用如下命令获取正确的云服务器内外网ip: ```bash # 获取公网 IP PUBLIC_IP=$(curl -s ifconfig.me) # 获取内网 IP PRIVATE_IP=$(hostname -I | awk '{print $1}') echo "公网IP: $PUBLIC_IP" echo "内网IP: $PRIVATE_IP" ``` 然后是命令详解: ```bash sudo nohup turnserver -L 192.168.1.114 --external-ip=1.94.180.78/192.168.1.114 -u daji:123456 -v -f -r daji.gov --no-tls --no-cli --no-auth & ``` * -L 指定服务器监听的内网IP地址 * --external-ip=1.94.180.78/192.168.1.114 最重要的参数(特别适用于云服务器/NAT环境) * 格式:公网IP/内网IP * 作用:告诉 Coturn 如何映射内外网地址 * 1.94.180.78:服务器的公网IP地址 * 192.168.1.114:服务器的内网IP地址 * 当数据包从内网IP发出时,Coturn 会将其标记为来自公网IP * -u daji:123456 添加认证用户凭据,格式:用户名:密码 * -v 启用详细日志模式(Verbose) * -f 启用 STUN/TURN 指纹机制,在消息中添加特殊属性,提高与老旧防火墙/NAT设备的兼容性 * -r daji.gov设置 Realm(领域标识),类似域名概念,用于区分不同服务,客户端认证时需要匹配此领域,daji.gov 是您自定义的域名标识 * --no-tls 禁用 TLS 加密传输 * --no-cli 禁用命令行管理接口 * --no-auth 禁用所有认证机制,客户端无需提供用户名/密码即可连接。生产环境不能这样做。 ### 云服务器搭建coturn不能正常使用的问题 一般都是端口没开,需要设置安全组,也得放开udp端口 https://zhuanlan.zhihu.com/p/121720810 ## 信令服务器(Node.js 搭建) 什么是信令服务器? 下文即可描述: https://blog.csdn.net/weixin_39766005/article/details/132189400 信令服务器和客户端的交互不限定协议,可以使用webSocket,也可以使用Ajax轮询。我们这里使用WS. 信令服务器见另一个工程:https://gitee.com/da-ji/WebRTC-SignalingServer # 客户端 这个工程仅仅考虑接收方客户端。 ## 接收方客户端 整体利用Electron来搭建。 关于快速入门Electron: https://blog.csdn.net/qq_33650655/article/details/140364298 https://www.electronjs.org/zh/docs/latest/tutorial/quick-start ## 启动所需安装npm依赖包: ```bash cd .\LiveRoomClient\ # electron npm install --save-dev electron # websocket npm install nodejs-websocket # 其他依赖 npm install ws express https http fs # electron 打包工具 npm install electron-builder --save-dev ``` 启动命令 ```bash npm start ``` # 客户端打包: 执行打包命令:npm run build 会在dist目录下生成exe文件。 这一步会疯狂报错,我的解决方案基本上如下: * 首先科学上网 * 1 尝试更新electron: npm update electron * 2 尝试更新 electron-builder: npm update electron-builder * 3 如果更新失败,单独设置electron的镜像源:yarn config set electron_mirror https://cdn.npm.taobao.org/dist/electron/ * 4 再次尝试更新electron * 5 打开powershell管理员模式,执行 npm run build