sturn,turn,配合srs实现webrtc内网穿透的具体流程,需要基于ubuntu搭建webrtc服务器,windows的浏览器作为webrtc拉流的客户端,内网摄像头通过rtmp进行推流
时间: 2025-07-11 16:38:53 浏览: 13
<think>好的,我现在需要解决用户关于使用STUN、TURN配合SRS实现WebRTC内网穿透的具体流程的问题,同时要基于Ubuntu搭建WebRTC服务器,Windows浏览器作为客户端拉流,内网摄像头通过RTMP推流。首先,我需要确认用户的主要需求:搭建一个支持内网摄像头推流并通过WebRTC在浏览器中观看的系统,涉及到内网穿透,因此需要STUN和TURN服务器的配合。
用户可能对SRS、STUN、TURN的关系不太清楚,需要先理清这些组件的作用。SRS作为媒体服务器,处理RTMP推流和WebRTC分发。STUN用于获取客户端的公网IP和端口,而TURN则在无法直连时提供中继服务。用户需要具体步骤,所以应该分步骤讲解搭建过程,包括安装配置SRS、部署STUN/TURN服务器(如coturn),以及客户端的配置。
需要注意用户的环境是Ubuntu服务器和Windows客户端,因此步骤要针对这两个系统。同时,用户提到内网摄像头通过RTMP推流,可能需要指导如何将摄像头的流推送到SRS服务器,然后通过WebRTC拉流。这里要确保SRS正确配置支持RTMP和WebRTC的转换。
可能遇到的常见问题包括防火墙设置、端口开放、SRS与coturn的集成配置是否正确,以及客户端如何生成正确的WebRTC链接。需要提前预判这些问题,并在步骤中加入检查和解决的提示。例如,检查Ubuntu的防火墙是否放行了相关端口(如3478、19302、8080等),以及如何测试STUN/TURN服务器是否正常工作。
另外,用户可能需要具体的命令行操作和配置文件示例,比如如何安装coturn,如何修改SRS的配置文件,如何生成TURN服务器的用户凭证等。需要确保这些命令在Ubuntu上有效,并且配置文件路径正确。
最后,需要验证整个流程是否成功,包括RTMP推流是否被SRS接收,WebRTC拉流是否能够在内网穿透的情况下正常播放。可能需要提供测试命令或浏览器访问的具体URL示例,例如使用OBS推流,用VLC或浏览器访问WebRTC链接。
总结下来,步骤大致分为:环境准备、安装配置coturn作为STUN/TURN服务器、安装配置SRS支持WebRTC、RTMP推流设置、WebRTC拉流测试。每个步骤需要详细说明,确保用户能逐步操作,并在关键点给出验证方法和故障排除提示。</think>以下是基于 **Ubuntu 搭建 WebRTC 服务器**,配合 **STUN/TURN** 实现内网穿透,并通过 **Windows 浏览器拉流**的完整流程。具体分为 **RTMP 推流**、**SRS 服务器转发**、**WebRTC 穿透**三部分。
---
### 一、环境准备
| 角色 | 工具/配置 | 说明 |
|---------------|---------------------|--------------------------|
| **服务器** | Ubuntu 20.04+ | 公网 IP: `x.x.x.x` |
| **STUN/TURN** | coturn | 端口: `3478` (UDP/TCP) |
| **SRS 服务器**| SRS 5.0+ | 端口: `1935` (RTMP), `8080` (HTTP) |
| **推流端** | 内网摄像头 + OBS | 推流到 `rtmp://x.x.x.x:1935/live/stream` |
| **拉流端** | Windows Chrome/Edge | 访问 `http://x.x.x.x:8080/players/rtc_player.html` |
---
### 二、部署流程
#### 1. 部署 STUN/TURN 服务器(coturn)
**步骤 1:安装 coturn**
```bash
sudo apt update
sudo apt install coturn
```
**步骤 2:配置 coturn**
编辑配置文件 `/etc/turnserver.conf`:
```ini
# 启用长期凭证机制
use-auth-secret
static-auth-secret=your_secure_password_123
# 指定监听 IP 和端口
listening-ip=0.0.0.0
listening-port=3478
# 允许所有 IP 范围
min-port=49152
max-port=65535
# 指定公网 IP(替换为你的服务器公网 IP)
external-ip=x.x.x.x
# 启用 STUN 和 TURN
verbose
no-tls
no-dtls
realm=your_domain.com
user=username:password # 可选静态用户
```
**步骤 3:启动 coturn**
```bash
sudo systemctl enable coturn
sudo systemctl start coturn
```
**验证 TURN 服务器**:
```bash
turnutils_uclient -v -u username -w password x.x.x.x
# 输出 "Total received packets" 表示成功
```
---
#### 2. 部署 SRS 服务器(支持 WebRTC)
**步骤 1:编译安装 SRS**
```bash
git clone -b develop https://gitee.com/ossrs/srs.git
cd srs/trunk
./configure --with-ffmpeg --with-ssl --with-hls --with-http-callback
make -j4 && sudo make install
```
**步骤 2:配置 SRS WebRTC**
编辑配置文件 `conf/srs.conf`:
```nginx
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # WebRTC 监听端口
# 指定 coturn 作为 ICE 服务器
ice_stun_server stun:x.x.x.x:3478;
ice_turn_server turn:x.x.x.x:3478?transport=udp;
ice_turn_username username;
ice_turn_password password;
ice_candidate_priority 0.9; # 提升 Host Candidate 优先级
}
vhost __defaultVhost__ {
rtc {
enabled on;
rtc_to_rtmp on; # 允许 WebRTC 转 RTMP
}
}
```
**步骤 3:启动 SRS**
```bash
./objs/srs -c conf/srs.conf
```
---
#### 3. 内网摄像头推流(RTMP)
**使用 OBS 推流**:
1. OBS 设置 → 推流 → 服务类型: `自定义`
2. 服务器地址: `rtmp://x.x.x.x:1935/live`
3. 流密钥: `stream`
4. 点击「开始推流」
**验证 RTMP 流**:
访问 `http://x.x.x.x:8080/live/stream.flv`,若播放成功则推流正常。
---
#### 4. Windows 浏览器拉流(WebRTC)
**访问 WebRTC 播放器**:
在 Chrome/Edge 中打开:
```
http://x.x.x.x:8080/players/rtc_player.html?stream=stream
```
**流程解析**:
1. **SRS 生成 SDP Offer**:包含从 coturn 获取的 ICE Candidate
2. **浏览器 ICE 协商**:
- 优先尝试 `host` (直连)
- 失败后使用 `srflx` (STUN 穿透)
- 最终回退到 `relay` (TURN 中继)
3. **媒体传输**:通过协商后的最佳路径传输 RTP 包
---
### 三、关键问题排查
#### 1. **ICE 穿透失败**
- **检查项**:
- coturn 日志:`tail -f /var/log/turnserver/turn_*.log`
- SRS ICE 日志:`grep ICE ./objs/srs.log`
- **解决**:
- 开放防火墙端口:`ufw allow 3478,1935,8080,8000`
- 确保 `external-ip` 配置正确
#### 2. **WebRTC 拉流黑屏**
- **检查项**:
- SRS 是否收到 Candidate:`grep "RTC: ICE" ./objs/srs.log`
- 浏览器控制台错误:按 `F12` 查看 WebSocket 或 ICE 错误
- **解决**:
- 强制使用 TURN:在 SRS 配置中设置 `ice_candidate_priority 0.5`
---
### 四、网络拓扑示意图
```
内网摄像头 → OBS推流 → RTMP → SRS服务器 → WebRTC
↑ ↓
| STUN/TURN (coturn)
| ↓
Windows浏览器 ←── ICE协商 ←─── 候选地址交换
```
---
### 五、性能优化建议
1. **减少 TURN 依赖**:
- 在 SRS 配置中设置 `ice_candidates host srflx` 优先直连
2. **降低延迟**:
- SRS 参数:`rtc { nack on; twcc on; }` 启用丢包重传和带宽估计
3. **负载均衡**:
- 多节点部署 coturn 和 SRS,通过 DNS 轮询分配请求
---
通过以上步骤,可实现内网摄像头通过 RTMP 推流,并借助 STUN/TURN 穿透 NAT,最终在公网 Windows 浏览器中通过 WebRTC 低延迟播放。
阅读全文
相关推荐











