HLS详解(看这个就够了)

  • HLS概述
  • 官方定义
  • 优劣性
    • 优点:
    • 缺点:
  • 格式解析
  • HLS文件
    • playlist(m3u8)介绍
    • HLS playlist(m3u8)格式详解
  • 播放模式
    • 点播VOD
    • Live 模式

HLS概述

HLS是HTTP Live Streaming的简称,是苹果公司提出的基于HTTP的流媒体网络传输协议,它的基本原理也是服务端把文件或媒体流按照不同的码率切分成一个个小片段进行传输,客户端在播放码流时,可以根据自身的带宽及性能限制,在同一视频内容的不同码率的备用源中,选择合适码率的码流进行下载播放。在传输会话开始时,客户端首先需要下载描述不同码流元数据的M3U8索引文件。

官方定义

从概念上讲,HTTP Live Streaming由三个部分组成:服务器组件,分发组件和客户端软件。

在典型配置中,硬件编码器接受音频视频输入,将其编码为HEVC视频和AC-3音频,然后输出片段化的MPEG-4文件或MPEG-2传输流。然后,软件流分段器将流分成一系列简短的媒体文件,这些文件放在Web服务器上。分段器还创建并维护一个包含媒体文件列表的索引文件。索引文件的URL在Web服务器上发布。客户端软件读取索引,然后按顺序请求列出的媒体文件并显示它们,而各段之间没有任何暂停或间隙。

服务器组件(Server Component)
服务器组件负责获取媒体的输入流并对其进行数字编码。它以适合交付的格式封装它们,并准备封装的媒体以进行分发。
对于现场事件,服务器需要媒体编码器(可以是现成的硬件),以及一种将编码的媒体拆分为片段并将其保存为文件的方法,该方法可以是诸如由Microsoft提供的媒体流分段器之类的软件。 Apple或集成第三方解决方案的一部分。

分配组件(Distribution Component)
分发系统是Web服务器或Web缓存系统,可通过HTTP将媒体文件和索引文件传递给客户端。不需要自定义服务器模块即可交付内容,并且通常在Web服务器上只需要很少的配置。要实际部署HTTP Live Streaming,您需要为浏览器或客户端应用程序创建HTML页面以充当接收器。您还需要使用Web服务器,以及将实时流编码为包含HEVC或H.264视频以及AAC或AC-3音频的分段MPEG-4媒体文件的方式。

客户端软件(Client Software)
客户端软件负责确定要请求的适当媒体,下载这些资源,然后重新组合它们,以便可以将媒体连续地呈现给用户。客户端软件包含在iOS 3.0和更高版本中以及安装了Safari 4.0或更高版本的计算机上。

客户端软件首先使用标识流的URL获取索引文件。索引文件又指定可用媒体文件,解密密钥以及任何可用备用流的位置。对于选定的流,客户端按顺序下载每个可用的媒体文件。每个文件包含流的连续段。一旦下载了足够数量的数据,客户端便开始向用户展示重组后的流。

客户端负责获取所有解密密钥,验证或提供允许验证的用户界面以及根据需要解密媒体文件。

此过程将继续进行,直到客户端在索引文件中遇到EXT-X-ENDLIST标记为止。如果不存在EXT-X-ENDLIST标记,则索引文件是正在进行的广播的一部分。在正在进行的广播期间,客户端会定期加载索引文件的新版本。客户端在更新的索引中查找新的媒体文件和加密密钥,并将这些URL添加到其队列中。

项目 释义
Audio/Video inputs 视频源可以是任意格式,可以是离线文件或实时码流
Media encoder 将视频源中的视频数据转码到目标编码格式(H264)的视频数据
stream segmenter 对编码后的视频进行切片,视频会被转换成HLS格式的视频(即TS和m3u8文件
index file 索引文件,后缀以".m3u8"结尾的文件
ts 缓存内容,后缀以".ts"结尾的文件
HTTP 传输协议

优劣性

优点:

  1. 基于HTTP传输,防止防火墙屏蔽;
  2. 码率自适应;
  3. 服务器易于拓展,易于http做负载均衡;

缺点:

  1. 时延较长(10秒左右),对时延敏感慎用;
  2. 对服务器内存要求高;

格式解析

项目 释义
网络协议 HTTP
封装格式 MEPG-2 TS
编码格式 视频编码格式为H.264,音频编码格式为MP3、AAC、AC-3或EC-3
索引文件 M3U8

HLS文件

项目 释义
index file 主索引,后缀以".m3u8"结尾的文件
Alternate-A index file 子索引,后缀以".m3u8"结尾的文件
ts 实际缓存内容,后缀以".ts"结尾的文件

HLS有两级索引

  1. 第一级索引存放的是不同码率的HLS源的M3U8地址,也就是二级索引文件的地址。
  2. 第二级索引则记录了同一码率下TS切片序列的下载地址。

客户端获取一级M3U8文件后,根据自己的带宽,去下载相应码率的二级索引文件,然后再按二级索引文件的切片顺序下载并播放TS文件序列。

HLS存储目录截图如下:

playlist(m3u8)介绍

HLS中的playlist是一个UTF-8编码的文本文件,其中包含了URL和描述性标签。一个常规的playlist如下所示:

#EXT-X-VERSION:3
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1# Old-style integer duration; avoid for newer clients.
#EXTINF:10,
http://media.example.com/segment0.ts# New-style floating-point duration; use for modern clients.
#EXTINF:10.0,
http://media.example.com/segment1.ts
#EXTINF:9.5,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST

其中以’#‘打头的行都是标签,HLS标准规定对于标准中未定义的标签,可以直接忽略;也就是说’#'也可以作为注释行。这里说明下上面M3U8文件的构成:

  1. #EXT-X-VERSION:表示协议的版本号,而且每个M3U8中只能出现一次该标签。对于具体版本号的定义,可以参考标准的第7节。
  2. #EXTM3U:作为M3U文件的标识符,可以用于文件类型识别,这是必须的字段。
  3. #EXT-X-TARGETDURATION:表示最长分片的时长,这是必须的字段。
  4. #EXT-X-MEDIA-SEQUENCE:表示playlist文件中第一个分片的序列号(整数值)。如果M3U8文件中没有该字段,则playlist中第一个分片的序列号必须是0。
  5. #EXTINF:表示下一个分片的时长。对于每个分片,必须有该字段。 对于#EXT-X-VERSION小于3的情况下,duration必须是整数;其他情况下duration可以是浮点数和整数。title是一个可选字段,仅用于增强可读性。
  6. #EXT-X-ENDLIST:该字段表示分片结束,不会在playlist文件中添加新的分片。

上面介绍的是最常见的playlist,还有一种playlist,仅包含播放节目列表信息,在HLS中称为master playlist,也是我们上图描述二级索引的结构,其示例如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000, RESOLUTION=720x480
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=2, BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000, RESOLUTION=1080x720
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=3, BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000, RESOLUTION=1920x1080
http://example.com/high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=4, BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8

其中包含的标签说明如下:

  1. #EXT-X-STREAM-INF:用于标识一个Variant Stream,这是由一系列的Redition组成的。该标签的属性列表中包含了Variant Stream的描述信息。例如:

    • BANDWIDTH表示Variant Stream中的峰值比特率,单位bits/s。
    • AVERAGE-BANDWIDTH表示Variant Stream中的平均比特率,单位bits/s。
    • CODECS包含Variant Stream中音视频编码格式相关的信息,比如上面的"mp4a.40.5"。
    • RESOLUTION包含Variant Stream中对应视频流的分辨率。
    • FRAME-RATE表示Variant Stream中的视频帧率。
  2. M3U8中还有一个标签需要关注下,EXT-X-PLAYLIST-TYPE。该标签只有两个值:EVENTVOD。EVENT指的是分片工具只能在M3U8末尾添加新的分片的信息,但不能删除老的分片,通常比较适用于直播+录播的情况(既要提供给客户端点播功能,也要对实时场景进行录制,直播完成之后EVENT就自然退化为VOD)。但是对于M3U8中存在#EXT-X-ENDLIST标签时,可以忽略EXT-X-PLAYLIST-TYPE。

  3. 还有一种情况,如果M3U8中不存在#EXT-X-ENDLIST以及EXT-X-PLAYLIST-TYPE标签,则服务器端可以任意更新playlist内容。

HLS playlist(m3u8)格式详解

可参考:
https://www.cnblogs.com/tocy/p/hls-playlist-example.html
https://blog.csdn.net/weixin_33735077/article/details/86362702
https://blog.csdn.net/weixin_38451161/article/details/101033178

播放模式

点播VOD

特点就是当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的m3u8的结构。

Live 模式

就是实时生成M3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。

客户端在播放VOD模式的视频时其实只需要下载一次一级index文件和二级index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次二级index文件,然后下载ts文件,再下载二级index文件(这个时候这个二级index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。

参考链接:
https://www.jianshu.com/p/426425cad08a
https://www.jianshu.com/p/32417d8ee5b6
https://www.jianshu.com/p/6de22b88dc73
https://blog.csdn.net/u011857683/article/details/84863250
https://blog.csdn.net/qiandublog/article/details/53434081
https://blog.csdn.net/weixin_38451161/article/details/101033178
https://www.cnblogs.com/tocy/p/hls-playlist-example.html

HLS详解(看这个就够了)相关推荐

  1. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了

    6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...

  2. 计算机网络参数怎么看,电脑显示器参数详解 看完秒懂! 显示器参数怎么看?...

    显示器参数怎么看?无论是显示器的宣传.购买页面,还是专业媒体的显示器评测中,我们都会看到一些用来描述显示器性能的参数.小编觉着,显示器就像是电脑的一张面孔,显示着它的各种表情,也负责与用户的沟通,而显 ...

  3. TCP/IP概述和详解--一篇就够

    OSI(Open System Interface)模型属于理论的,主要看TCP/IP的实现. 先来个图 协议解释 TCP/IP模型分成:物理层(网络接口层).数据链路层.网络层.传输层.应用层 5层 ...

  4. 查看计算机配置讲解,教您如何看显示器参数!电脑显示器常见参数详解,看完秒懂!...

    由于显示器可选的范围比较广,同一个尺寸大小的显示器,不同品牌不同型号不同参数会有上百种可供选择,其实我们只需明确了预算与用途,才可以正确选择合适自己的显示器.那么如何看显示器参数?下面装机之家分享一下 ...

  5. Java socket详解,看这一篇就够了

    刚给大家讲解Java socket通信后,好多童鞋私信我,有好多地方不理解,看不明白.特抽时间整理一下,详细讲述Java socket通信原理和实现案例.整个过程楼主都是通过先简单明了的示例让大家了解 ...

  6. Symbol 进阶底层详解(看这一篇就够了)

    Symbol() 是在 ES6 中提出来的一个新的基础类型,它主要用来定义一个唯一的属性值,防止重复命名,再对象中有着重要的作用,请耐心看完,最下边有 Symbol 进阶,对初学者来说不太友好,若想深 ...

  7. python虚拟环境管理工具_Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了...

    前言 Python虚拟环境是一个虚拟化,从电脑独立开辟出来的环境.在这个虚拟环境中,我们可以pip安装各个项目不同的依赖包,从全局中隔离出来,利于管理. 传统的Python虚拟环境有virtualen ...

  8. strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数 事例展示 函数介绍 函数声明:char *strstr(const char *str1, const char ...

  9. Java NIO全面详解(看这篇就够了)

    很多技术框架都使用NIO技术,学习和掌握Java NIO技术对于高性能.高并发网络的应用是非常关键的 NIO简介 NIO 中的 N 可以理解为 Non-blocking,不单纯是 New,是解决高并发 ...

最新文章

  1. 网络流媒体协议 RTSP协议
  2. Beta阶段项目总结
  3. xampp的Apache无法启动解决方法
  4. LeetCode 5. 最长回文子串(动态规划)
  5. 使用Cloud Studio在线编写、调试和管理Spring Boot应用
  6. android 时间控件使用,android 时间控件的使用
  7. (原创)c#学习笔记08--面向对象编程简介02--OOP技术02--继承
  8. 计算机access预测题,2016计算机二级《Access》考试预测题及答案
  9. 第2章[2.2] Ext JS多类型终端-电脑、移动端(手机、平板)
  10. C++ VS Java 系列 —— 访问控制
  11. 现在学python2还有意义吗_现在学python该学python2还是python3?
  12. Captura录屏软件使用说明
  13. 360度全景视频html,360度全景视频是怎么拍摄出来的?
  14. java:熊怪吃核桃
  15. 快速幂运算(入门完整版)
  16. Excel里面方框打勾
  17. 【学习笔记】多线程进阶JUC
  18. Linux sort --将文本文件内容加以排序
  19. 免费的网上商城商品管理系统
  20. 出现多个虚拟显示器(通用非即插即用监视器)处理办法

热门文章

  1. JAVA字符串常量和变量相加问题
  2. Oracle动态注册服务名
  3. 13.1、QT::TestPainter操作
  4. C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码
  5. 仿微信页面——Android程序设计
  6. 【asm,1】ASM的安装+ oracle安装
  7. 精心画了一张 vim 壁纸
  8. Logic Pro X 10.5.1 macOS 苹果音乐制作宿主软件下载
  9. 苹果又被「啃」掉一口 打破应用商店垄断终有实质性进展
  10. 无名数学题1(国王奇遇记减弱版)