什么是HLS

HLS协议草案历史:https://datatracker.ietf.org/doc/rfc8216/
可直接看:https://www.rfc-editor.org/rfc/rfc8216.html
第二版:https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-00

HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分。
它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。

HLS原理


在典型的 HLS 协议实现中,一般是采集音频和视频输入,将它们编码为 H.264 和 AAC 格式,经过服务端切片处理成 切片流。
以ts为例,在这个过程中,MPEG-2 的数据流会被处理为一系列连续的小切片文件(.ts)存储在 Web 服务器上,同时服务器会生成一个索引文件对这些切片文件进行索引.m3u8,并将这个索引文件发布出去。客户端请求和读取该索引文件,并请求和获取其中的切片文件从而获得对应的媒体资源数据来进行处理和展示。

HLS是提供一个m3u8地址,他俩的区别可以说HLS是协议,m3u8是文件格式;有点像rtmp和flv的关系;

m3u8格式分析

M3U8 文件其实是一个播放列表,这个列表可能是一个媒体播放列表(Media Playlist),也可能是一个主播放列表(Master Playlist)。

  • 媒体播放列表 Meida Playlist
    当 M3U8 文件作为媒体播放列表(Meida Playlist)时,其包含的信息记录的是一系列多媒体资源切片,顺序播放这些切片,即可完整呈现多媒体资源。
    第一行的 #EXTM3U 表示文件格式。第二行的 #EXT-X-TARGETDURATION:10 表示后面的各个资源切片时长都小于或等于 10 秒。接下来,我们看到有 3 个资源切片,时长分别是 9.009 秒、9.009 秒、3.003 秒。
    在点播时,客户端首先下载 M3U8 文件,然后按照 M3U8 列表下载各个资源切片依次播放即可。在直播时,客户端则需要定时重新请求 M3U8 文件,从而检查是否有新的媒体切片需要进行下载播放。所有的这些数据都通过 HTTP 协议传输。

    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-VERSION:3
    #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
    #EXT-X-ENDLIST
    
  • 主播放列表 Master Playlist
    当 M3U8 文件作为主播放列表(Master Playlist)时,其包含多种比特率的 Master Playlist。其包含的信息是同一个媒体资源的多路流资源列表。不同的流可能有着不同的码率,不同的格式,不同的分辨率。不同的流也可以指定不同语言的音频,不同视角的视频等等。每个 URI 对应的是一个媒体播放列表。
    客户端应该根据网络状况来选择合适的流来播放,也应该根据用户的偏好来选择合适的语言和视角的流来播放。

    #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
    

支持的Media Segment格式

  • MPEG-2 Transport Streams,即最常见的ts文件
    每个 TS segment 必须值含一个 MPEG-2 Program.
    每一个 TS segment 包含一个 PAT 和 PMT, 最好在 segment 的开始处, 或者通过一个 EXT-X-MAP tag 来指定.
  • Fragmented MPEG-4
  • Packed Audio
  • WebVTTs

常用标签

  • Basic Tags:

    • EXTM3U,表示文件继承自 M3U 标准。这个标签必须放在文件第一行。
    • EXT-X-VERSION,表示文件的版本,这个与文件相关的媒体和服务器相关。
  • 媒体切片标签Media Segment Tags:Media Segment tag 只能出现在 Media Playlist 里面.

    • EXTINF,表示其后媒体切片的时长(单位为秒)。每个媒体切片之前必须指定该标签。
    • EXT-X-BYTERANGE: 用于指定 URI 的 sub-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 tags 只能出现在 Media Playlist 里面.

    • EXT-X-TARGETDURATION: 用于指定最大的 Media Segment duration.
    • EXT-X-MEDIA-SEQUENCE: 用于指定第一个 Media Segment 的 Media 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 tags 只能出现在 Master Playlist 中.

    • EXT-X-MEDIA: 用于关联同一个内容的多个 Media Playlist 的多种 renditions.
    • EXT-X-STREAM-INF: 用于指定一个 Variant Stream:
      • BANDWIDTH:BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率(必要参数)。
      • AVERAGE-BANDWIDTH:AVERAGE-BANDWIDTH的值为平均码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的平均码率。(可选参数)。
      • CODECS:CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。
      • RESOLUTION:M3U8中视频的宽高信息描述(可选参数)。
      • FRAME-RATE:子M3U8中的视频帧率(可选参数)。
    • EXT-X-I-FRAME-STREAM-INF: 用于指定一个 Media Playlist 包含媒体的 I-frames.
    • EXT-X-SESSION-DATA: 存放一些 session 数据.
    • EXT-X-SESSION-KEY: 用于解密.
  • Media or Master Playlist Tags:这里的 tags 可以出现在 Media Playlist 或者 Master Playlist 中. 但是如果同时出现在同一个 Master Playlist 和 Media Playlist 中时, 必须为相同值.

    • EXT-X-INDEPENDENT-SEGMENTS: 表示每个 Media Segment 可以独立解码.
    • EXT-X-START: 标识一个优选的点来播放这个 Playlist.

直播场景下的HLS示例

#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
  • 直播播放列表的主要特征:
    不包含 EXT-X-ENDLIST 标签。
    不包含 EXT-X-PLAYLIST-TYPE 标签。
  • 直播播放列表是一个会动态更新的 M3U8 文件,服务端会对直播流进行实时转码生成直播流切片,并定期更新 M3U8 文件。这个 M3U8 文件一般为会包括 3-5 个切片。
  • 直播播放列表中的任意一个切片的 URI 被移除时,都需要更新 EXT-X-MEDIA-SEQUENCE 标签的值(+1)。移除切片 URI 时必须按顺序,以保证客户端通过更新的 M3U8 文件拿到的是连续的切片数据。

HLS 延时分析

HLS 理论延时 = 转码1个切片的耗时时长 + 0-1个EXT-X-TARGETDURATION+ 0-n 个启动切片(苹果官方建议是请求到 3 个片之后才开始播放) + 播放器最开始请求的片的网络延时(网络连接耗时)

  1. 服务器端的编码器和流分割器生成切片文件的时常
  2. 0-1个EXT-X-TARGETDURATION:可简单理解为播放器取片的间隔时间;在客户端开始下载之前,必须等待服务器端的编码器和流分割器至少生成一个TS 文件。
  3. 启动切片:客户端播放器需要加载几个切片后起播
  4. 最后就是客户端播放器建联请求耗时了

为追求低延时效果, 可以将切片切的更小, 取片间隔做的更小,但这会增大服务端存储压力,切片服务也会增加负载;

HLS协议优缺点

  • HLS 的优势

    1. 客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可,CDN 支持良好;
    2. 自带多码率自适应,Apple 在提出 HLS 时,就已经考虑了码流自适应的问题;
    3. Apple 的全系列产品支持,由于 HLS 是苹果提出的,,所以在 Apple 的全系列产品包括 iphone, ipad, safari 都不需要安装任何插件就可以原生支持播放 HLS;
  • HLS 的劣势

    1. 延时较高,难以用到互动直播场景;
    2. 起播较http-flv慢,因为他要先下载m3u8索引问题;

HLS适用场景

在实际应用场景中,由于 HLS/M3U8/TS 这套方案在控制直播延时上不太理想,所以一般实时直播场景不会选择使用 M3U8 媒体格式。
但是,对于直播回放这种场景,由于使用 M3U8/TS 这套方案能够在直播过程中就持续生成和存储切片,所以直播回放基本上都会选择 M3U8 媒体格式。

HLS 协议详解
M3U8 格式
如何将HLS延时缩短至4秒,HLS+技术详解

音视频 HLS协议和m3u8格式分析相关推荐

  1. 走进音视频的世界——Matroska封装格式的介绍(二)

    Matroska封装格式非常灵活.兼容性好,既适用于本地文件存储又可以进行实时流传输.本篇文章主要探讨Matroska的编解码器映射,如何封装视频流.音频流.字幕流.如果要Matroska的介绍.功能 ...

  2. 音视频技术之ffplay源码分析-音视频同步

    音视频同步的目的是为了使播放的声音和显示的画面保持一致.视频按帧播放,图像显示设备每次显示一帧画面,视频播放速度由帧率确定,帧率指示每秒显示多少帧:音频按采样点播放,声音播放设备每次播放一个采样点,声 ...

  3. 网页在线视频下载教程(m3u8格式介绍及下载教程)

    简介: m3u8文件是苹果公司使用的HTTP Live Streaming(HLS)协议格式的基础.HLS是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录与 ...

  4. 走进音视频的世界——音频封装格式

    音频封装格式一般由:多媒体信息+音频流+封面流+歌词流组成.有些音乐会包含封面和歌词,则对应有封面流.歌词流.多媒体信息包括:标题.艺术家.专辑.作曲.音乐风格.日期.码率.时长.声道布局.采样率.音 ...

  5. vlc-android对于通过Live555接收到音视频数据包后的处理分析

    转载地址:https://blog.csdn.net/c_m_deng/article/details/8487456 通过ndk-gdb跟踪调试vlc-android来分析从连接到RTSP服务器并接 ...

  6. 海康视频回放,rtsp视频接口转换成.m3u8格式文件

    通过海康接口返回的rtsp视频接口,转换成.m3u8格式文件,逻辑如下 1.采用ffmpeg实时转化rtsp链接视频,转化为m3u8,存放服务器固定地址 2.采用nginx代理视频出.m3u8视频链接 ...

  7. python视频转化_python实现m3u8格式转换为mp4视频格式

    开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看, ...

  8. 国内市场主流音视频产品的区别与对比分析

    目前音视频开发市场琳琅满目,市场占有率最大的当属于RTX,视高等大公司.但是随着科技的日新月异,一些新型的公司逐渐崭露头角,市场上用户群体的多样化,,也将使用户的选择变得多样性,同时带来的是音视频厂商 ...

  9. 学习笔记(2):基于NDK、C++、FFmpeg的android视频播放器开发实战-音视频基础知识Mpeg4封装格式音视频编码格式讲解...

    立即学习:https://edu.csdn.net/course/play/7417/151027?utm_source=blogtoedu 封装:将音视频从文件中读出来 解码:解压出来,转换成显卡支 ...

最新文章

  1. The C10K problem原文翻译
  2. Spring rabbitmq消息机制--手动确认
  3. 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...
  4. HDLBits 系列(18) BCD码计数器的设计
  5. 图说机房空气焓湿处理过程
  6. mysql压力测试工具Mysqlslap
  7. [python学习] 模仿浏览器下载CSDN源文并实现PDF格式备份
  8. HarmonyOS之常用组件TabList与Tab的功能和使用
  9. 【牛客 - 272D】Where are you(Tarjan求桥)
  10. mysql5.6 python_Centos-6.5 + python3 + mysql5.6 环境搭建
  11. MVC.Net:将Reponse Redirect从Get变为Post
  12. 【Linux】预编译,编译,汇编,链接的四过程
  13. CodeIgniter的伪静态配置
  14. Linux2个文件一起打包,Linux文件压缩和打包(二)
  15. 使用浏览器测试Webservers服务时出现提示“The test form is only available for requests from the local machine.”的解决办法
  16. python之math_cmath
  17. 基于matlab的暴雨强度公式参数推求,基于MATLAB的暴雨强度公式参数推求
  18. windows10打开natapp.exe 报Error: oppen NUL: The system cannot find the file specified.
  19. js数组对象重复的数据添加标识
  20. 911报警电话数据分析

热门文章

  1. 16G116-1 装配式混凝土结构预制构件选用目录(一)
  2. 华为服务器调整raid序号顺序 和服务器安装windows报错提示我们无法在你选择的位置安装windows,请检查你的介质驱动器...
  3. Data truncated for column
  4. 双摄测距原理_技术科普 | 一颗不够就再来一颗!双摄手机原理解析
  5. Python 音频识别以及信号处理(一)
  6. Qt版本-塔防游戏实现一
  7. 电池供电遥测终端RTU 遥测终端机 低功耗遥测采集终端 智能远传 防水IP68
  8. [pyqtgraph]使用python的pyqtgraph库绘制一个3D图,3张图片按层叠加
  9. vue使用ueditor(vue-ueditor-wrap)
  10. 怎样linux部署web应用程序,Linux系统部署WEB项目(2020最新最详细)