HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。

概述

原理介绍

通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件,然后提供一个配套的媒体列表文件,提供给客户端,让客户端顺序地拉取这些媒体文件播放,来实现看上去是在播放一条流的效果。由于传输层协议只需要标准的 HTTP 协议,HLS 可以方便的透过防火墙或者代理服务器,而且可以很方便的利用 CDN 进行分发加速,并且客户端实现起来也很方便.

整体架构

HLS 的架构分为三部分:Server,CDN,Client 。即服务器、分发组件和客户端。

下面是 HLS 整体架构图:

HLS 整体架构图

服务器用于接收媒体输入流,对它们进行编码,封装成适合于分发的格式,然后准备进行分发。

分发组件为标准的 Web 服务器。它们用于接收客户端请求,传递处理过的媒体,把资源和客户端联系起来。

客户端软件决定请求何种合适的媒体,下载这些资源,然后把它们重新组装成用户可以观看的连续流。

HLS 协议分析

HLS Playlist

其实,HLS 协议的主要内容是关于 M3U8 这个文本协议的,其实生成与解析都非常简单。为了更加直接地说明这一点,我下面举两个简单的例子:

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

简单的 Media Playlist

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:7.975,
https://priv.example.com/fileSequence2680.ts
#EXTINF:7.941,
https://priv.example.com/fileSequence2681.ts
#EXTINF:7.975,
https://priv.example.com/fileSequence2682.ts

包含多种比特率的 Master Playlist

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
  • HLS 通过 URI(RFC3986) 指向的一个 Playlist 来表示一个媒体流

  • 一个 Playlist 可以是一个 Media Playlist 或者 Master Playlist, 使用 UTF-8 编码的文本文件,包含一些 URI 跟描述性的 tags

  • 一个 Media Playlist 包含一个 Media Segments 列表,当顺序播放时,能播放整个完整的流

  • 要想播放这个 Playlist, 客户端需要首先下载他,然后播放里面的每一个 Media Segment

  • 更加复杂的情况是,Playlist 是一个 Master Playlist, 包含一个 Variant Stream 集合,通常每个 Variant Stream 里面是同一个流的多个不同版本 (如:分辨率,码率不同)

  • 一个 Playlist 文件必须通过 URI(.m3u8 或 m3u) 或者 HTTP Content-Type 来识别 (application/vnd.apple.mpegurlaudio/mpegurl)

  • 换行符可以用 \n 或者 \r\n

  • # 开头的是 tag 或者注释,以 #EXT 开头的是 tag, 其余的为注释,在解析时应该忽略

  • Playlist 里面的 URI 可以用绝对地址或者相对地址,如果使用相对地址,那么是相对于 Playlist 文件的地址

HLS Media Segments

  • 每一个 Media Segment 通过一个 URI 指定,可能包含一个 byte range

  • 每一个 Media Segmentduration 通过 EXTINF tag 指定

  • 每一个 Media Segment 有一个唯一的整数 Media Segment Number

  • 有些媒体格式需要一个 format-specific sequence 来初始化一个 parser, 在 Media Segmentparse 之前。这个字段叫做 Media Initialization Section, 通过 EXT-X-MAP tag 来指定。支持的 Media Segment 格式

HLS TAGS

  • Basic Tags: 用在Media Playlist和Master Playlist里面
    • EXTM3U: 必须在文件的第一行,标识是一个 Extended M3U Playlist 文件

    • EXT-X-VERSION: 表示 Playlist 兼容的版本

  • Media Segment Tags: 只能出现在Media Playlist里面
    • EXTINF: 用于指定 Media Segmentduration

    • EXT-X-BYTERANGE: 用于指定 URIsub-range

    • EXT-X-DISCONTINUITY: 表示不连续

    • EXT-X-KEY: 表示 Media Segment 已加密,该值用于解密

    • EXT-X-MAP: 用于指定 Media Initialization Section

    • EXT-X-PROGRAM-DATE-TIME: 和 Media Segment 的第一个 sample 一起来确定时间戳

    • EXT-X-DATERANGE: 将一个时间范围和一组属性键值对结合到一起

  • Media Playlist tags: 只能出现在Media Playlist里面
    • EXT-X-TARGETDURATION: 用于指定最大的 Media Segment duration

    • EXT-X-MEDIA-SEQUENCE: 用于指定第一个 Media SegmentMedia Sequence Number

    • EXT-X-DISCONTINUITY-SEQUENCE: 用于不同 Variant Stream 之间同步

    • EXT-X-ENDLIST: 表示结束

    • EXT-X-PLAYLIST-TYPE: 可选,指定整个 Playlist 的类型

    • EXT-X-I-FRAMES-ONLY: 表示每个 Media Segment 描述一个单一的 I-frame

  • Master Playlist tags: 只能出现在Master Playlist中
    • EXT-X-MEDIA: 用于关联同一个内容的多个 Media Playlist 的多种 renditions

    • EXT-X-STREAM-INF: 用于指定一个 Variant Stream

    • EXT-X-I-FRAME-STREAM-INF: 用于指定一个 Media Playlist 包含媒体的 I-frames

    • EXT-X-SESSION-DATA: 存放一些 session 数据

    • EXT-X-SESSION-KEY: 用于解密

  • Media or Master Playlist Tags: 可以出现在Media Playlist或者Master Playlist中,但是如果同时出现在同一个Master Playlist和Media Playlist中时,必须为相同值
    • EXT-X-INDEPENDENT-SEGMENTS: 表示每个 Media Segment 可以独立解码

    • EXT-X-START: 标识一个优选的点来播放这个 Playlist

HLS 播放

播放未加密 HLS

我们通过 VLC 播放器播放苹果官方提供的一个例子:http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8,并使用 Wirshark 对其中交互进行抓包。

GET /iphone/samples/bipbop/gear1/prog_index.m3u8 HTTP/1.1
Host: devimages.apple.com
Accept: */*
Accept-Language: zh_CN
User-Agent: VLC/3.0.8 LibVLC/3.0.8
Range: bytes=0-
​HTTP/1.1 206 Partial ContentAccept-Ranges: bytesContent-Type: audio/x-mpegurlETag: "50117c8233644c19b5ab49551b72507f:1239907352"Last-Modified: Thu, 16 Apr 2009 18:42:32 GMTServer: AkamaiNetStorageDate: Sun, 22 Nov 2020 15:01:49 GMTContent-Range: bytes 0-7018/7019Content-Length: 7019X-Cache: TCP_MEM_HIT from a184-26-91-45.deploy.akamaitechnologies.com (AkamaiGHost/10.2.0.2-31441410) (-)Connection: keep-alive
​#EXTM3U#EXT-X-TARGETDURATION:10#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10, no descfileSequence0.ts#EXTINF:10, no descfileSequence1.ts#EXTINF:10, no descfileSequence2.ts#EXTINF:10, no desc......#EXTINF:1, no descfileSequence180.ts#EXT-X-ENDLIST

我们可以看到返回的 M3U8 里面他有一个一个 ts 视频片段,这个一个一个视频片段就是我们需要的播放的视频片段。

#EXTINF` 表示每个 `ts` 切片视频文件的时长。 `#EXT-X-TARGETDURATION` 指定当前视频流中的切片文件的最大时长,也就是说这些 `ts` 切片的时长不能大于 `#EXT-X-TARGETDURATION` 的值。 `#EXT-X-MEDIA-SEQUENCE` 第一个 `ts` 分片的序列号 `#EXT-X-ENDLIST` 这个表示视频结束,有这个标志同时也说明当前的流是一个非直播流。 `#EXT-X-PLAYLIST-TYPE:VOD` 的意思是当前的视频流并不是一个直播流,而是点播流,换句话说就是该视频的全部的 `ts` 文件已经被生成好了 `#EXT-X-ALLOW-CACHE` 是否允许 `cache

播放加密 HLS

HLS 协议总结

优点

  • 客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可。

  • 使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器,CDN 支持良好。

  • Apple 的全系列产品支持,不需要安装任何插件就可以原生支持播放 HLS, 目前 Android 也加入了对 HLS 的支持。

  • 自带多码率自适应机制。

缺点

  • 相比 RTMP 这类长连接协议,延时较高,难以用到互动直播场景。

  • 对于点播服务来说,由于 TS 切片通常较小,海量碎片在文件分发,一致性缓存,存储等方面都有较大挑战。

改进

  • 由于客户端每次请求 TSM3U8 有可能一个新的连接请求,无法有效的标识客户端,一旦出现问题,基本无法有效的定位问题。

  • 一般工业级的服务器都会对传统的 HLS 做一些改进,常见优化是对每个 M3U8 文件增加 Session 来标识一条 HLS 连接。

  • 不管通过哪种方式,最终我们都能通过一个唯一的 id 来标识一条流,这样在排查问题时就可以根据这个 id 来定位播放过程中的问题。

流媒体传输 - HLS 协议相关推荐

  1. 流媒体传输 - RTMP 协议

    RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.它是由 Adobe 公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multip ...

  2. 流媒体传输 - RTMP 协议报文分析

    握手之后,连接开始对一个或多个 chunk stream 进行合并.创建的每个块都有一个唯一 id 对其进行关联,这个 id 叫做 chunk stream id.这些块通过网络进行传输.传递时,每个 ...

  3. 流媒体封装格式和流媒体传输协议介绍

    1.流媒体封装格式介绍 一个流媒体文件由音频流和视频流两种数据组成. h264/mpeg4等就是视频流编码格式,视频流一般以帧的单位存在,i帧.p帧.b帧,帧率(frame rate)是每秒显示帧数( ...

  4. 视频云、流媒体以及相关协议的理解

    一.视频云 1.视频云是什么? 视频云是基于云计算技术的理念,采用视频作为"云端"向"终端"呈现处理结果的一种云计算方案,包括云储存.云转码.云直播.云加密.云 ...

  5. 技术博客|第15期:流媒体传输协议简介 - HLS协议

    在Hulu及Disney+流媒体平台上,自适应流媒体传输技术被广泛使用,它可以根据用户的网络情况相应地调整视频码率,为用户带来良好的观看体验.为了实现这一点,视频将被编码成不同码率的版本,并且在每个版 ...

  6. 流媒体传输协议浅析(一)

    一.常见的流媒体协议 关于流媒体传输协议,涉及到不同领域,不同业务场景,种类众多,下面一张图是目前常见的流媒体协议. 常见的流媒体传输协议 1)从交互方式来看,流媒体分为点播(VOD)和直播(LIVE ...

  7. 最详细的流媒体传输协议-rtsp协议详解

    流媒体传输协议-rtsp协议详解 参阅:RTSP协议详解和分析从零开始写一个RTSP服务器(一)RTSP协议讲解关于RTSP_RTP_RTCP协议的深刻初步介绍 rtsp RTSP出现以前,最热的大概 ...

  8. 流媒体点播/直播服务架构设计,类HLS协议

    有一个关于通信网络的冷笑话: 2G时代,你可以看苍井空.txt 3G时代,你可以看苍井空.jpg 4G时代,你可以看苍井空.avi 于是可以看到,如今的网络时代已经进入了流媒体时代,了解如何搭建一个流 ...

  9. RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术

    目录标题 1. 引言 1.1 流媒体传输技术的重要性 1.2 为什么选择RTMP协议 1.3 RTMP协议的发展与应用 2. RTMP协议基础 2.1 RTMP协议简介 2.2 RTMP协议与其他流媒 ...

最新文章

  1. mysql 乐观锁 命令_MySQL-乐观锁
  2. [Android] ubuntu 下不识别 Android 设备
  3. 【设计模式】原型模式 ( 浅拷贝 | 深拷贝 | 原型与单例冲突 | 禁用 final )
  4. 用PhotoSwipe制作相册,手势可放大
  5. 在线合成车牌照片【模拟车牌,用于车牌识别项目测试】
  6. SCSI代码分析(2)SCSI设备的管理1
  7. 十大排序算法之二路归并排序(难点为对于递归的理解)
  8. 11.scrapy框架持久化存储
  9. Radius协议简单介绍
  10. 使用python中的matplotlib绘制路径图
  11. 【Grafana】通过阿里云日志服务监控Nginx访问日志显示统计信息
  12. 暴雪战网重装失败问题解决
  13. TSC打印机使用教程终极版(转)
  14. 【2022国赛模拟】摆(bigben)——行列式、杜教筛
  15. 黄蓝专场之 | ofo小黄车的执念与博弈
  16. 计算机没有休眠睡眠状态,电脑没有睡眠模式_电脑怎么没有睡眠模式
  17. 笔记本电脑合盖无法休眠,开盖黑屏
  18. 包包的结构制图_原来可以用R这么画基因结构图
  19. 在线将html文件转pdf,在线将html转换成pdf文件 示例源码
  20. 弘辽科技:淘宝店铺转化率变差教你快速排查

热门文章

  1. hive sql 分组随机取数
  2. ajax传递数组怎么传?ajax数组传递
  3. 效率神器Apifox_API 文档、API 调试、API Mock、API 自动化测试工具推荐
  4. Windows系统设置定时任务
  5. jdk配置环境变量(win10)
  6. UDP多播:一对多数据收发
  7. C# windows窗口应用程序切换主界面的显示内容
  8. 数据结构 - 迭代、递归和分治思想
  9. html 5抽奖特效,利用HTML5实现Canvas大转盘抽奖特效
  10. 【Python 实战基础】如何实现一个英汉翻译小字典