需求是这样的,原来有个 rtsp协议的视频接口,是在内网,现在需要代理到外网
http协议的代理很好操作,通过nginx就可以
但是rtsp和http根本不是一回事啊,怎么转出来呢,从没接触过视屏流的我蒙了。。
后来同事让我去了解下m7s服务,经过一番了解,逐渐云消雾散,不得不说这真是个好工具
首先贴出官网:https://monibuca.com/
他可以本身作为视频流服务器推流,也可以拉流,然后用http协议转发出来,还可以自定义开发更高阶的功能
详情可以查看 https://monibuca.com/guide/startup.html#%E8%BF%90%E8%A1%8C
https://m7s.live/devel/puller.html
https://mp.weixin.qq.com/s/nlaKVhT-H8JTcfd0uCj40g
其实我这个需求很简单,基本只用到了m7s的皮毛而已,就是调用RTSP插件的接口,实现拉取rtsp视频流,然后用http协议的地址访问,最后用nginx把访问地址代理到外网即可。
下面是我的操作步骤
1.使用docker搭建m7s服务
官网的推荐操作如下:
docker pull langhuihui/monibuca:latest
docker run -id -p 1935:1935 -p 8080:8080 -p 8443:8443 -p 554:554 -p 58200:58200 -p 5060:5060/udp -p 8000:8000/udp -p 9000:9000 langhuihui/monibuca:latest
由于我只用到rtsp接口,而rtsp接口的调用方式只用到了8080端口,所以我对启动命令做了精简
docker run --name=monibuca --restart=always -id -p 18080:8080 langhuihui/monibuca:latest
搭建完,可以找一台内网windows机器,访问以下地址做个测试,看看接口是否正常
http://内网地址:18080/
他会列出所有可用的接口列表,出现这个则代表接口正常
基础知识补充:https://m7s.live/guide/qa/play.html
播放问题#
播放地址#
- m7s中的流都有一个唯一标识就是StreamPath,StreamPath的规则是
[AppName]/[StreamName]
,其中AppName是应用名,StreamName是流名。例如live/test
,其中live
是AppName,test
是StreamName。 - 只有知道了streamPath就可以以任意一种协议来拉流播放。
地址拼接规则
在官网首页最下方有地址拼接的交互UI,可以选择具体的协议生成对应的播放地址
通常,播放地址的规则是 [协议]://[Host][:Port]/[插件名]/[StreamPath]
[插件名]
其中插件名仅仅针对公用http端口的情况下需要拼接。包括websocket协议即ws-flv和ws-raw
假如host是localhost,streamPath为live/test
则HTTP-FLV协议的地址为 http://localhost:8080/hdl/live/test.flv
fmp4协议的地址为 http://localhost:8080/fmp4/live/test.mp4
hls协议的地址为 http://localhost:8080/hls/live/test.m3u8
ws-flv协议的地址为 ws://localhost:8080/jessica/live/test.flv
ws-raw协议的地址为 ws://localhost:8080/jessica/live/test
ws-raw协议
ws-raw协议 为私有协议,只能通过jessibuca播放器播放。
http端口号
http协议的默认端口号是8080,可以通过全局配置修改,对于包含http配置的插件,可以单独配置端口号。使用单独的端口号则地址中不再需要拼接插件名。例如上面的例子,如果hdl插件单独配置http端口号是8081,则地址为:http://localhost:8081/live/test.flv
rtmp播放地址则为 rtmp://localhost/live/test
rtsp播放地址则为 rtsp://localhost/live/test
默认端口号
rtmp的默认端口号是1935,rtsp的默认端口号是554,不配置的情况下就是采用了默认端口号,所以地址可以省略端口号
webrtc播放地址#
webrtc播放地址
webrtc其实没有所谓的播放地址,而是通过js api来播放的。具体的api可以参考webrtc播放 如果自己播放webrtc可以参考MDN:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API
首先需要完成sdp交换,然后通过建立的webrtc连接来播放。 jessibuca把上述过程简化成一个地址:webrtc://localhost/live/test
. 实际上是先和服务器建立sdp交换的连接,然后通过这个连接来建立webrtc连接。
注意事项#
- h265如果通过flv、rtmp格式来播放,则必须使用定制的播放器(如jessibuca)来播放。因为flv和rtmp本身没有定义h265的格式,所以是通过扩展的方式实现的。
2.在内网调试rtsp接口,测试功能是否符合要求
参考文档:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/132317435
rtsp接口说明如下:https://monibuca.com/guide/plugins/rtsp.html
根据上面文档拼凑出我的内网调用地址,在内网windows机器上,打开浏览器,使用拼接地址测试
(1)从远程拉取rtsp到m7s中
rtsp/api/pull?target=[RTSP地址]&streamPath=[流标识]&save=[0|1|2]
#
从远程拉取rtsp到m7s中
- save含义:0、不保存;1、保存到pullonstart;2、保存到pullonsub
- RTSP地址需要进行urlencode 防止其中的特殊字符影响解析
我的请求地址如下
http://内网地址:18080/rtsp/api/pull?target=rtsp://账号:密码@rtsp接口地址:554/1xv62d/17076&streamPath=live/jk&save=0
由于我只是用于转发视频流,所以save=0即可
请求完出现ok,即代表拉取成功
(2)使用对应的http-flv的播放地址播放
http://内网地址:18080/preview/live/jk
点击播放,可以正常播放视频,即转发成功
参数说明:
streamPath=live/jk
是自定义的流标识,用于给拉取的视频流做标签,播放视频的时候对应上即可
live类似于一个组,jk是对应每个视频的名字
可以参考官方说明:https://monibuca.com/guide/qa/push.html
查看已拉取的视频流
http://内网地址:18080/preview/
3.使用nginx做反向代理,转发到外网
下面为nginx配置示例
location /spgx/ { #允许访问的ip地址 allow 1.1.1.1; deny all; proxy_pass http://内网地址:18080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s; proxy_buffering off; }
后面在外网调用视频流需要分两步骤
1.请求拉取推流
https://域名/spgx/rtsp/api/pull?target=rtsp://账号:密码@rtsp接口地址:554/1xv62d/视频名字&streamPath=live/视频名字&save=0
2.使用http地址播放
https://域名/spgx/preview/live/视频名字
在外网通过浏览器可以正常打开视频即可
另外:
由于这个地址没有鉴权,任何人都可以打开看到,所以加了ip限制
后面有时间可以研究下鉴权问题