音视频 HLS协议和m3u8格式分析

什么是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+技术详解

猜你喜欢

转载自blog.csdn.net/u014099894/article/details/126697403