需求是这样的,原来有个 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限制

后面有时间可以研究下鉴权问题

posted on 2023-11-14 17:49  06  阅读(1542)  评论(3编辑  收藏  举报