tools-ossrs
SRS简介
SRS是一个开源的(MIT协议)简单高效的实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等协议。 SRS媒体服务器和FFmpeg、OBS、VLC、 WebRTC等客户端配合使用,提供流的接收和分发的能力,是一个典型的发布 (推流)和订阅(播放)服务器模型。 SRS支持互联网广泛应用的音视频协议转换,比如可以将RTMP或SRT, 转成HLS或HTTP-FLV或WebRTC等协议。
k8s安装
1 | 相关设置: |
nginx代理
1 | # ossrs代理地址 |
流程
虚拟ip处需要映射
Web: 外网ip80/443绑定节点的ingress的80/443
Ossrs: 外网ip1935绑定k8s里面的ossrs服务的Container Ports(Host端口)1935或者nodeport,不采用nodeport是因为要内网外网都要能访问ossrs,关键是内网对外网域名做了隔离,因此这里用本机的hosts映射(可以升级到dns下发)
graph LR G[OBS推流]-->C C[域名] -->|解析| A[移动光猫] A -->|LAN| B(飞塔防火墙) B -->|虚拟ip| E[K8S的Ingress] E -->|域名匹配| F[前端web/nginx] F -->|nginx代理|U[ossrs] C-->|hosts映射节点ip|E V[VLC]-->|web flv拉流|U K[IOS]-->|ios webrtc拉流|U
测试
安装obs,用srs在线的测试工具也可以。
在
来源->加号->浏览器->url
里面输入要直播的网址https://www.baidu.com/s?word=在线时间
在
控制按钮->设置->直播->
服务:自定义
服务器:
rtmp://iexxk.com/drone/
推码流:1
点击
开始直播
播放:
内网测试(ok):
- Flv播放,打开http://ip:8080/players/srs_player.html,url输入:http://ip:8080/drone/1.flv
- Webrtc(WHEP)播放,打开http://ip:8080/players/whep.html,url输入:http://ip:1985/rtc/v1/whep/?app=drone&stream=1
内网域名测试(ok):
- Flv播放,打开http://iexxk.io/view-live/players/srs_player.html,url输入:http://iexxk.io/view-live/drone/1.flv
- Webrtc(WHEP)播放,打开http://iexxk.io/view-live/players/whep.html,url输入:http://iexxk.io/view-webrtc/rtc/v1/whep/?app=drone&stream=1
外网测试:
- Flv播放,打开https://iexxk.com/view-live/players/srs_player.html,url输入:https://iexxk.com/view-live/drone/1.flv
- Webrtc(WHEP)播放,打开https://iexxk.com/view-live/players/whep.html,url输入:https://iexxk.com/view-webrtc/rtc/v1/whep/?app=drone&stream=1
- Webrtc(rtc播放器)播放,打开OSSRS-RTC在线播放器,url输入: webrtc://iexxk.com/drone/1
webrtc和WHEP区别
WHEP:可以代理,但是也无法将一个域名根据环境解析为内网ip和外网ip,内网和外网是通过dns解析的,只能解析一个。在rtc里面启用保留域名,也无法解决,candidate
里面会出现2个域名一个ip,优先还是走的ip
1 | rtc_server { |
webrtc:直接连接,延迟更低,必须开放1985,无法修改
使用webrtc时,需要在web前端(nginx)做个代理,并要将该端口映射到外网1985上
1 | # ossrs webrtc代理地址 |
常见问题
在内网无法访问外网域名的时候,虽然通过host映射到内网,但是webrtc播放的时候还是解析成了外网ip
使用webrtc播放时可以在浏览器控制台能看到如下信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44Got answer: v=0
o=SRS/5.0.213(Bee) 140129754604224 2 IN IP4 0.0.0.0
s=SRSPlaySession
t=0 0
a=ice-lite
a=group:BUNDLE 0 1
a=msid-semantic: WMS drone/1
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=ice-ufrag:881501t3
a=ice-pwd:d11em20o3z9k02c97228yq5937ptj776
a=fingerprint:sha-256 35:65:58:9A:E6:78:8F:D5:E6:F1:8F:E5:74:AD:A4:1E:3A:DF:B4:CE:21:3C:C9:CB:4A:9D:25:7A:87:53:FB:47
a=setup:passive
a=mid:0
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=ssrc:10186 cname:2yaj11875760968e
a=ssrc:10186 label:audio-803h25y4
a=candidate:0 1 udp 2130706431 172.16.10.44 30353 typ host generation 0
a=candidate:1 1 udp 2130706431 iexxk.com 30353 typ host generation 0
m=video 9 UDP/TLS/RTP/SAVPF 106
c=IN IP4 0.0.0.0
a=ice-ufrag:881501t3
a=ice-pwd:d11em20o3z9k02c97228yq5937ptj776
a=fingerprint:sha-256 35:65:58:9A:E6:78:8F:D5:E6:F1:8F:E5:74:AD:A4:1E:3A:DF:B4:CE:21:3C:C9:CB:4A:9D:25:7A:87:53:FB:47
a=setup:passive
a=mid:1
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:106 H264/90000
a=rtcp-fb:106 transport-cc
a=rtcp-fb:106 nack
a=rtcp-fb:106 nack pli
a=fmtp:106 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=ssrc:10187 cname:2yaj11875760968e
a=ssrc:10187 label:video-29515r30
a=candidate:0 1 udp 2130706431 172.16.10.44 30353 typ host generation 0
a=candidate:1 1 udp 2130706431 iexxk.com 30353 typ host generation 0注意最后两行
1
2
3
4
5
6
7
8
9使用内网ip的时候,输出如下信息
a=candidate:0 1 udp 2130706431 172.16.10.102 30353 typ host generation 0
a=candidate:1 1 udp 2130706431 iexxk.com 30353 typ host generation 0
使用内网域名的时候,输出如下信息,内网做了dns解析,假域名能解析到内网主机
a=candidate:0 1 udp 2130706431 172.16.10.44 30353 typ host generation 0
a=candidate:1 1 udp 2130706431 iexxk.com 30353 typ host generation 0
使用外网域名的时候,输出如下信息,17.176.159.182这个域名刚好在内网无法访问,因此内网无法播放外网地址
a=candidate:0 1 udp 2130706431 17.176.159.182 30353 typ host generation 0
a=candidate:1 1 udp 2130706431 exxk.com 30353 typ host generation 0真域名做了host映射,但是似乎不会从host拿,应该是从dns里面拿取了
从下图可以知道,是通过1985的接口,拿到了udp的端口数据。
配置
rtmp2rtc.conf
1 | listen 1935; |
realtime.flv.conf
1 | listen 1935; |