hls&flv直播请求过程
hls&flv直播请求过程
直播类产品层出不穷,从各方面塑造了我们的生活方式。直播产品中,延时是决定用户体验的关键因素,它也将间接决定直播产品的成败。这其间,对延时影响较大的就是直播架构中选择的直播协议。
一、HLS 的直播请求详情
1. 先通过循环的加载m3u8文件
2. 加载最新一次m3u8中包含的最新的ts切片,达到直播的效果的。之所以能循环加载,就是因为: 直播的m3u8文件中,没有 #EXT-X-ENDLIST 参数,也就是说,没有结束,需要一直加载。
第一次加载m3u8 的内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:31
#EXT-X-TARGETDURATION:5
#EXTINF:5.079,
31.ts
#EXTINF:5.083,
32.ts
#EXTINF:5.201,
33.ts
第二次加载m3u8 的内容是:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:32
#EXT-X-TARGETDURATION:5
#EXTINF:5.083,
32.ts
#EXTINF:5.201,
33.ts
#EXTINF:5.100,
34.ts
我们能看到,第一次加载m3u8时,ts切片,最后一个切片,名字是 33.ts;第二次加载m3u8时,ts切片,最后一个切片,名字是 34.ts ;
并且,m3u8文件中没有 #EXT-X-ENDLIST
就是通过这种循环加载的方式,这个直播,能一直循环加载下去。下面,我们看下实际的播放加载过程:
1. 首先加载m3u8文件,文件包含 113.ts 114.ts 115.ts 三个文件
2. 因为这是第一次加载m3u8文件,所以,前面是没有加载ts文件的,所以,这次m3u8的内容就是全新的,三个ts文件都需要加载。
3. 在播放器认为应该继续加载新的视频文件时,会先加载m3u8文件,这时,m3u8文件已经更新,和第一次加载的m3u8相比,有一个 116.ts 是需要加载的。
所以,下面只加载了116.ts
基于上述的逻辑,播放器会定期(不一定是固定的时间)的去加载m3u8的视频列表文件,以获取最新的ts视频文件名,从而加载视频文件,完成直播。
二、flv直播请求过程
1. flv简介:将直播流式数据虚拟成为一个无限大的flv文件,并通过HTTP协议进行传输。客户端仅发送一次HTTP GET请求,请求中携带需要访问的直播流名,服务器返回HTTP响应,不携带消息体内容长度直接发送无限长flv文件内容,或者使用HTTP CHUNK模式将无限长flv文件按分段模式发送。客户端获得HTTP消息体中的flv内容时即可播放。
2. 测试请求响应头
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 21 Sep 2019 07:38:01 GMT
Content-Type: video/x-flv
Transfer-Encoding: chunked
Connection: close
Expires: Wed, 21 Sep 2020 07:38:00 GMT
Cache-Control: no-cache
HTTP Header中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。而HTTP-flv这种流,服务器是不可能预先知道内容大小的,这时就可以使用Transfer-Encoding: chunked模式来传输数据了
hls&flv直播请求过程的更多相关文章
- Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)
一. lal 简介 lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器.类似于nginx-rtmp-module等服务,但支持更多的协议,提供更丰富的功能. ...
- Car-eye-http-flv-module 实现nginx-rtmp-mudule HTTP方式的FLV直播功能
nginx-rtmp-mudule RTMP 是一款优秀的Car-eye-http-flv-module 是在nginx-rtmp-mudule RTMP基础上修改的流媒体服务器,除了支持flash播 ...
- ASP.NET 运行时详解 揭开请求过程神秘面纱
对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...
- Http协议简单解析及web请求过程
HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包含下面几个步骤: 1) ...
- web应用程序servlet的映射名称的规则及请求过程
首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servl ...
- zepto源码研究 - ajax.js(请求过程中的各个事件分析)
简要:ajax请求具有能够触发各类事件的功能,包括:触发全局事件,请求发送前事件,请求开始事件,请求结束事件等等,贯穿整个ajax请求过程,这是非常有用的,我们可以利用这些事件来做一些非常有意思的事情 ...
- mvc请求过程总结
前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...
- 【转】DHCP的请求过程
首先你得清楚DHCP的请求过程:1.client向server发送请求,发向广播地址2.server向client回应一个IP,发向单播地址3.client向server回应一个确认,发向广播地址,表 ...
- Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)
前言: 上一章详细阐述了dojo的事件绑定操作,本章将讲解dojo的请求操作 注:dojo的请求操作与js和jquery完全不同! 1.dojo的请求 dojo通过request.get()/.put ...
随机推荐
- 商城06——solr索引库搭建&solr搜索功能实现&图片显示问题解决
1. 课程计划 1.搜索工程的搭建 2.linux下solr服务的搭建 3.Solrj使用测试 4.把数据库中的数据导入索引库 5.搜索功能的实现 2. 搜索工程搭建 要实现搜索功能,需要搭建 ...
- Nginx 如何自定义变量?
之前的两篇文章 Nginx 变量介绍以及利用 Nginx 变量做防盗链 讲的是 Nginx 有哪些变量以及一个常见的应用.那么如此灵活的 Nginx 怎么能不支持自定义变量呢,今天的文章就来说一下自定 ...
- Mysql使用xtrabackup备份失败处理
在生产环境中使用的是xtrabackup,对mysql进行备份,每天0点开始备份,周日是全量备份,其他时间是基于周日做的增量备份,通过脚本实现,每天备份完成后会发送短信,突然有一天,备份全部失败,手动 ...
- Python-16-分配参数
与收集参数相反,这里用*和**分配参数 def add(x, y): return x + y 使用*分配元组 params = (1, 2) >>> ad ...
- mysql事务的坑----MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- Springboot 集成 ElasticSearch 踩坑
这里只涉及到基础使用 导包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- 面试官:你刚说你喜欢研究新技术,那么请说说你对 Blazor 的了解
阅读本文大概需要 1.5 分钟. 最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历. 面试官:"你刚说你喜欢研究新技术,那么你对 Blazor 了解多少?&q ...
- WAF产品记录
WAF产品化 2011-1-13 目标:稳定的版本 和 标准的手册 1.硬件差异问题,争取了OEM提供硬件样机. 2.OEM功能本来在我们手里,为了更好产品化,配合移交工作. 3.我们做好 产品生 ...
- Linux下nginx反向代理服务器安装与配置实操
1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...
- Redis系列(六):数据结构QuickList(快速列表)源码解析
1.介绍 Redis在3.2版本之前List的底层编码是ZipList和LinkedList实现的 在3.2版本之后,重新引入了QuickList的数据结构,列表的底层都是QuickList实现 当L ...