基于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;
基于nginx-http-flv-module提供摄像头hls flv回放流服务相关推荐
- php与hls,转: 基于nginx的hls直播系统
标签: 转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于ngi ...
- 基于 Nginx 直播解决方案
▪ 环境 系统:阿里云 CentOS 7 后台:nginx nginx-rtmp-module 推流软件:OBS(将视频流推送到服务器) 播放软件:VLC Media Player(支持 rtmp 协 ...
- ts获取服务器数据_基于Nginx的媒体服务器技术-线上公开课
国内应用比较多的开源流媒体服务器nginx-rtmp-module一直存在功能少.集群化难度大等问题.在LiveVideoStack线上分享中,PingOS 开源项目组开发工程师.UCloud RTC ...
- 基于Nginx的媒体服务器技术-线上公开课
国内应用比较多的开源流媒体服务器nginx-rtmp-module一直存在功能少.集群化难度大等问题.在LiveVideoStack线上分享中,PingOS 开源项目组开发工程师.UCloud RTC ...
- 如何基于 Nginx 搭建个人直播服务器.md
前言 最近这几年做直播和短视频领域是真的很火,而且直播的领域也很广泛,可以预见,未来的音视频技术将会作为一种基础技术应用到更广泛的场景中.它可以与 AR/VR 结合,让你在远端体验虚拟与现实,如虚拟服 ...
- Android音视频学习系列(八) — 基于Nginx搭建(rtmp、http)直播服务器
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- nginx rtmp 编码_基于Nginx的媒体服务器技术
国内应用比较多的开源流媒体服务器nginx-rtmp-module一直存在功能少.集群化难度大等问题.在LiveVideoStack线上分享中,PingOS 开源项目组开发工程师.UCloud RTC ...
- 基于Nginx的媒体服务器技术
国内应用比较多的开源流媒体服务器nginx-rtmp-module一直存在功能少.集群化难度大等问题.在LiveVideoStack线上分享中,PingOS 开源项目组开发工程师.UCloud RTC ...
- 音视频开发(15)---IPC+NVR+路由器+ffmpeg+nginx实现网页/Android/IOS的HLS直播
海康IPC+NVR+路由器+ffmpeg+nginx实现网页/Android/IOS的HLS直播 研究摄像头直播有一个月了,最终领导决定使用HLS协议进行摄像头实时预览,原因是HLS对移动端和Web端 ...
最新文章
- ios app内嵌入http服务器
- c++把数组所有元素剔除_C语言基础之数组,第一节,C语言必学知识点剖析
- Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
- HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
- 客户端是选择Java Swing还是C# Winform
- 在Android NDK中使用OpenSSL
- linux夏令时配置文件,Linux夏令时是怎么调整的?
- 使用join()方法 分隔拆分后的数组
- 代码管理学:功能实现,一定要与界面分开
- vs插件VS10x CodeMap 注册码
- python基础学习--猜拳游戏
- Win7去掉/恢复快捷方式箭头
- Windows下智能卡开发
- vs打开别人cpp_和女朋友定了间主题酒店,结果打开门后崩溃了...哈哈哈哈哈照片xswl!...
- bat 自定义位数随机密码生成器
- 2010新浪笔试---数据挖掘
- Oracle之数据对象(同义词、序列、视图、表空间、索引)
- 程序员为程序员推荐:我觉得这本书不错,分享给你
- Keras少量样本训练强大图像分类模型
- leetcode:641. 设计循环双端队列
热门文章
- 今日头条校招2017.7.21编程3,PM、idea、程序员
- 15. R的bnlearn包中的per.node.score函数的学习探究
- Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
- Kibana 的用途是什么?
- 最新校招笔试面试六十题
- 关于原生table表单在vue中的遍历和合并行
- 【古典入门】巴洛克音乐
- 稻城亚丁神州租车自驾游,一生一定要去一次的地方
- localstorage在苹果手机浏览器无效
- autojs之高德地图定位