部署在AWS的Kurento WebRTC视频无法播放问题排查求助
Troubleshooting Kurento Media Server Video Playback Issue on AWS
我之前也碰到过类似跨EC2部署Kurento的流媒体问题,结合你的场景,咱们一步步拆解可能漏掉的配置点,逐个排查:
1. 先确认Kurento与Node.js实例的内网连通性
虽然信令层(Node.js和客户端)通信正常,但媒体流的核心是Node.js和Kurento媒体服务器之间的内网交互——这步很容易被忽略。
- 在Node.js所在的EC2上,用命令测试TCP连通性:
或者nc -zv <kurento-ec2-private-ip> 8888telnet <kurento-private-ip> 8888,如果连不上,说明内网通信被阻断(哪怕安全组开了端口,也要检查子网ACL是否放行)。 - 检查Kurento的配置文件
/etc/kurento/kurento.conf.json,确认websocket.server.address设为0.0.0.0或者EC2的内网IP,而不是默认的localhost——不然Kurento只会监听本地,Node.js根本连不上媒体服务。
2. 验证SDP中的ICE候选地址是否正确
客户端能收到sdpAnswer不代表媒体流地址有效,要手动检查SDP内容:
- 在浏览器控制台打印出sdpAnswer,重点看:
c=字段:是否包含Kurento的公网IP或者TURN服务器的公网IP?如果只有内网IP,公网的观看者根本拿不到媒体流。a=candidate条目:有没有包含TURN服务器的候选地址?如果只有STUN的内网候选,跨网传输肯定失败。
- 要是SDP里全是内网地址,说明Kurento没正确识别自己的公网IP,需要在
/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini里手动配置externalAddress为Kurento EC2的公网IP。
3. 检查Kurento媒体端口范围与AWS安全组的匹配性
媒体流主要走UDP,这步是高频坑:
- Kurento默认用
50000-65535范围的UDP/TCP端口传输媒体,你说“所有端口开放”,要确认安全组里真的放行这个完整范围的UDP流量(包括入站和出站)——CloudFormation模板有时候会漏掉UDP规则,或者只开了TCP。 - 同步检查Kurento配置文件
/etc/kurento/kurento.conf.json里的mediaServer.net.udp.portRange,确保和安全组的端口范围完全一致,不然Kurento随机选的端口不在安全组里,媒体流直接被阻断。
4. 深度验证TURN服务器的实际媒体转发能力
Trickle ICE通过只是基础,要测试TURN能不能真的转发媒体:
- 在本地或者Node.js EC2上用
turnutils_uclient工具测试:
如果返回“Permission denied”或者连接超时,说明TURN的用户名/密码配置错误,或者安全组没放行TURN的端口(默认3478/UDP、443/TCP)。turnutils_uclient -v <turn-public-ip> -u <turn-username> -w <turn-password> - 检查Kurento的TURN配置
/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini,确认turnServerUri格式正确:turnServerUri=turn:<turn-public-ip>:3478?transport=udp turnServerUsername=<your-username> turnServerPassword=<your-password>
5. 确认Node.js连接Kurento的地址是否合理
- 一定要让Node.js用Kurento EC2的内网IP连接,而不是公网IP——AWS内网通信更稳定,也避免公网NAT导致的媒体流延迟或阻断。比如Node.js里的连接代码要改成:
const kurento = kurentoClient.connect('ws://<kurento-private-ip>:8888/kurento'); - 如果Node.js用公网IP连Kurento,哪怕能建立WebSocket连接,媒体流的传输路径也会绕公网,容易出问题。
6. 查日志找具体报错
日志是排查这类问题的核心:
- Kurento的日志在
/var/log/kurento/kurento-media-server.log,搜索ERROR或WARN关键词,比如有没有Failed to create ICE candidate、Connection refused或者媒体流超时的报错。 - Node.js应用的日志也要留意,有没有Kurento连接断开、媒体管道创建失败的信息,比如
KurentoClient: Connection closed unexpectedly。
7. CloudFlare SSL的额外排查
如果用了CloudFlare代理,要注意两个点:
- 在CloudFlare的“网络”设置里,确认开启了WebSocket支持——默认CloudFlare只放行443端口的WebSocket,要是Kurento用8888端口,需要在CloudFlare的“规则”里添加允许WebSocket的自定义规则。
- 检查CloudFlare的SSL模式,建议设为“严格”,同时确保后端(Node.js和Kurento)的证书能和CloudFlare兼容,避免SSL握手失败导致WebSocket连接中断。
内容的提问来源于stack exchange,提问作者AmitBu
相关产品推荐
相关产品推荐

