HLS协议

HLS是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。

工作原理:整个流分成一个个小的基于 HTTP 的ts格式文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

简而言之:HLS是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。

M3U8文件简介

M3U8是Unicode版本的 M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,客户端获取 HLS 流文件,主要就是对 m3u8 文件进行解析操作。

m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。其格式如下所示:

#EXTM3U
#EXT-X-TARGETDURATION:10#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts

对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要 定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。

当 m3u8 作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream)。其格式如下所示:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8

该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容,比如不同语言的音频文件,不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。

更多详细内容,可查看:

  • Creating a Master Playlist
  • Adding Alternate Media to a Playlist

以上,就是 m3u8 文件的大概内容。下面,我们就对 m3u8 内容格式进行讲解。

m3u8 文件格式简解

m3u8 的文件格式主要包含三方面内容:

1.文件播放列表格式定义:播放列表(Playlist,也即 m3u8 文件) 内容需严格满足以下条件:

  • m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
  • m3u8 文件的每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素。
  • m3u8 文件中以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。

2.属性列表(Attribute Lists):某些特定的标签的值为属性列表。标签后面的属性列表以 逗号 作为分隔符,分离出多组不带空格的 属性/值 对。
属性/值 对的语法格式如下:

AttributeName=AttributeValue

其中:

  • 属性(AttributeName)是由 [A..Z],[0..9] 和 - 组成的不带引号的字符串。因此,属性(AttributeName)只能使用大写字母不能使用小写字母,并且属性(AttributeName)和=中间不能有空格,同理,=和AttributeValue之间也不能有空格。

  • 值AttributeValue的只能取以下类型:

    • 十进制整型(decimal-interger):由 [0..9] 之间组成的十进制不带引号的字符串,范围为0~2^64(18446744073709551615),字符长度为 1 ~ 20 之间。
    • 十六进制序列:由 [0..9] 和 [A..F] 且前缀为 0x 或 0X 组合成的不带引号的字符串。其序列的最大长度取决于他的属性名AttributeName。
    • 带符号十进制浮点型(signed-decimal-floating-point):由 [0..9],和 .组合成的不带引号的字符串。
    • 字符串(quoted-string):由双引号包裹表示的字符串。其中,0xA,0xD 和 双引号"不能出现在该字符串中。该字符串区分大小写。
    • 可枚举字符串(enumerated-string):由AttributeName显示定义的一系列不带引号的字符串。该字符串不能包含双引号",逗号,和空白字符。
    • decimal-resolution:由字符x进行隔离的两个十进制整型数。第一个整型表示水平宽度大小,第二个整型数表示垂直方向高度大小(单位:像素)。

3.标签:标签用于指定 m3u8 文件的全局参数或在其后面的切片文件/媒体播放列表的一些信息。

上文提到,m3u8 文件要么是媒体播放列表(Meida Playlist),要么是主播放列表(Master Playlist)。但无论是哪种列表,其有效内容均由两部分结构组成:

  • #EXT 开头的为标签信息,作为对媒体资源的进一步描述;
  • 剩余的为资源信息,要么是片段资源(Media Playlist)路径,要么是 m3u8 资源(Master Playlist)路径;

我们先简单介绍下 m3u8 文件媒体片段的表示方法:

  • m3u8 文件中,媒体片段可以采用全路径表示。如下所示:
#EXTINF:10.0,
http://example.com/movie1/fileSequenceA.ts

这样,获取资源片段的路径就是 m3u8 文件内指定的路径,即:http://example.com/movie1/fileSequenceA.ts

  • m3u8 文件中,媒体片段还可以使用相对路径表示。如下所示:
#EXTINF:10.0,
fileSequenceA.ts

这表示片段文件的路径是相对于 m3u8 文件路径的,即假设当前 m3u8 的路径为:https://127.0.0.1/hls/m3u8,那么,片段文件 fileSequenceA.ts 的路径即为:https://127.0.0.1/hls/fileSequenceA.ts

尽管可以在 m3u8 文件中使用绝对路径指定媒体片段资源路径,但是更好的选择是使用相对路径。相对路径相较于绝对路径更轻便,同时是相对于 m3u8 文件的 URL。相比之下,绝对路径增加了 m3u8 文件内容(更多字符),增大了文件内容,同时也增大了网络传输量。

附录

  • 苹果官方文档

  • m3u8详解

  • HTTP Live Streaming - rfc8216

  • 视频内容加密封装技术研究

M3U8 文件格式简介相关推荐

  1. M3U8文件简介及在线播放器

    m3u8文件格式 M3U8是Unicode版本的M3U,用UTF-8编码."M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Stream ...

  2. m3u8 文件格式详解

    Note: 文章中的参考链接大多来自 维基百科,需要 "科学上网" 才可以访问. 文章目录 简介 M3U8 文件简介 m3u8 文件格式简解 1.文件播放列表格式定义 2.属性列表 ...

  3. FFmpeg入门详解之105:m3u8文件格式详解

    简介 M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码."M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Stream ...

  4. 阅读笔记-m3u8文件格式

    m3u8文件格式 这是一篇阅读记录,原文-m3u8文件格式详解 1 简介 M3U8是 Unicode 版本的M3U,用 UTF-8 编码."M3U" 和 "M3U8&qu ...

  5. yaml 文件格式简介

    from: http://www.cnblogs.com/phpgo/p/6480107.html .yaml 文件格式简介 命名 YAML 的意思其实是:"Yet Another Mark ...

  6. M3U8文件格式说明及解决大量拼接ts文件时长不对问题

    M3U8 文件简介 m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist).但无论是哪种播放 ...

  7. m3u8文件格式解析

    原因:上篇博客简单分析了一下FFmpeg针对HLS拉流的简单流程,其中可知重点为m3u8文件的获取以及解析,故在此分析m3u8文件格式. 概述:用户通过RTMP协议将数据流推送到服务器,在服务器中通过 ...

  8. AVI文件格式简介与WAV文件分析

    AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...

  9. m3u8文件格式讲解,Python解析m3u8文件,并获取在线地址

    M3U(Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)这种文件格式是音视频文件的列表文件,是纯文本文件.你下载 ...

最新文章

  1. java11 新特性 详解
  2. SegNet 语义分割网络以及其变体 基于贝叶斯后验推断的 SegNet
  3. python3安卓版安装教程_安装python3的详细教程
  4. eclispse调试为什么什么都看不到_【科普6】单号出了为什么还是看不到物流信息?...
  5. java删除表操作,JDBC删除表实例
  6. 2020年,我靠Java加薪3倍工资,只因做对这件事
  7. smali-2.2.4.jar baksmali-2.2.4.jar
  8. leetcode —— 字符串相关(28、344)
  9. 我学习的自定义ASP.NET分页控件
  10. 10. 了解分配子(allocateor)的约定和限制
  11. 百度图像识别(3)垃圾分类应用
  12. ^_^Hostname openapi.alipaydev.com not verified:
  13. 什么是项目风险?如何做好项目风险管理
  14. 内网穿透工具Ngrok
  15. 使用 pdf.js 查看发票时,显示不了台头和印章的解决办法
  16. 蓝桥杯:翻转旋转变换(矩阵旋转)
  17. 算术移位 VS 逻辑移位
  18. 年轻的乔布斯也会哭泣
  19. 删除的微信聊天记录如何恢复
  20. 【java网络编程】TCP三次握手、四次挥手,常见Socket通信BIO

热门文章

  1. postgresql构建虚表
  2. 蓝牙模块HC05主从配置与连接
  3. ibus拼音输入法输入不正确的解决办法
  4. 1.5 使用电脑测试MC20的发送英文短信功能
  5. 远程视频监控之应用篇(all_test)
  6. Unity快速入门之三 脚本与事件
  7. AI图像应用—换装(持续更新)
  8. pandas 数据比对
  9. 什么是 Shell ?(超详细)
  10. 【序列模型】第二课--自然语言处理与词嵌入