iOS通过WebRTC向远程mediamtx服务器推流失败问题排查
排查方向与解决方案
一、iOS客户端HTTPS安全配置问题
- ATS规则适配:iOS默认的ATS(App Transport Security)会严格校验HTTPS连接的安全性,若远程服务器使用自签SSL证书,必须在App的
Info.plist中添加域名例外,否则客户端会静默拒绝连接:
如果使用正规CA签发的证书,需确保证书链完整,iOS设备能正常信任该证书。<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的远程服务器域名</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict> - WebRTC角色匹配:远程HTTPS环境下,服务器返回的SDP中
a=setup字段可能与本地环境不同,需确保iOS客户端的RTCPeerConnection角色(主动/被动)与服务器匹配,否则ICE候选交换会失败。
二、K8s集群Mediamtx配置与网络问题
- 公网ICE候选配置:本地环境用局域网IP即可生成有效ICE候选,但远程K8s集群必须配置公网域名/IP作为ICE候选的外部地址,否则服务器返回的是集群内部IP,iOS客户端无法访问。部署时需设置环境变量:
MTX_WEBRTCADDITIONALHOSTS=你的远程服务器公网域名或IP MTX_WEBRTCADDITIONALPORTS=8890,8189 - UDP端口暴露:WebRTC媒体流依赖UDP传输,需确保K8s的Service、云服务商安全组、集群NetworkPolicy都已开放UDP端口8890、8189,很多场景下只暴露了HTTPS的TCP端口,漏掉UDP会直接导致流无法建立。
- STUN/TURN配置:若服务器和iOS客户端都处于NAT后,仅靠本地ICE候选无法穿透,需为Mediamtx配置STUN/TURN服务器:
[webrtc] stunServer=stun:stun.l.google.com:19302 # 若STUN无效,启用TURN中转 turnServer=turn:你的TURN服务器地址:3478 turnServerUsername=用户名 turnServerPassword=密码
三、网络阻塞排查
- 客户端网络测试:切换到手机蜂窝网络尝试推流,若能成功,说明当前WiFi网络的路由器/防火墙阻塞了UDP流量,需调整WiFi的端口转发或防火墙规则。
- 服务器入站规则检查:确认云服务商安全组、K8s NetworkPolicy已允许UDP 8890、8189端口的入站流量,以及HTTPS(默认443)的TCP流量。
四、调试手段
- 开启Mediamtx调试日志:K8s部署时设置
MTX_LOGLEVEL=debug,查看服务器端ICE候选接收、连通性检查的详细日志,定位失败节点。 - iOS客户端WebRTC日志:通过
RTCPeerConnection的日志回调,查看ICE候选收集、交换状态,以及是否有明确的连通失败错误信息。
内容的提问来源于stack exchange,提问作者Elio_
相关产品推荐
相关产品推荐

