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直播请求过程的更多相关文章

  1. Golang开源流媒体服务器(RTMP/RTSP/HLS/FLV等协议)

    一. lal 简介 lal是开源直播流媒体网络传输项目,主要由三部分组成: lalserver:流媒体转发服务器.类似于nginx-rtmp-module等服务,但支持更多的协议,提供更丰富的功能. ...

  2. Car-eye-http-flv-module 实现nginx-rtmp-mudule HTTP方式的FLV直播功能

    nginx-rtmp-mudule RTMP 是一款优秀的Car-eye-http-flv-module 是在nginx-rtmp-mudule RTMP基础上修改的流媒体服务器,除了支持flash播 ...

  3. ASP.NET 运行时详解 揭开请求过程神秘面纱

    对于ASP.NET开发,排在前五的话题离不开请求生命周期.像什么Cache.身份认证.Role管理.Routing映射,微软到底在请求过程中干了哪些隐秘的事,现在是时候揭晓了.抛开乌云见晴天,接下来就 ...

  4. Http协议简单解析及web请求过程

    HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. 基于HTTP协议的客户端/服务器请求响应机制的信息交换过程包含下面几个步骤: 1)    ...

  5. web应用程序servlet的映射名称的规则及请求过程

    首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servl ...

  6. zepto源码研究 - ajax.js(请求过程中的各个事件分析)

    简要:ajax请求具有能够触发各类事件的功能,包括:触发全局事件,请求发送前事件,请求开始事件,请求结束事件等等,贯穿整个ajax请求过程,这是非常有用的,我们可以利用这些事件来做一些非常有意思的事情 ...

  7. mvc请求过程总结

    前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...

  8. 【转】DHCP的请求过程

    首先你得清楚DHCP的请求过程:1.client向server发送请求,发向广播地址2.server向client回应一个IP,发向单播地址3.client向server回应一个确认,发向广播地址,表 ...

  9. Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)

    前言: 上一章详细阐述了dojo的事件绑定操作,本章将讲解dojo的请求操作 注:dojo的请求操作与js和jquery完全不同! 1.dojo的请求 dojo通过request.get()/.put ...

随机推荐

  1. (六)logback.xml 配置详解

    原文链接:https://www.cnblogs.com/taiyonghai/p/9290641.html,https://blog.csdn.net/A615883576/article/deta ...

  2. 错误处理函数-lr_continue_on_error

    在脚本的Run-time Settings中,可以设置在脚本运行过程中发生错误的处理方式.进入到Run-time Settings中,切换到Miscellaneous标签页,可以看到Error Han ...

  3. CSS中可以继承的元素(需要记住)

    可以继承的属性很少,只有颜色,文字,字体间距行高对齐方式,和列表的样式可以继承. 所有元素可继承:visibility和cursor. 内联元素可继承:letter-spacing.word-spac ...

  4. Flutter学习笔记(35)--通知Notification

    如需转载,请注明出处:Flutter学习笔记(35)--通知Notification 通知的NotificationListener和我们之前写的事件的Listener一样,都是功能性的组件,而且也都 ...

  5. Perl入门(三)Perl的数组

    Perl数组的声明方式 Perl使用"@"符号声明一个数组:@array: 使用"()"或"qw()"声明数组中元素: 一个完整的声明方式为 ...

  6. 【秒懂Java】【第1章_初识Java】01_编程语言

    各位小伙伴们好哇!从今日起,我将开始更新<秒懂Java>系列文章,从0开始讲解Java的方方面面,后面也将推出配套的视频版,欢迎大家保持关注! 我会尽力办到:在保证通俗易懂的同时,不丢失知 ...

  7. 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段

    如:SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 可以而SELECT store_name, add ...

  8. STL初步学习(map)

    3.map map作为一个映射,有两个参数,第一个参数作为关键值,第二个参数为对应的值,关键值是唯一的 在平时使用的数组中,也有点类似于映射的方法,例如a[10]=1,但其实我们的关键值和对应的值只能 ...

  9. Spring事务的传播级别

    一.简单说明 传播属性 描述 PROPAGATION_REQUIRED 如果当前没有事务,就创建一个事务,如果当前存在事务,就加入该事务. PROPAGATION_REQUIRED_NEW 当前的方法 ...

  10. 支持十万并发的黑科技-NIO

    今天是猿灯塔“365天原创计划”第3天. 今天讲: 支持十万并发的黑科技-NIO 翻译过来就是:Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC(一种远程调用) 分布式服务框架(SOA),致 ...