zoukankan      html  css  js  c++  java
  • HLS playlist典型示例

    [时间:2018-06] [状态:Open]
    [关键词:流媒体,HLS,m3u8,playlist,variant, alternate]

    0 引言

    本文主要是对apple官网上的echnical Note TN2288-Example Playlist Files for use with HTTP Live Streaming一文的整理,加上rfc8216 section 8的部分内容。

    本文的目标在于整理不同类型的HLS m3u8格式,对其表征的多媒体数据做必要说明。希望读者读完本文能够基本知道目前HLS所支持的m3u8格式。至于对应字段的详细含义,建议参考rfc8216或其他资料。

    言归正传,HLS通过一些列小文件来发送音视频等多媒体数据,通常该分片长度为10s。一个索引文件,也称为playlist(中译名为播放列表),通常提供对这一系列分片文件的描述信息,通常使用.m3u8作为其后缀;对于mp3格式的playlist则使用.m3u作为后缀。该索引文件将被客户端获取,客户端解析之后可得到对应的待请求序列的信息。

    本文是对我的流媒体协议之H协议LS的扩展,如果你对HLS不了解,建议阅读之。

    1 不同HLS playlist示例文件

    本文将给出10种不同的playlist,包括内容如下:

    • 点播(VOD,Video On Demand)playlist
    • Event playlist
    • 直播playlist(滑动窗口)
    • byte-range playlist
    • 包含密钥的playlist
    • 内嵌广告的playlist
    • master playlist
    • 包含alternate media的playlist
    • I-frame playlist
    • 包含session的master playlist

    其中加粗的是我在实际工作中可能遇到比较多的。其他的仅在标准文档中见到。
    前三类playlist(VOD/Event/Live)我们可以将之称为basic playlist。master playlist是对basic playlist的描述信息。

    2 点播playlist

    HLS中点播playlist是静态的文件,生成之后一般不允许修改,server端可以预先生成切片文件。其格式如下:

    #EXTM3U
    #EXT-X-PLAYLIST-TYPE:VOD
    #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
    

    m3u8中支持绝对路径,也支持相对路径(推荐使用,节省带宽资源);以下格式与上面是等效的

    #EXTM3U
    #EXT-X-PLAYLIST-TYPE:VOD
    #EXT-X-TARGETDURATION:10
    #EXT-X-VERSION:3
    #EXTINF:9.009,
    first.ts
    #EXTINF:9.009,
    second.ts
    #EXTINF:3.003,
    third.ts
    #EXT-X-ENDLIST
    

    点播playlist最典型的特征是:

    • playlist中包含#EXT-X-ENDLIST字段
    • EXT-X-PLAYLIST-TYPE字段为VOD(可选)

    playlist可以使用http,也可以使用https协议。

    3 Event playlist

    Event playlist特征字段是:EXT-X-PLAYLIST-TYPE字段是EVENT
    在刚启动时,其m3u8内容如下:

    #EXTM3U
    #EXT-X-PLAYLIST-TYPE:EVENT
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10,
    fileSequence0.ts
    #EXTINF:10,
    fileSequence1.ts
    #EXTINF:10,
    fileSequence2.ts
    #EXTINF:10,
    fileSequence3.ts
    

    其中并不包含EXT-X-ENDLIST字段,后续结束是会自动添加。这里EVENT字段含义是可以改动playlist内容,但是只能在m3u8文件末尾添加新的分片信息,不能在文件中间添加任何内容。
    当Event playlist结束时,其内容如下:

    #EXTM3U
    #EXT-X-PLAYLIST-TYPE:EVENT
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10,
    fileSequence0.ts
    #EXTINF:10,
    fileSequence1.ts
    #EXTINF:10,
    fileSequence2.ts
    #EXTINF:10,
    fileSequence3.ts
    ...
    #EXTINF:10,
    fileSequence120.ts
    #EXTINF:10,
    fileSequence121.ts
    #EXT-X-ENDLIST
    

    Event playlist通常用于晚会或体育赛事,用于为用户提供当前时间到开播时间任意点的seek。

    4 直播playlist

    对于直播playlist,其特征字段就是没有EXT-X-ENDLIST标签,并且不存在EXT-X-PLAYLIST-TYPE标签。
    直播playlist是一个典型的滑动窗口,server端会对源格式做实时转码(存在一点延时),并定期清理已发布的分片信息。典型的滑动窗口大小为3-5个分片。其m3u8格式如下:

    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:1
    #EXTINF:10,
    fileSequence1.ts
    #EXTINF:10,
    fileSequence2.ts
    #EXTINF:10,
    fileSequence3.ts
    

    对于任意一个分片URI被移除该playlist,必须更新EXT-X-MEDIA-SEQUENCE字段(+1即可)。移除URI必须按照顺序,并保证客户端通过滑动窗口拿到连续的分片信息。按照这样更新之后的playlist如下:

    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:2
    #EXTINF:10,
    fileSequence2.ts
    #EXTINF:10,
    fileSequence3.ts
    #EXTINF:10,
    fileSequence4.ts
    #EXTINF:10,
    

    5 带有密钥的playlist

    这里的密钥是由EXT-X-KEY字段指定的,其中给出了加密方法,和密钥的存储路径。

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:7794
    #EXT-X-TARGETDURATION:15
    #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"
    #EXTINF:2.833,
    http://media.example.com/fileSequence52-A.ts
    #EXTINF:15.0,
    http://media.example.com/fileSequence52-B.ts
    #EXTINF:13.333,
    http://media.example.com/fileSequence52-C.ts
    #EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"
    #EXTINF:15.0,
    http://media.example.com/fileSequence53-A.ts
    

    6 byte-range playlist

    该类型playlist主要是使用新的字段
    #EXT-X-BYTERANGE: length[@offset]
    使用该字段,可以不用在server上存储大量的小文件,而仅通过一个文件,通过偏移量和长度来支持分片。与点播playlist中的m3u8等价的playlist内容如下:

    #EXTM3U
    #EXT-X-TARGETDURATION:11
    #EXT-X-MEDIA-SEQUENCE:0
    #EXT-X-VERSION:4
    
#EXTINF:9.009,
    #EXT-X-BYTERANGE:75232@0
    media.ts
    
#EXTINF:9.009,
    #EXT-X-BYTERANGE:82112@752321
    media.ts
    
#EXTINF:3.003,
    #EXT-X-BYTERANGE:69864
    media.ts
    

    注意这里必须指定EXT-X-VERSION字段为4,否则可能低版本HLS协议不支持。

    7 内嵌广告的playlist

    有时候我们需要在直播或点播中插入广告,广告的编码格式可能跟原来的编码格式不同,为了支持类似场景,HLS提供了EXT-X-DISCONTINUITY字段,用于通知客户端可能存在码流编码格式不连续。其对应的m3u8格式如下:

    #EXTM3U
    #EXT-X-TARGETDURATION:10
    #EXT-X-VERSION:3
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:10.0,
    ad0.ts
    #EXTINF:8.0,
    ad1.ts
    #EXT-X-DISCONTINUITY
    #EXTINF:10.0,
    movieA.ts
    #EXTINF:10.0,
    movieB.ts
    

    8 master playlist

    master playlist其中并不包含分片有关信息,而是描述了同一个源的不同编码格式,在HLS中称之为variant。master playlist中描述了variant的诸多信息,比如下载带宽、音视频编码信息、视频分辨率等等。典型的示例如下:

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

    master playlist中不包含#EXTINF字段。其中描述的每个variant都是一个独立的m3u8文件。

    9 包含alternate media的master playlist

    alternate media为HLS提供了一种外挂音频、视频、字幕的格式,可以在不改动已生成的HLS分片信息的情况下,为客户端提供新的可选媒体信息。为此,在STREAM-INF添加了AUIODVIDEO属性,以实现关联。
    该形式的m3u8格式如下:

    #EXTM3U
    
    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 1",AUTOSELECT=YES,DEFAULT=YES
    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 2",AUTOSELECT=NO,DEFAULT=NO,URI="alternate_audio_aac/prog_index.m3u8"
    
    #EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"
    
    #EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"
    gear1/prog_index.m3u8
    
    #EXT-X-STREAM-INF:BANDWIDTH=41457,CODECS="mp4a.40.2",AUDIO="bipbop_audio",SUBTITLES="subs"
    gear0/prog_index.m3u8
    

    此m3u8中包含2个variants,一个alternate audio以及一个alternate subtitle。它们使用EXT-X-MEDIA中的GROUP-ID字段与EXT-X-STREAM-INF中的AUDIOVIDEOSUBTITLES关联在一起。
    可以通过alternate media实现多码率、多音频、多字幕、多视角的HLS推流。

    10 I-frame playlist

    为了实现快播和倒放,通常需要特定的数据以支持类似操作,一种方法就是通过记录I帧位置来实现。HLS为了支持此功能,提供了EXT-X-I-FRAMES-ONLYEXT-X-I-FRAME-STREAM-INF字段。后者需要放到master playlist中即可,其示例如下:

    #EXTM3U
    #EXT-X-VERSION:4
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=80000,CODECS="avc1.42e00a,mp4a.40.2", 
    URI="lo/iframes.m3u8"
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=200000,CODECS="avc1.42e00a,mp4a.40.2", 
    URI="mid/iframes.m3u8"
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=380000,CODECS="avc1.42e00a,mp4a.40.2", 
    URI="hi/iframes.m3u8"
    

    EXT-X-I-FRAMES-ONLY字段是放在对应I-Frame的playlist中的,典型用法如下:

    #EXTM3U
    #EXT-X-VERSION:4
    #EXT-X-I-FRAMES-ONLY
    
...
    
#EXTINF:4.12,
    #EXT-X-BYTERANGE:9400@376
    segment1.ts
    #EXTINF:3.56,
    #EXT-X-BYTERANGE:7144@47000
    segment1.ts
    
#EXTINF:3.82,
    #EXT-X-BYTERANGE:10340@1880
    segment2.ts
    

    该文件间接给出了I帧所在位置的偏移量及其长度。

    11 包含session的master playlist

    session用于在playlist中传输任意服务器端自定义的数据,其对应字段如下:

    #EXT-X-SESSION-DATA:DATA-ID="com.example.lyrics",URI="lyrics.json"
    #EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="en", 
    VALUE="This is an example"
    #EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="es", 
    VALUE="Este es un ejemplo"
    

    12 小结

    本文简要整理了HLS不同类型的playlist及其对应的关键字,可以根据不同的关键字区分不同的playlist类型。理清这些类型之后,对于熟悉HLS解析会有较大帮助。仅供参考。

    更详细内容建议参考rfc8216。

    参考资料

    1. rfc8216: HTTP Live Streaming
    2. Technical Note TN2288: Example Playlist Files for use with HTTP Live Streaming
  • 相关阅读:
    网页编码就是那点事
    .NetCore通过EFCore操作数据库
    我的第一个.netcore程序
    VisoStudio 允许局域网联机调试网站
    MVC 中使用扩展方法
    MVC 简单发送邮件示例
    ASP.NET MVC路由配置
    SQL 存储过程语句拼接愁人的时间类型
    生成并返回 json 结果文件
    Windows Live Writer配置测试
  • 原文地址:https://www.cnblogs.com/tocy/p/hls-playlist-example.html
Copyright © 2011-2022 走看看