近期在做视频下载。本地播放功能的时候。发现的问题,先笔记记录一下

开发思路

(1) 在线解析m3u8文件内容,把里面的ts相应连接的资源下载本地的Document文件下。

(2) 把下载下来的资源使用本地路径又一次拼接成一个新的本地m3u8文件。

(3) 然后在开启一个http服务端。把m3u8共享成连接地址,让播放器播放。

一、概念

1. Playlist file

    一个M3U的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行能够是一个URI  空白行或

是以”#“号开头的字符串,而且空格仅仅能存在于一行中不同元素间的分隔。

一个URI 表示一个媒体段或是”variant Playlist file“(最多支持一层嵌套,即一个mm3u8文件里嵌套还有一个m3u8),

以”#EXT“开头的表示一个”tag“,否则表示凝视,直接忽略

2. Tags

    #EXTM3U:  每一个M3U文件第一行必须是这个tag。

    #EXTINF:指定每一个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开,其格式例如以下:

                     #EXTINF:<duration>,<title>  :

  duration表示持续的时间(秒)”Durations MUST be integers if the protocol version of the Playlist file is less

than 3“,否则能够是浮点数。

#EXT-X-BYTERANGE:表示媒体段是一个媒体URI资源中的一段,仅仅对其后的media URI有效,格式例如以下:

                     #EXT-X-BYTERANGE:<n>[@o]:

  当中n表示这个区间的大小,o表在URI中的offset。”The EXT-X-BYTERANGE tag appeared in version 4 of the protocol“。

    #EXT-X-TARGETDURATION:指定最大的媒体段时间长(秒)。所以#EXTINF中指定的时间长度必须小于或是等于这个最大

值。这个tag在整个PlayList文件里仅仅能出现一 次(在嵌套的情况下。一般有真正ts url的m3u8才会出现该tag)。格式例如以下:

                     #EXT-X-TARGETDURATION:<s>:s表示最大的秒数。

#EXT-X-MEDIA-SEQUENCE:每个media URI 在 PlayList中仅仅有唯一的序号,相邻之间序号+1。

                     #EXT-X-MEDIA-SEQUENCE:<number>:

                    一个media URI并非必需要包括的,假设没有,默觉得0。

    #EXT-X-KEY:表示怎么对media segments进行解码。其作用范围是下次该tag出现前的全部media URI,格式例如以下:

                     #EXT-X-KEY:<attribute-list>:

                    NONE 或者 AES-128。假设是NONE,则URI以及IV属性必须不存在,假设是AES-128(Advanced Encryption

Standard)。则URI必须存在。IV能够不存在。

                    对于AES-128的情况。keytag和URI属性共同表示了一个key文件。通过URI能够获得这个key,假设没有

                    IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0。假设

                    有IV,则将改值当成16个字节的16进制数。

#EXT-X-PROGRAM-DATE-TIME:将一个绝对时间或是日期和一个媒体段中的第一个sample相关联,仅仅对下一个meida URI有效,格式例如以下:

                     #EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>

                     For example:

                     #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

   #EXT-X-ALLOW-CACHE:是否同意做cache,这个能够在PlayList文件里随意地方出现,而且最多出现一次。作用效果是全部的媒体段。格式例如以下:

                     #EXT-X-ALLOW-CACHE:<YES|NO>

   #EXT-X-PLAYLIST-TYPE: 提供关于PlayList的可变性的信息, 这个对整个PlayList文件有效,是可选的。格式例如以下:

                     #EXT-X-PLAYLIST-TYPE:<EVENT|VOD> :假设是VOD。则server不能改变PlayList 文件;假设是EVENT,则

server不能改变或是删除PlayList文件里的不论什么部分。可是能够向该文件里添加新的一行内容。

   #EXT-X-ENDLIST:表示PlayList的末尾了,它能够在PlayList中任何位置出现。可是仅仅能出现一个。格式例如以下:

                     #EXT-X-ENDLIST

   #EXT-X-MEDIA:被用来在PlayList中表示同样内容的不用语种/译文的版本号,比方能够通过使用3个这样的tag表示3中不用语音的音

频,或者用2个这个tag表示不同角度的video在PlayLists中。

这个标签是独立存在的,其格式例如以下:

                    #EXT-X-MEDIA:<attribute-list>:该属性列表中包括:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、AUTOSELECT。

                    URI:假设没有,则表示这个tag描写叙述的可选择版本号在主PlayList的EXT-X-STREAM-INF中存在;

                    TYPE:AUDIO and VIDEO;

                    GROUP-ID:具有同样ID的MEDIAtag,组成一组样式;

                    LANGUAGE:identifies the primary language used in the rendition。

                    NAME:The value is a quoted-string containing a human-readable description of the rendition. If the LANGUAGE attribute is present then this description SHOULD be in that language。

                    DEFAULT: YES或是NO,默认是No,假设是YES,则client会以这样的选项来播放,除非用户自己进行选择。

                    AUTOSELECT:YES或是NO,默认是No,假设是YES,则client会依据当前播放环境来进行选择(用户没有依据自己偏好进行选择的前提下)。

        The EXT-X-MEDIA tag appeared in version 4 of the protocol。

o All EXT-X-MEDIA tags in the same group MUST have the same TYPE

attribute.

o All EXT-X-MEDIA tags in the same group MUST have different NAME

attributes.

o A group MUST NOT have more than one member with a DEFAULT

attribute of YES.

o All members of a group whose AUTOSELECT attribute has a value of

YES MUST have LANGUAGE [RFC5646] attributes with unique values.

o All members of a group with TYPE=AUDIO MUST use the same audio

sample format.

o All members of a group with TYPE=VIDEO MUST use the same video

sample format。

#EXT-X-STREAM-INF:指定一个包括多媒体信息的 media URI 作为PlayList,一般做M3U8的嵌套使用。它仅仅对紧跟后面的URI有

效,格式例如以下:

#EXT-X-STREAM-INF:<attribute-list>

<URI>

有下面属性:

BANDWIDTH:带宽,必须有。

PROGRAM-ID:该值是一个十进制整数,惟一地标识一个在PlayList文件范围内的特定的描写叙述。一个PlayList 文件里可

能包括多个有同样ID的此tag。

CODECS:不是必须的。

RESOLUTION:分辨率。

AUDIO:这个值必须和AUDIO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。

VIDEO:同上

m3u8的组成格式有多种。以下给出一个实例。http://ipadlive.cntv.soooner.com/cctv_p2p_hdcctv2.m3u8这个是CCTV-2財经的一个源。内容例如以下

#EXTM3U

#EXT-X-ALLOW-CACHE:NO

#EXT-X-TARGETDURATION:10

#EXT-X-MEDIA-SEQUENCE:8453235

#EXTINF:19,

userid=VSNDNP-183061027101_160_15601_4572" style="color:rgb(255,153,0); text-decoration:none">http://124.232.164.44:80/ipad/160_15601_4572/20130804075250.ts?userid=VSNDNP-183061027101_160_15601_4572

#EXTINF:2,

http://124.232.164.44:80/ipad/160_15601_4572/20130804075300.ts?

userid=VSNDNP-183061027101_160_15601_4572

#EXTINF:10,

userid=VSNDNP-183061027101_160_15601_4572" style="color:rgb(255,153,0); text-decoration:none">http://124.232.164.44:80/ipad/160_15601_4572/20130804075310.ts?

userid=VSNDNP-183061027101_160_15601_4572

假设是这样的的话。就非常方便当中http一行就是完整的一个链接,否则还要进行拼接。

文件夹

1 简单介绍 2

2 概述 2

3 播放列表文件 3

3.1 介绍 3

3.2新标签 4

3.2.1 EXT-X-TARGETDURATION 4

3.2.2 EXT-X-MEDIA-SEQUENCE 4

3.2.3 EXT-X-KEY 4

3.2.4 EXT-X-PROGRAM-DATE-TIME 5

3.2.5 EXT-X-ALLOW-CATCH 5

3.2.6 EXT-X-ENDLIST 5

3.2.7 EXT-X-STREAM-INF 5

3.2.8 EXT-X-DISCONTINUITY 6

3.2.9 EXT-X-VERSION 6

4 多媒体文件 7

5 密钥文件 7

5.1 介绍 7

5.2  IV FOR AES-128 7

6 client/server行为 8

6.1 介绍 8

6.2 server进程 8

6.2.1介绍 8

6.2.2 滑动窗体播放列表 9

6.2.3 加密媒体文件 9

6.2.4 提供变种数据流 10

6.3 client进程 10

6.2.1 介绍 10

6.2.2 载入播放列表文件 11

6.2.3播放播放列表文件 11

6.2.4又一次加载播放列表文件 11

6.2.5 确定下一个要载入的文件 12

6.2.6 解密经加密的媒体文件 12

7 协议版本号的兼容性 12

8 样例 12

8.1 简单的播放列表文件 12

8.2 滑动窗体播放列表,使用https 13

8.3 加密的媒体文件与播放列表文件 13

8.4 变种的播放列表文件 13

 
 

1简单介绍

本文档介绍了通过HTTP传输极大的多媒体数据流的协议[RFC2616]。该协议支持媒体数据的加密,并提供流的备用版本号(如比特率)。媒体数据能够在创建后被非常快地传输,同意它在近实时被接收。

在第11章中列出了。如HTTP的。描写叙述相关标准的外部引用。

 

2概述

多媒体演示文稿是由播放列表文件里的URI指定的,播放列表是一个由uri和信息标签组成的有序列表。每个URI都关联了一个媒体文件,该媒体文件是一个连续数据流的一个分片。
为了播放数据流,client首先获取播放列表文件。然后获取并播放列表中的每个媒体文件。

正如本文档所描写叙述的那样,它通过重载播放列表文件来发现其它新增的分片。
文档中的关键词“必须”“不准”,“须要”“应该”“不应该”“推荐”“能够”“可选”等见RFC2119。
 

3播放列表文件

3.1介绍

播放列表必须是扩展的M3U文件,该文档通过定义新的标签扩展了m3u文件的格式。M3U播放列表是一个文本文件。它包括了各自独立的行,行以一个LF字符或者LF字符紧跟一个CR字符来结束。

行能够是一个URI,空行,或者以字符#开头。空行将会被忽略。空格仅仅能作为一行中不同元素间的分隔。

一个URI 表示一个媒体文件或是变种播放列表文件(见3.2.7)

URI能够是相对的,一个相对的URI必须被包括该URI的播放列表文件里的URI所解析。

以凝视字符#开头的行可能是凝视或者标签。标签以#EXT开头。其它全部行都应该被忽略。

播放列表文件的持续时间是他所指向的媒体文件的时长的总和。

以.M3U8作为文件名称后缀或者HTTPContent-Type(RFC2616)为“Application/vnd.apple.mpegurl”的M3U播放列表文件使用UTF-8(RFC3629)编码。以.M3U作为文件名称后缀或者HTTPContent-Type为“audio/mpegurl”的M3U播放列表文件使用US-ASCII编码。

播放列表文件名称必须以.M3U8为后缀、HTTPContent-Type为“Application/vnd.apple.mpegurl”(假设使用http传输)或者以.M3U为后缀、HTTPContent-Type为“audio/mpegurl”。

扩展的M3U文件格式定义了两种标签:EXTM3U和EXTINF。区分扩展的M3U文件与普通M3U文件的关键在于前者的首行为#EXTM3U。

EXTINF是一个记录标记,该标记描写叙述了后边URI所指定的媒体文件。

每一个媒体文件URI前边必须有EXTINF标签。格式例如以下:

#EXTINF: <DURATION>,<TITLE>

DURATION是一个整数,它指定了媒体文件以秒为单位的持续时间,时间应四舍五入到最接近的整数。行内逗号后边的剩余部分是媒体文件的名字。该名字是媒体分片的人眼可读的信息标题。

该文档定义了例如以下的新标签:EXT-X-TARGETDURATION。EXT-X-MEDIA-SEQUENCE,EXT-X-KEY,EXT-X-PROGRAM-DATE-TIME,EXT-X-ALLOW-CATCH,EXT-X-ENDLIST,EXT-X-STREAM-INF,EXT-X-DISCONTINUITY。EXT-X-VERSION

 

3.2新标签

3.2.1     
EXT-X-TARGETDURATION

该标签指定了媒体文件持续时间的最大值,播放文件列表中的媒体文件在EXTINF标签中定义的持续时间必须小于或者等于该标签指定的持续时间。该标签在播放列表文件里必须出现一次,其格式为:
# EXT-X-TARGETDURATION:<s>
S是一个以秒为单位的整数。

3.2.2     
EXT-X-MEDIA-SEQUENCE

播放列表文件里每一个媒体文件的URI都有一个唯一的序列号。

URI的序列号等于它之前那个RUI的序列号加一。

EXT-X-MEDIA-SEQUENCE指明了出如今播放列表文件里的第一个URI的序列号。

其格式例如以下:
#EXT-X-MEDIA-SEQUENCE:<Number>
播放列表文件里的EXT-X-MEDIA-SEQUENCE标签不能多于一个。假设播放列表文件里没有EXT-X-MEDIA-SEQUENCE标签。那么将会把播放列表中第一个URI的序列号当成0。
媒体文件的序列号码不是必须出如今它的URI中的。见6.3.2和6.3.5。

3.2.3     
EXT-X-KEY

媒体文件可能是被加密的。EXT-X-KEY提供了解密媒体文件的必要信息,它的格式例如以下:
#EXT-X-KEY:METHOD=<method> [,URI = “<uri>”] [,IV = <iv>]
Method属性指定了加密方法,定义了两种加密方法:NONE和AES-128。
加密方法NONE表示媒体文件不被加密,假设加密方法是NONE,那么URI和IV属性不同意存在。
加密方法AES-128表示媒体文件使用高级加密标准128位密钥和PKCS7 padding加密。

假设加密方法是AES-128。那么对于URI属性,假设存在,则指定获取密钥的方法。对于IV属性,假设存在,则指定使用密钥的初始化向量。
IV属性出如今协议版本号2中,新的EXT-X-KEY将会代替不论什么一个先前的EXT-X-KEY。
假设播放列表文件没有包括EXT-X-KEY标签,那么媒体文件将不会被加密。
密钥文件的格式见第五章。媒体文件加密信息见5.2、6.2.3、6.3.6。

3.2.4     
EXT-X-PROGRAM-DATE-TIME

EXT-X-PROGRAM-DATE-TIME标签将下一个媒体文件的开头和绝对日期关联起来。日期/时间的表示基于ISO/IEC,而且要指明时区。比如:
#EXT-X-PROGRAM-DATE-TIME:<YYYY–MM–DDThh:mm:ssZ>
详见6.2.1和6.3.3

3.2.5     
EXT-X-ALLOW-CATCH

EXT-X-ALLOW-CATCH标签指定client能够或者不准缓存下载的媒体文件用来重播。

它可能会出如今播放列表文件的不论什么地方。可是不能出现两次或以上。该标签适用于播放列表中的全部分片。其格式例如以下:
#EXT-X-ALLOW-CACHE:<YES|NO>
详见6.3.3

3.2.6     
EXT-X-ENDLIST

EXT-X-ENDLIST标签标示没有很多其它媒体文件将会增加到播放列表中,它可能会出如今播放列表文件的不论什么地方,可是不能出现两次或以上。其格式例如以下:

#EXT-X-ENDLIST

3.2.7     
EXT-X-STREAM-INF

     EXT-X-STREAM-INF标签表示在播放列表中的下一个URI标识还有一个播放列表文件。

格式例如以下:

#EXT-X-STREAM-INF:[attribute=value][,attribute=value]* <URI>

在一个EXT-X-STREAM-INF标签中attribute不能出现两次或以上。

其他属性定义:
BANDWIDTH = <n>
n为每秒比特数,它必须是每一个媒体文件比特速率的上限,必须经过计算包括那些在播放列表中出现的或者将要出现的容器开销。
PROGRAM-ID=<i>
i是一个数字。在播放列表文件的范围内唯一的标识了一个特定的演示文稿。
    一个播放列表文件可能包括多个具有同样PROGRAM-ID 的EXT-X-STREAM-INF标签来标识某个演示文稿的不同编码。

这些变种的的播放列表可能包括额外的EXT-X-STREAM-INF标签。
 
CODECS="[format][,format]*"
 
每一种格式都指定了存在于媒体文件里的媒体类型。合法的格式标示符都是那些在ISO文件格式名称空间被RFC4281定义的格式。
RESOLUTION=<N>x<M>
 
N是流中视频水平编码分辨率的近似,以像素数表示,M是编码垂直分辨率的近似。

3.2.8     
EXT-X-DISCONTINUITY

     EXT-X-DISCONTINUITY标签表示该标签后边的媒体文件和之前的媒体文件之间的编码间断。

特性可能改变的一组是:
file format
number and type of tracks
encoding parameters
encoding sequence
详见第四章。6.2.1、6.3.3。
 
 

3.2.9     
EXT-X-VERSION

EXT-X-VERSION标签指出了播放列表版本号的适应性。

播放列表文件、其关联的媒体和server必须遵守最新版本号的全部规定。
 
 

4多媒体文件

每个媒体文件资源定位符都必须标识一个媒体文件,该文件是总体数据的一个分片。每个媒体文件必须依照MPEG-2的传输流和MPEG-2音频流的格式。

[ISO13818]
传输流文件必须包括一个MPEG-2节目。在每一个文件的開始应该有一个节目关联表和一个节目映射表。包括视频的文件应该有至少一个密钥帧和足够的信息来全然初始化一个视频解码器。
播放列表中的媒体文件必须是编码流中媒体文件的末尾与先前的序列号的延续,除非它是播放列表中出现的第一个媒体文件,或者它前边有EXT-X-DISCONTINUITY标签。
client应该准备优点理一个特定类型(音频或视频等)的多个轨道。一个没有优先级的client应该选择它能播放的具有最小数字编号的音轨。
client应该忽略那些传输流的内部不能识别的流。
媒体文件内样本流和对应的多媒体流的编码參数应保持一致。然而client应该解决编码的变化问题,比如缩放视频内容以适应分辨率改变。

5密钥文件

5.1介绍

    URI属性中EXT-X-KEY标签标识一个密钥文件。密钥文件包括解密播放列表中媒体文件的密钥。AES-128加密算法使用16字节的密钥。密钥文件的格式为16字节的二进制数数组。

5.2
 IV FOR AES-128

128位AES在加密和解密的时候须要提供一个同样的16字节的初始化向量(IV)。变换IV能够提高密钥的健壮性。
假设EXT-X-KEY标签有IV属性。在使用密钥加密或者解密的时候必须使用此属性值作为IV。这个值必须被解释为128位的16进制数,并且必须有前缀0x。
    假设EXT-X-KEY标签没有IV属性。在加密或者解密媒体文件的时候必须使用序列号作为IV值。

大端二进制表示的序列号应该放置在16字节的缓冲区中且左边补0。

6client/server行为

6.1介绍

本章介绍server如何产生播放列表和媒体文件以及client如何下载并播放。

6.2server进程

6.2.1介绍

MPEG-2数据流的产生超过了本文档的范围。本文档只如果有一个数据流连续的源。
server必须将数据流切割成持续时间大致相等的媒体文件,server应该尝试点切割流来支持对个别媒体文件的有效解码,比如包和关键帧的边界。
server必须为媒体文件创建URI,同意它的client可以获取到文件。
server必须创建播放列表。播放列表必须符合第三章描写叙述的格式。

server要提供的媒体文件的URI必须按顺序出如今播放列表中。

假设URI出如今了播放列表中,那么这个媒体文件对于client必须是可用的。
播放列表文件必须包括一个EXT-X-TARGRTDURATION标签。它必须指明加入到播放列表中媒体文件的最大EXTINF值。

整个演示文稿期间,这个值必须保持不变。典型持续时间为10s。
播放列表文件应该包括EXT-X-VERSION标签来说明流对于版本号的兼容性。

它的值应该是server、播放列表文件和其所关联的媒体文件都能运行的最低协议版本号。
假设播放列表文件通过HTTP传输。那么server应该支持client请求使用gzip内容编码。
从client的角度来看,播放列表文件的变更必须是自己主动的。
server不能够改变EXT-X-ALLOW-CATCH的值。
播放列表中每一个媒体文件的URI必须以EXTINF作为前缀来说明媒体文件的持续时间。
server能够将媒体文件和绝对的日期和时间关联起来,仅仅要在它的URI前缀上一个EXT-X-PROGRAM-DATE-TIME标签。

日期和时间的值提供了一个媒体时间表到挂钟时间的信息映射,该挂钟时间能够作为搜索、显示或其它目的的基准。
假设server提供了这个映射,那么它应该在每一个EXT-X-DISCONTINUITY标签的后边加一个EXT-X-PROGRAM-DATE-TIME标签。
假设播放列表文件包括演示文稿的最后一个分片。那么应该加一个EXT-X-ENDLIST标签。
假设播放列表文件没有包括EXT-X-ENDLIST标签,那么server应该使一个新版本号的播放列表文件可用。并至少包括一个媒体文件的URI。

新的播放列表文件必须与前一个播放列表文件在相对的时间内有效:从上一个播放列表文件開始有效的时间算起,不早于0.5倍持续时间,不晚于1.5倍持续时间。

//不太清楚可用是什么意思?
假设server期望移除演示文稿,它必须使播放列表文件对于client不可用。在播放列表被清除时,它应该确保播放列表文件里的全部媒体文件对于client来说至少在一个播放列表文件持续时间内是可用的。

6.2.2滑动窗体播放列表

server能够限制近期一段时间加入到播放列表文件里的媒体文件的可用性,为了达到这个目的,播放列表文件必须包括准确的EXT-X-MEDIA-SEQUENCE标签。标签的值是依照从播放列表中移除的媒体文件的URI递增的。
媒体文件的URI必须依照其增加的顺序移除。当server从播放列表移除URI时,媒体文件在一段时间内必须保持可用。该时间等于媒体文件的时间加上包括该媒体文件的最长播放列表文件的时间。
当媒体文件通过http传输给client后,假设server打算移除该文件,那么它应该确保http响应头包括反应生存时间的过期头。
那些不包括EXT-X-ENDLIST标签的播放列表文件的持续时间必须至少三倍于targrtdutration。//为什么是三倍?

6.2.3加密媒体文件

假设媒体文件须要被加密。那么server必须定义一个URI来同意被授权的client获取包括解密密钥的密钥文件。

密钥文件必须符合第五章描写叙述的格式。

server能够在密钥响应中设置超时头来表名密钥能够被缓存。
假设採用AES-128加密算法,那么AES-128 CBC加密模式应该适应于每个媒体文件。

整个文件必须是加密的。

password块的连接不能用于跨媒体文件。用于解密的初始化向量必须是媒体文件的序列号或者EXT-X-KEY标签的IV属性的值。server必须使用这样的加密算法和其它由紧随在播放列表文件里URI后边的EXT-X-KEY标签所指定的属性来加密播放列表文件里的每个媒体文件。

EXT-X-KEY标签中方法为none或者没有EXT-X-KEY标签的媒体文件不能被加密。
    假设播放列表文件包括了一个经过加密的媒体文件的URI。那么server不能够将EXT-X-KEY标签从播放列表文件里移除。

6.2.4提供变种数据流

server能够提供多个播放列表文件来支持对同一个演示文稿的不同编码。提供变种播放列表文件列出每个变种流,从而使得client能够在不同编码之间动态切换。
变种播放列表文件必须为每一个变种流包括一个EXT-X-STREAM-INF标签。

同一演示文稿的每一个EXT-X-STREAM-INF都必须有同样的programid。每一个演示文稿的programid在变种播放列表内必须是唯一的。
假设EXT-X-STREAM-INF标签包括CODECS属性。则属性值必须包括RFC4281定义的全部格式,
 
server在生成变种流的时候必须遵守下面规则:
1)每个变种流必须呈现同样的内容,包含流的间断性。
2)每一个变种播放列表文件必须有同样的target duration。
3)仅仅在个别变种播放列表文件里出现的内容必须放在列表文件的头或者尾,且不能超过target duration。
4)变种流内匹配内容。必须有匹配时间戳。这能够使client同步流。
5)基本音频流文件必须在文件里第一个样本的採样信号的时间戳前预先准备一个ID3 PRIV标签,标签的全部者标示符为“com.apple.streaming.transportStreamTimestamp”。二进制数据必须是33位的基本时间戳,用8字节的数字表示。
 
另外,全部的变种流都应该包括同样编码的音频二进制流。这使得client在不同的流之间切换时没有毛刺声音。//什么事毛刺声音?

6.3client进程

6.3.1介绍

client如何获取播放列表中的URI不在本文档的范围之内,我们如果已经获取到了URI。

6.3.2载入播放列表文件

每一次载入或者重载播放列表文件时:
client必须保证播放列表文件以EXTM3U标签开头。而且假设协议版本号号存在,client必须支持该版本号。否则。client不能够试图使用该列表文件。
client能够忽略它不能识别的标签和属性。
如果播放列表文件包括了EXT-X-MEDIA-SEQUENCE标签,那么client会如果在播放列表被载入的时间内以及播放列表的持续时间内媒体文件将变得不可用。播放列表的持续时间等于当中包括的媒体文件时长的总和。

//为啥如果不可用?

6.3.3播放播放列表文件

当開始播放的时候。client首先从播放列表中选择要播放的媒体文件。假设不存在EXT-X-ENDLIST标签,而且client想正常播放媒体(按顺序以标准速率播放)。那么client就不应该从播放列表文件尾部选择少于三个target duration的媒体文件。
为了达到正常播放的目的,媒体文件必须依照他们在播放列表中的顺序播放。

client还能够用其它不论什么方式播放,比方顺序播放,随机播放,特效播放等。
对于存在EXT-X-DISCONTINUITY标签的媒体文件,在播放之前client必须准备好重置分析和解码器。
为了不间断播放。应该提前加载媒体文件,以补偿延时和吞吐量的变化。
假设播放列表文件包括了EXT-X-ALLOW-CATCH标签,而且它的值为NO。那么client在播放以后不能够缓存媒体文件。

否则同意缓存用来以后重播。
client能够使用EXT-X-PROGRAM-DATE-TIME标签来为用户显示节目的起始时间。

假设这个值包括了时区信息,那么client应该考虑到这点。假设不包括。那么client不能够猜測时区。
client不能依靠EXT-X-ALLOW-CATCH标签值的正确性和一致性。

6.3.4又一次加载播放列表文件

client必须阶段性的又一次加载播放列表文件,除非文件包括了EXT-X-ENDLIST标签。然而也不能过于频繁的加载。
当client第一次加载播放列表文件或者已经加载可是发现文件与上次加载的时候有了变化,client都必须等待一段时间在能够再次加载。

这段时间被称为原始最小重载延迟,它是从client開始加载一个播放列表文件開始计算的。
原始最小重载延迟是播放列表文件里最后一个媒体文件的持续时间。

媒体文件的持续时间由EXTINF标签来指定。
假设client重载了一个播放列表文件,可是发现文件并没有变化,那么它在重试之前必须等一段时间。最小延迟是target duration的倍数。

第一次是0.5倍。第二次1.5倍,3倍。

。。

6.3.5确定下一个要载入的文件

当播放列表文件被加载或者重载以后,client必须检查播放列表来确定要加载的媒体文件。要加载的第一个文件必须是client要播放的第一个文件。见6.3.3。
    假设要播放的文件已经被加载,而且播放列表文件不包括EXT-X-MEDIA-SEQUENCE标签。那么client必须确认播放列表文件包括了最后一个被加载的媒体文件的URI,假设不包括。则暂停播放。

要加载的下一个媒体文件必须是上一次加载的媒体文件URI之后的第一个媒体文件的URI。
    假设要播放的文件已经被加载,而且播放列表文件包括EXT-X-MEDIA-SEQUENCE标签,那么要加载的下一个媒体文件就是比上一次加载的文件的序列号大的媒体文件里的序列号最小者。

6.3.6解密经加密的媒体文件

假设播放列表文件包括了一个指定密钥文件URI的EXT-X-KEY标签,client必须获取密钥文件。并使用当中的密钥来解密KEY标签之后的全部媒体文件。直到遇到还有一个EXT-X-KEY标签为止。

7协议版本号的兼容性

client和server必须使用版本号2以及更高版本号。
 
 

8样例

8.1简单的播放列表文件

#EXTM3U

#EXT-X-TARGETDURATION:5220

#EXTINF:5220,

http://media.example.com/entire.ts

#EXT-X-ENDLIST

8.2滑动窗体播放列表,使用https

#EXTM3U

#EXT-X-TARGETDURATION:8

#EXT-X-MEDIA-SEQUENCE:2680

#EXTINF:8,

https://priv.example.com/fileSequence2680.ts

#EXTINF:8,

https://priv.example.com/fileSequence2681.ts

#EXTINF:8,

https://priv.example.com/fileSequence2682.ts
 

8.3加密的媒体文件与播放列表文件

#EXTM3U

#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:15,

http://media.example.com/fileSequence52-1.ts

#EXTINF:15,

http://media.example.com/fileSequence52-2.ts

#EXTINF:15,

http://media.example.com/fileSequence52-3.ts

#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"

#EXTINF:15,

http://media.example.com/fileSequence53-1.ts

变种的播放列表文件

#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

m3u8文件信息总结的更多相关文章

  1. m3u8文件简介

    1.   M3U8文件概念 M3U8文件是指UTF-8编码格式的M3U文件.M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播 ...

  2. ffmpeg文件生成m3u8文件及ts切片程序(一)

    ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...

  3. MP3文件信息批量更改器

    以前(估计是2003年)编写一个MP3文件信息批量更改器MP3TagChanger,现放上来参考.(VB6编码) 使用方法很简单,会Winamp或者千千静听的就懂使用. http://pan.baid ...

  4. FastDFS 通过文件名获取文件信息

    /** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...

  5. 用字符流实现每个文件夹中创建包含所有文件信息的readme.txt

    package com.readme; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; i ...

  6. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  7. C# 获取指定目录下所有文件信息、移动目录、拷贝目录

    /// <summary> /// 返回指定目录下的所有文件信息 /// </summary> /// <param name="strDirectory&qu ...

  8. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

  9. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

随机推荐

  1. [SDOI2015][bzoj3993] 星际战争 [二分+最大流]

    题面 传送门 思路 首先,有一个非常明显的模型: 将激光武器放到一边,机器人放到另一边,从每一个激光武器向它可以攻击的机器人连边,形成一个二分图 建立附加源点$ss$和附加汇点$tt$,$ss$连所有 ...

  2. HDU 2065 "红色病毒"问题 ——快速幂 生成函数

    $A(x)=1+x^2/2!+x^4/4!...$ $A(x)=1+x^1/1!+x^2/2!...$ 然后把生成函数弄出来. 暴力手算. 发现结论. 直接是$4^{n-1}+2^{n-1}$ 然后快 ...

  3. list dict 性能测试

    from random import randint def load_list_data(total_nums, target_nums): """ 从文件中读取数据, ...

  4. 【转】 #define用法详解

    #define用法详解   1.#define 的作用 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”.被定义为“宏”的标识符称为“宏名”.在编译预处理时,对程序中所有出现的“宏 ...

  5. Java数据结构-------Set

    三种常用Set:HashSet.LinkedHashSet.TreeSet set类继承关系: 概述 Set是对对应Map的一种封装,Set中的元素不可以重复. HashSet对应 HashMap.L ...

  6. 子Repeater获取父级Repeater绑定项的值

    原文发布时间为:2010-12-27 -- 来源于本人的百度文章 [由搬家工具导入] 1.子级Repeater中绑定父级的某个字段: <%# DataBinder.Eval((Container ...

  7. updatepanel中使用alert弹出框方法

    原文发布时间为:2009-05-17 -- 来源于本人的百度文章 [由搬家工具导入]         ScriptManager.RegisterStartupScript(this.UpdatePa ...

  8. derby数据库的一些总结

     本文主要是针对在osgi开发过程中的一些问题进行总结,其中dbcp数据源的配置是在SpringDM下配置的.一,derby数据源的内嵌模式       该模式的主要应用是嵌入式程序,因为其小巧,且不 ...

  9. 《手把手教你学C语言》学习笔记(6)---数据类型和常量

    计算机中需要保存信息,就需要数据存储,数据的存储就需要划分数据类型.主要包括:基本数据类型.指针类型.构造类型.空类型. 基本类型:整型---主要用来表示整数,可以分为无符号和有符号:又分为基本整型. ...

  10. 常见的 Git 命令:

    开始一个工作区(参见:git help tutorial) clone 克隆一个仓库到一个新目录 init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库 在当前变更上工作(参见:git he ...