基于nginx-http-flv-module提供摄像头hls flv回放流服务

       之前写过一篇文章叫做基于nginx-http-flv-module提供摄像头hls flv实时流服务,实际在一个项目中实时流和回放流一般是同时都需要的。

        对于回放流在设计流程上和实时流大致是一样的。大致阐述一下,当来了一个回放请求,会在uri里记录需要回放的信息,比如是哪个设备,是设备的哪个通道,回放的视频时间段,然后流程就和实时流一样的了。

        这里需要注意的是,对于回放流,每一个回放请求回放同一个设备的同一通道的同一时间段的录像对应的应该是不同的推流源。不像实时流,每一个实时流请求在请求一个设备的同一通道的实时流时,对应的是同一个推流源。比如一个请求uri

/pb_d13_c0_s20211011T000000Z_e20211011T154530Z

        如果回放流回放同一个设备的同一通道的同一时间段的录像对应的是同一个推流源,那样会导致后请求的用户不是从请求的时间段开始段播放,而是从这个录像段的中间的某个时刻。因为第一个播放这个录像段的用户已经开启了这段录像的推流了。所以对于回放流,每一个回放请求回放同一个设备的同一通道的同一时间段的录像对应的应该是不同的推流源。

        我们都知道在rtmp下,一个推流源对应一个唯一的流标识,因此,每一流回放流应对应一个唯一的流标识,即使它是同一个设备的同一通道的同一时间段的录像。这个就是回放流同实时流的区别了。

        那么如何来使每一个回放流的标识唯一呢,基于我本人的知识范畴,能想到的有三种方式,一是让请求的用户来加。我们返回给所有用户的录像段标识是相同的,用户根据我们的要求加一个唯一标识段。我觉得这种方式对用户稍微有那么一点点不太友好,因为用户要自己来加这个唯一标识。比如变为pb_d13_c0_s20211011T000000Z_e20211011T154530Z_tokenxxxx,xxxx为随机数。

        二是系统内加,用户还是用pb_d13_c0_s20211011T000000Z_e20211011T154530Z来请求,然后系统内将其变为pb_d13_c0_s20211011T000000Z_e20211011T154530Z_tokenxxxx。这里我们用重定向来实现,比如请求pb_d13_c0_s20211011T000000Z_e20211011T154530Z我们把它重定向到pb_d13_c0_s20211011T000000Z_e20211011T154530Z_tokenxxxx。

在nginx里重定向配置如下

            if ($request_uri ~ "^/playback/pb_d[0-9]{1,9}_c[0-9]{1,5}_s[0-9]{8}T[0-9]{6}Z_e[0-9]{8}T[0-9]{6}Z/index\.m3u8$") {
               set $jtradom _$connection;
               rewrite "^/playback/(pb_d[0-9]{1,9}_c[0-9]{1,5}_s[0-9]{8}T[0-9]{6}Z_e[0-9]{8}T[0-9]{6}Z)/index\.m3u8$" /hls/$1$jtradom/index.m3u8? permanent;
            }

这里的set 、if、rewrite、permanent是nginx重定向模块的指令,permanent标识永久重定向。

这里有一个重定向配置时带不带参数的问题,需要注意一下。分别用flv.js和video.js测试了flv和hls出流,是可以的。

这个方式呢在浏览器里是可以很好的运行的,因为浏览器会处理重定向的问题,但是如果用户用比如curl的库来获取流就,在不加-L(重定向)的情况下就需要用户自己处理了,因为这时返回的是301重定向。需要用户从head里取出新的重定向后的地址。

不带-L和带-L的请求

root@DESKTOP-EMC868D:/usr/local/nginx/sbin# curl -v  http://127.0.0.1:8881/echo/pb_d13_c0_s20211011T000000Z_e20211011T154530Z/index.m3u8
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0)
> GET /echo/pb_d13_c0_s20211011T000000Z_e20211011T154530Z/index.m3u8 HTTP/1.1
> Host: 127.0.0.1:8881
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.20.0
< Date: Wed, 13 Oct 2021 05:05:51 GMT
< Content-Type: text/html
< Content-Length: 169
< Location: http://127.0.0.1:8881/hls/pb_d13_c0_s20211011T000000Z_e20211011T154530Z_1/index.m3u8
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< Access-Control-Max-Age: 604800
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET, POST, OPTIONS
< Access-Control-Allow-Headers: DNT,Authorization,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Access-Token,Blog-ID
< 
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.0</center>
</body>
</html>
* Connection #0 to host 127.0.0.1 left intact
root@DESKTOP-EMC868D:/usr/local/nginx/sbin# curl -v  -L http://127.0.0.1:8881/echo/pb_d13_c0_s20211011T000000Z_e20211011T154530Z/index.m3u8
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0)
> GET /echo/pb_d13_c0_s20211011T000000Z_e20211011T154530Z/index.m3u8 HTTP/1.1
> Host: 127.0.0.1:8881
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.20.0
< Date: Wed, 13 Oct 2021 05:06:09 GMT
< Content-Type: text/html
< Content-Length: 169
< Location: http://127.0.0.1:8881/hls/pb_d13_c0_s20211011T000000Z_e20211011T154530Z_2/index.m3u8
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< Access-Control-Max-Age: 604800
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Methods: GET, POST, OPTIONS
< Access-Control-Allow-Headers: DNT,Authorization,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Access-Token,Blog-ID
< 
* Ignoring the response-body
* Connection #0 to host 127.0.0.1 left intact
* Issue another request to this URL: 'http://127.0.0.1:8881/hls/pb_d13_c0_s20211011T000000Z_e20211011T154530Z_2/index.m3u8'
* Found bundle for host 127.0.0.1: 0x55fed704f820 [can pipeline]
* Re-using existing connection! (#0) with host 127.0.0.1
* Connected to 127.0.0.1 (127.0.0.1) port 8881 (#0)
> GET /hls/pb_d13_c0_s20211011T000000Z_e20211011T154530Z_2/index.m3u8 HTTP/1.1
> Host: 127.0.0.1:8881
> User-Agent: curl/7.58.0
> Accept: */*
> 

rewrite "^(.*)$" $request_uri$jtradom? permanent;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值