http-live-streaming

https://tools.ietf.org/html/draft-pantos-http-live-streaming-23

1. HTTP直播流简介


   HTTP实时流媒体提供了一个可靠的,成本效益的手段
   通过互联网提供连续和长时间的视频。它
   允许接收器使媒体的比特率适应当前
   网络条件,以保持不间断播放
   最好的质量。它支持插页式内容边界。
   它为媒体加密提供了一个灵活的框架。它可以
   有效地提供相同内容的多个呈现,例如
   音频翻译。它提供了与大规模HTTP的兼容性
   缓存基础设施以支持向大量受众传递。


   自2009年首次发布草案以来,HTTP Live Streaming就已经具备
   已经被广泛的内容制作者实施和部署,
   工具供应商,分销商和设备制造商。在里面
   随后的八年,协议已被广泛的提炼
   与各种媒体流媒体实现者进行审查和讨论。


   本文档的目的是为了促进互操作性
   在HTTP实时流媒体实现之间通过描述媒体
   传输协议。使用这个协议,客户端可以收到一个
   来自服务器的连续媒体流以便并行呈现。


   本文档介绍协议的第7版。

2.概述


    多媒体演示由统一资源指定
    标识符(URI)[RFC3986]播放列表。


    播放列表是媒体播放列表或主播放列表。 两者都是
    包含URI和描述性标签的UTF-8文本文件。


    媒体播放列表包含媒体片段的列表,当播放时

    依次播放多媒体演示。

   Here is an example of a Media 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

第一行是格式标识符标签#EXTM3U。 该线
    包含#EXT-X-TARGETDURATION表示所有媒体片段都会
    10秒或更少。 然后宣布三个媒体分段。
    第一和第二是9.009秒长; 第三个是3.003
   秒。

要播放此播放列表,客户端首先下载它然后
    下载并播放其中声明的每个媒体细分。该
    客户端会按照本文档中所述重新加载播放列表以发现
    任何额外的细分。 数据应该通过HTTP [RFC7230]传送,但是
    通常一个URI可以指定任何可以可靠传输的协议

    指定的资源按需。

主播放列表可以描述更复杂的演示。 一个
    主播放列表提供了一组变体流,其中每一个
    描述了相同内容的不同版本。


    变体流包括指定媒体的媒体播放列表
    以特定的比特率编码,以特定的格式编码,并以
    包含视频的媒体的特定分辨率。


    变体流也可以指定一组Renditions。译丛
    是内容的替代版本,例如制作的音频
    不同的语言或不同的摄像机角度录制的视频。


    客户应该在不同的变体流之间切换以适应
    网络状况。 客户应根据用户选择Renditions

    优先。

3. Media Segments


媒体播放列表包含一系列组成的媒体分段
   整体介绍。媒体段由URI和
   可选地一个字节范围。


   媒体播放列表中显示了每个媒体段的持续时间
   通过其EXTINF标签(第4.3.2.1节)。


   媒体播放列表中的每个片段都有一个唯一的整数媒体序列
   数。媒体中第一个片段的媒体序列号
   播放列表为0,或在播放列表中声明(第4.3.3.2节)。
   每隔一段的媒体序列号等于
   媒体序列号之前的分段加1。


   每个媒体段必须带有编码的延续
   从以前的媒体片段末尾开始的比特流
   序列号,其中序列中的值如时间戳和
   连续性计数器必须不中断。唯一的例外
   是媒体播放列表中第一个出现在媒体播放列表中的媒体细分
   媒体片段明确表示为不连续
   (第4.3.2.3节)。未标记的介质不连续可能会触发
   播放错误。


   包含视频的任何媒体片段都应该包含足够的内容
   信息来初始化视频解码器并解码连续集合
   包含段中最后一帧的帧;网络
   如果细分中有足够的信息,效率会得到优化
   解码段中的所有帧。例如,任何媒体细分
   包含H.264视频应该包含一个IDR;之前的帧

   第一个IDR将被下载但可能被丢弃。

3.1.  Supported Media Segment Formats

所有媒体片段必须采用本节所述的格式。
    其他媒体文件格式的传输未定义。


    某些媒体格式需要一个通用字节序列来初始化a
    可以解析Media Segment之前的解析器。 这种格式特定的
    序列被称为媒体初始化部分。 媒体
    初始化部分可以由EXT-X-MAP指定
    (第4.3.2.5节)标签。 媒体初始化部分不可以

    包含示例数据。

3.2.  MPEG-2 Transport Streams

MPEG-2传输流由[ISO_13818]指定。


    MPEG-2传输流的媒体初始化部分
    段是程序关联表(PAT),后面是程序
    地图表(PMT)。


    传输流片段必须包含一个MPEG-2节目;
    没有定义多节目传输流的回放。 每
    传输流段必须包含一个PAT和一个PMT,或者有一个
    EXT-X-MAP(第4.3.2.5节)标签应用于它。 前两个
    没有EXT-X-MAP标签的段中的传输流数据包应该
    成为一个PAT和一个PMT。

3.3.  Fragmented MPEG-4

MPEG-4片段由ISO基本媒体文件格式指定
   [ISOBMFF]。与具有电影盒的常规MPEG-4文件不同
   ('moov')包含示例表和一个媒体数据框('mdat')
   包含相应的样本,由MPEG-4片段组成
   包含样本表子集的Movie Fragment Box('moof')
   和包含这些样本的媒体数据框。使用MPEG-4
   片段确实需要一个Movie Box进行初始化,但该Movie需要
   Box仅包含非特定于样本的信息,如曲目和
   样本描述。


   分段的MPEG-4(fMP4)段是如由其定义的“段”
   [ISOBMFF]的第3部分,包括对媒体数据框的限制
   在第8.16节[ISOBMFF]中。


   fMP4段的媒体初始化部分是ISO基础
   媒体文件,可以初始化该段的解析器。


   广义而言,fMP4分段和媒体初始化部分是
   [ISOBMFF]文件也符合本文所述的约束
   部分。


   fMP4段的媒体初始化部分必须包含一个
   包含与之兼容的品牌的文件类型框('ftyp')
   'iso6'或更高。文件类型框必须跟着一个电影框。
   电影盒必须为每个音轨包含一个音轨盒('trak')
   fMP4片段中的片段框('traf'),具有匹配的track_ID。
   每个Track Box应该包含一个样本表,但是它的样本数量
   必须是零。电影标题框('mvhd')和曲目标题框
   ('tkhd')的持续时间必须为零。电影延伸框('mvex')
   必须按照最后一个轨道框。请注意,CMAF标题[CMAF]符合

   所有这些要求。

 在fMP4片段中,每个轨道片段框必须包含一个轨道
    片段解码时间框('tfdt')。 fMP4段必须使用电影 - 
    片段相对寻址。 fMP4段不得使用外部
    数据参考。 请注意,CMAF分部符合这些要求。


    包含EXT-X-I-FRAMES-ONLY的播放列表中的fMP4段
    (第4.3.3.6节)标签可以省略媒体数据盒的部分

    跟随I帧样本数据。

    媒体播放列表中的每个fMP4段都必须有一个EXT-X-MAP标签

    适用于它。

3.4.  Packed Audio

打包的音频段包含编码的音频样本和ID3标签
    只是简单的包装在一起,最小的框架,
    样本时间戳。 支持的打包音频格式是带有ADTS的AAC
    框架[ISO_13818_7]; MP3 [ISO_13818_3]; AC-3 [AC_3]; 和增强
    AC-3 [AC_3]。


    打包音频段没有媒体初始化部分。


    每个打包音频段必须发出第一个时间戳的信号
    在分段的开始处使用ID3 PRIV标签[ID3]进行采样。
    ID3 PRIV所有者标识必须是
   “com.apple.streaming.transportStreamTimestamp”。 ID3有效载荷必须
    是一个33位的MPEG-2节目基本流时间戳,表示为a
    大端八位字节数,高31位设为零。
    没有这个ID3标签,客户不应该播放打包音频段。

3.5.  WebVTT

WebVTT段是WebVTT [WebVTT]文件的一部分。 WebVTT插入
   分段带有字幕。


   WebVTT段的媒体初始化部分是WebVTT
   头。


   每个WebVTT片段必须包含所有预期的字幕提示
   在段EXTINF指示的时段内显示
   持续时间。每个提示的开始时间偏移量和结束时间偏移量必须
   指示该提示的总显示时间,即使提示的一部分
   时间范围在分段时段之外。 WebVTT部分可以
   不包含暗示;这表示不会显示字幕
   在那个时期。


   每个WebVTT段都必须以WebVTT头部开头或具有
   应用EXT-X-MAP标签。
   为了同步音频/视频和字幕之间的时间戳,
   一个X-TIMESTAMP-MAP元数据头应该被添加到每个WebVTT中
   头。此标题将WebVTT提示时间戳映射到MPEG-2(PES)
   时间戳在变体流的其他演绎中。其格式是:


   X-TIMESTAMP-MAP =本地:<提示时间>,MPEGTS:
   例如X-TIMESTAMP-MAP = LOCAL:00:00:00.000,MPEGTS:900000


   LOCAL属性中的提示时间戳可能会超出范围
   该段所涵盖的时间。


   如果WebVTT段没有X-TIMESTAMP-MAP,则为客户端
   必须假设0的WebVTT提示时间映射到MPEG-2时间戳
   0。

4.  Playlists

本节介绍HTTP Live使用的播放列表文件
   流。 在本节中,“必须”和“不能”指定规则
    用于合法播放列表文件的语法和结构。 播放列表
    违反这些规则是无效的; 客户端必须解析它们。
    见6.3.2节。


    播放列表文件的格式是从M3U [M3U]
    播放列表文件格式并从该早期文件继承两个标签
    格式:EXTM3U(第4.3.1.1节)和EXTINF(第4.3.2.1节)。


    在本节中,标记是使用BNF风格的语法指定的。


    每个播放列表文件必须可由路径组件识别
    的URI或HTTP Content-Type。 在第一种情况下,路径必须
    以.m3u8或.m3u结尾。 在第二个,HTTP内容类型
    必须是“application / vnd.apple.mpegurl”或“audio / mpegurl”。客户端
    应该拒绝解析不明确的播放列表。

4.1.  Definition of a Playlist

播放列表文件必须以UTF-8 [RFC3629]编码。他们不可以
   包含任何字节顺序标记(BOM);客户应拒绝播放列表
   其中包含BOM或不解析为UTF-8。播放列表文件必须
   不包含UTF-8控制字符(U + 0000至U + 001F和U + 007F至
   U + 009F),但CR(U + 000D)和LF(U + 000A)除外。所有
   字符序列必须根据Unicode进行标准化
   规范化形成“NFC”。请注意,US-ASCII [US_ASCII]符合
   这些规则。


   播放列表文件中的行由单个换行符终止
   字符或回车符,然后换行
   字符。每一行都是一个URI,空白或者以字符开头
   '#'。空白行被忽略。白色空间不得存在,
   除了明确指定的元素外。


   以字符“#”开头的行是注释或标签。
   标签以#EXT开头。它们区分大小写。所有其他行
   以'#'开始的是评论,应该被忽略。


   一个URI行标识一个媒体段或播放列表文件(见
   第4.3.4.2节)。每个媒体段由一个URI和

   适用于它的标签。

播放列表是播放列表中的所有URI行的媒体播放列表
   确定媒体分段。一个播放列表是一个主播放列表,如果所有的URI
   播放列表中的行标识媒体播放列表。播放列表必须是
   媒体播放列表或主播放列表;所有其他播放列表是
   无效。


   播放列表中的URI,无论是URI行还是标记的一部分,都可以
   是相对的。任何相对的URI被认为是相对的
   包含它的播放列表的URI。


   媒体播放列表文件的持续时间是持续时间的总和
   其中的媒体细分。


   媒体段的分段比特率是媒体的大小
   细分除以其EXTINF持续时间(第4.3.2.1节)。注意
   这包括容器开销,但不包括开销
   由传送系统施加,例如HTTP,TCP或IP报头。


   媒体播放列表的峰值比特率是最大的比特率
   总持续时间在0.5之间的任何连续的分段集合
   和目标持续时间的1.5倍。一组的比特率是
   通过用段的总和除以段长度之和来计算
   分段持续时间。


   媒体播放列表的平均分段比特率是
   媒体播放列表中每个媒体段的大小(以比特为单位)被划分
   媒体播放列表持续时间。请注意,这包括容器
   开销,而不是HTTP或其他交付强加的开销

   系统。

4.2.  Attribute Lists

某些标签的值是属性列表。 属性 - 
    列表是一个逗号分隔的属性/值对列表,没有

   空白。

属性/值对具有以下语法:


   为AttributeName =的AttributeValue


   一个AttributeName是一个不带引号的字符串,其中包含字符
   设置[A..Z],[0..9]和' - '。因此,AttributeNames只包含
   大写字母,不小写。绝不能有任何空格
   在AttributeName和'='字符之间,也不在'='
   字符和AttributeValue。


   AttributeValue是以下之一:


   十进制整数:来自集合的未加引号的字符串
      [0..9]表示范围内的基数为10的整数
      从0到2 ^ 64-1(18446744073709551615)。一个十进制整数可能是
      从1到20个字符。


   o十六进制序列:一个未加引号的字符串
      设置前缀为0x或0X的[0..9]和[A..F]。最大值
      十六进制序列的长度取决于其AttributeName。


   o十进制浮点数:一个未加引号的字符串
      设置[0..9]和'。'它表示一个非负的浮点数
      十进制位置表示法中的数字。


   o signed-decimal-floating-point:一个不带引号的字符串
      从集合[0..9],' - '和'。'表示签名
      十进制位置表示法中的浮点数。


   o quoted-string:一对双字符串中的一串字符,
      引号(0x22)。以下字符不能出现在a中
      quoted-string:换行符(0xA),回车符(0xD)或者double
      报价(0x22)。引用的字符串AttributeValues应该被构造
      所以按字节进行比较足以测试两个引用的字符串,
      字符串AttributeValues相等。请注意,这意味着case-
      敏感的比较。


   o枚举字符串:来自集合的未加引号的字符串
      由Attribute明确定义。一个枚举字符串会
      从不包含双引号(“),逗号(,)或空格。


   o十进制分辨率:由“x”分隔的两个十进制整数
      字符。第一个整数是一个水平像素尺寸
      (宽度);第二个是垂直像素尺寸(高度)。


   指定给定AttributeName的AttributeValue的类型

   由属性定义。

给定的AttributeName不能在给定的对象中出现多次

    属性列表。 客户应该拒绝播放这样的播放列表。

4.3.  Playlist Tags
    播放列表标签指定播放列表的全局参数,或
    有关出现的媒体片段或媒体播放列表的信息
    在他们之后。

4.3.1.  Basic Tags


   These tags are allowed in both Media Playlists and Master Playlists.


4.3.1.1.  EXTM3U


    EXTM3U标签指示该文件是扩展M3U [M3U]
    播放列表文件。 它必须是每个媒体播放列表的第一行
    每个主播放列表。 其格式是:


   #EXTM3U


4.3.1.2.  EXT-X-VERSION


   

 EXT-X-VERSION标签指示的兼容版本
    播放列表文件,其关联媒体及其服务器。


    EXT-X-VERSION标签适用于整个播放列表文件。 它的
    格式是:

#EXT-X-VERSION:


    其中n是指示协议兼容性版本的整数
    数。


    它必须出现在包含标签或属性的所有播放列表中
    与协议版本1不兼容
    与老客户的互操作性。 第7节规定了最低限度
    任何给定播放列表的兼容版本号的值
    文件。


    播放列表文件不能包含多个EXT-X-VERSION标签。 如果
    客户端遇到具有多个EXT-X-VERSION标签的播放列表

    必须拒绝它。

4.3.2.  Media Segment Tags

  每个媒体分段由一系列媒体分段标记指定
    后跟一个URI。 一些媒体分段标签只适用于下一个
    分割; 其他人适用于所有后续部分直到另一部分
    相同标签的实例。


    媒体片段标签不得出现在主播放列表中。客户端
    必须拒绝包含媒体分段标签和主播的播放列表
    播放列表标签(第4.3.4节)。

4.3.2.1.  EXTINF

EXTINF标记指定媒体分段的持续时间。 它适用
    仅限于下一个媒体分部。 每个媒体都需要这个标签
    分割。 其格式是:


   #EXTINF:<持续时间>,[]<br><br><br>    其中duration是一个十进制浮点数或十进制整数<br>    (如第4.2节所述),指定的持续时间<br>    媒体细分在几秒钟内。 通常,持续时间应该是十进制的 - <br>    浮点,具有足够的精度以避免可察觉的错误<br>    分段持续时间是累积的。 如果兼容版本<br>    数量小于3,持续时间必须是整数。 持续时间<br>    被报告为整数应该四舍五入到最接近的整数。<br>    逗号后面的行的其余部分是一个可选的人机对话框,<br>    媒体细分的可读信息标题以原始形式表达<br></p> <p>    UTF-8文本。</p> <p><br></p> <p><br></p> <p>4.3.2.2.  EXT-X-BYTERANGE<br></p> <p>EXT-X-BYTERANGE标签指示一个媒体段是一个子范围<br>    的URI所标识的资源。 它只适用于下一个<br>    在播放列表中跟随它的URI行。 其格式是:<br><br><br>   #EXT-X-BYTERANGE:<N>[@<O>]<br><br><br>    其中n是一个十进制整数,表示子范围的长度<br>    以字节为单位 如果存在,o是一个十进制整数,表示开始<br>    子范围,作为从资源开始的字节偏移量。<br>    如果o不存在,则子范围从下一个字节开始<br>    之前媒体分部的子范围。<br><br><br>    如果o不存在,以前的媒体段必须出现在<br>    播放列表文件并务必是相同媒体资源的子范围,或<br>    媒体段未定义,播放列表必须被拒绝。<br>    没有EXT-X-BYTERANGE标签的媒体段包含整个<br>    由其URI标识的资源。<br>    使用EXT-X-BYTERANGE标签需要一个兼容版本<br></p> <p>    数量为4或更多。</p> <p>4.3.2.3.  EXT-X-DISCONTINUITY</p> <p>   EXT-X-DISCONTINUITY标签指示不连续<br>    跟随它的媒体细分以及之前的媒体细分。<br><br><br>    其格式是:<br><br><br>   #EXT-X-DISCONTINUITY<br><br><br>    EXT-X-DISCONTINUITY标签必须存在,如果有变化<br>    任何以下特征:<br><br><br>    o文件格式<br><br><br>    o轨道的号码,类型和标识符<br><br><br>    o时间戳序列<br><br><br>    EXT-X-DISCONTINUITY标签应该存在,如果有变化<br>    任何以下特征:<br><br><br>    o编码参数<br><br><br>    o编码序列<br><br><br>    有关更多信息,请参阅第3节,第6.2.1节和第6.3.3节<br></p> <p>    关于EXT-X-DISCONTINUITY标签。</p> <p></p> <p>4.3.2.4.  EXT-X-KEY</p> <p>媒体分段可以加密。 EXT-X-KEY标签指定如何<br>    解密它们。 它适用于出现在每个媒体段之间<br>    它与播放列表文件中的下一个EXT-X-KEY标签相同<br>    KEYFORMAT属性(或播放列表文件的结尾)。 两个或更多<br>    具有不同KEYFORMAT属性的EXT-X-KEY标签可适用于<br>    如果它们最终产生相同的解密,则是相同的媒体分段<br></p> <p>    键。</p> <p></p> <pre class="newpage" style="font-size:13.3333px;">The format is: #EXT-X-KEY:<attribute-list></pre> <p>attribute包含下面:</p> <p>METHOD:</p> <p></p> <p>该值是一个指定加密的枚举字符串方法。 该属性是必需的。 定义的方法有:NONE,AES-128和SAMPLE-AES。</p> <p>NONE的加密方法意味着媒体段不是加密。如果加密方法是NONE,则为其他属性绝不能在场。<br> 媒体分段是AES-128信号的加密方法使用高级加密标准完全加密带有128位密钥,密码块链接和PKCS7的[AES_128]填充[RFC5652]。 CBC在每个分段边界上重新启动,使用IV属性值或媒体序列号作为IV;见第5.2节。<br></p>   SAMPLE-AES的加密方法意味着媒体分段包含加密的媒体样本,如音频或视频 使用高级加密标准[AES_128]。这些媒体如何 <br> 流被加密并封装在一个段中取决于媒体编码和片段的媒体格式。 fMP4媒体 使用Common的'cbcs'方案对段进行加密加密[COMMON_ENC]。其他媒体分段的加密包含H.264 [H_264],AAC [ISO_14496],AC-3 [AC_3],和增强型AC-3 [AC_3]媒体流在HLS中进行了描述 示例加密[SampleEnc]规范。 IV属性可以出席;见第5.2节。 <br> <p>URI:</p> <p>该值是一个带引号的字符串,其中包含指定方式的URI获得钥匙。 该属性是必需的,除非METHOD是NONE。<br></p> <p> IV:</p> <p>该值是一个指定128位的十六进制序列无符号整数初始化Vector用于与键一起使用。使用IV属性需要一个兼容版本号2或更高。 有关何时使用IV属性的信息,请参见第5.2节。 </p> <p>KEYFORMAT:</p> <p>该值是一个带引号的字符串,用于指定密钥的方式在由URI标识的资源中表示; 见第5节<br></p> <p>了解更多细节。 该属性是可选的; 它的缺席表明了“身份”的隐含价值。</p> <p>使用KEYFORMAT属性需要5或更大的兼容版本号。</p> <p>KEYFORMATVERSION:</p> <p>该值是包含一个或多个肯定的带引号的字符串用“/”字符分隔的整数(例如“1”,“1/2”,“  或“1/2/5”)。 如果多个版本的特定KEYFORMAT 被定义,这个属性可以用来表示哪个这个实例符合的版本。 这个属性是 可选的; 如果不存在,则其值被认为是“1”。使用KEYFORMATVERSIONS属性需要兼容性 版本号为5或更大。<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> If the Media Playlist file does not contain an EXT-X-KEY tag then Media Segments are not encrypted. See Section 5 for the format of the key file, and Section 5.2, Section 6.2.3 and Section 6.3.6 for additional information on Media Segment encryption.</pre> <br> <p>4.3.2.5.  EXT-X-MAP</p> <p>EXT-X-MAP标签指定如何获取媒体初始化部分(第3节)需要解析适用的媒体细分。<br></p> <p>它适用于在其中出现的每个媒体分段播放列表直到下一个EXT-X-MAP标记或直到结束播放列表。</p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> Its format is: #EXT-X-MAP:<attribute-list> The following attributes are defined:</pre> <p>URI:</p> <p>该值是一个带引号的字符串,其中包含标识一个URI的URI包含媒体初始化部分的资源。 这个属性是必需的。<br></p> <p>BYTERANGE:</p> <p>该值是一个带引号的字符串,用于指定一个字节范围资源由URI属性标识。 这个范围应该只包含媒体初始化部分。 的格式<br></p> <p> 第4.3.2.2节描述了字节范围。 该属性是可选的; 如果不存在,则字节范围是由URI指示的整个资源。</p> <p>应为播放列表中的媒体片段提供EXT-X-MAP标记与第一媒体段(即,第一媒体段)的EXT-X-I-FRAMES-I帧)播放列表(或后面的第一个段)EXT-X-DISCONTINUITY标签)不会立即跟随媒体初始化部分在其资源的开始处。<br><br>在媒体播放列表中使用EXT-X-MAP标签EXT-X-I-FRAMES-ONLY标签需要5的兼容版本号或更高。 在媒体播放列表中使用EXT-X-MAP标签不包含EXT-X-I-FRAMES-ONLY标签需要兼容性版本号为6或更大。<br></p> <p>4.3.2.6.  EXT-X-PROGRAM-DATE-TIME</p> <p>EXT-X-PROGRAM-DATE-TIME标签将a的第一个样本关联起来媒体细分与绝对日期和/或时间。 它仅适用于<br>    下一个媒体分部。<br>    日期/时间表示为ISO / IEC 8601:2004 [ISO_8601]和<br>    应该表示秒的时区和小数部分:<br>   #EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDTHH:MM:ss.SSSZ><br>    例如:<br>   #EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+ 08:00<br>    EXT-X-PROGRAM-DATE-TIME标签应该提供毫秒精度。<br></p> <p>    有关EXT-X的更多信息,请参见第6.2.1节和第6.3.3节-PROGRAM-DATE-TIME标签。</p> <p>4.3.2.7.  EXT-X-DATERANGE<br></p> <p>4.3.2.7.1.  Mapping SCTE-35 into EXT-X-DATERANGE<br></p> <p>4.3.3.  Media Playlist Tags<br></p> <p>4.3.3.1.  EXT-X-TARGETDURATION<br></p> <p>4.3.3.2.  EXT-X-MEDIA-SEQUENCE<br></p> <p>4.3.3.3.  EXT-X-DISCONTINUITY-SEQUENCE<br></p> <p>4.3.3.4.  EXT-X-ENDLIST<br></p> <p>4.3.3.5.  EXT-X-PLAYLIST-TYPE<br></p> <p>4.3.3.6.  EXT-X-I-FRAMES-ONLY<br></p> <p>4.3.4.  Master Playlist Tags<br></p> <p>4.3.4.1.  EXT-X-MEDIA<br></p> <p>4.3.4.1.1.  Rendition Groups<br></p> <p>4.3.4.2.  EXT-X-STREAM-INF<br></p> <p>4.3.4.2.1.  Alternative Renditions<br></p> <p>4.3.4.3.  EXT-X-I-FRAME-STREAM-INF<br></p> <p>4.3.4.4.  EXT-X-SESSION-DATA<br></p> <p>4.3.4.5.  EXT-X-SESSION-KEY<br></p> <p>4.3.5.  Media or Master Playlist Tags<br></p> <p>4.3.5.1.  EXT-X-INDEPENDENT-SEGMENTS<br></p> <p>4.3.5.2.  EXT-X-START<br></p> <p>5.  Key files<br></p> <p>5.1.  Structure of Key files<br></p> <p>5.2.  IV for [AES_128]<br></p> <p>6.  Client/Server Responsibilities<br></p> <p>6.1.  Introduction<br></p> <p>本节介绍服务器如何生成播放列表和媒体片段以及客户端如何下载它们以进行播放。<br></p> <p>6.2.  Server Responsibilities<br></p> <p>     源媒体的制作不在此范围之内文件,它只是假设连续编码媒体的来源包含演示文稿。服务器必须将源媒体分成单独的媒体段的持续时间小于或等于一个恒定的目标持续时间。 比计划的目标持续时间更长的细分可以触发播放失速和其他错误。</p> <p>     服务器应该尝试在源点上分割源媒体支持各个媒体片段的有效解码,例如 在数据包上 和关键帧边界。<br></p> <p>    服务器必须为每个启用它的媒体段创建一个URI客户端获取细分数据。 如果服务器支持部分加载资源(例如,通过HTTP范围请求),它可以指定使用EXT-X-BYTERANGE分段为更大资源的子范围标签。<br></p> <p>    在客户端加载的播放列表中指定的任何媒体片段必须可以立即下载,否则播放错误可以发生。 一旦下载开始,它的传输速率不应该是受到segment 生产的制约。<br></p> <p>     HTTP服务器应该传输文本文件 - 比如播放列表和WebVTT细分 - 如果客户使用“gzip”Content-Encoding表示它已准备好接受它。<br></p> <p></p> <p>     服务器必须创建一个媒体播放列表文件(第4节)包含服务器希望制作的每个媒体片段的URI可用,按其播放顺序。<br></p> <p>    EXT-X-VERSION标签的值(第4.3.1.2节)不应该是大于标签和属性的要求播放列表 - 请参阅第7节。<br></p> <p>   对播放列表文件的更改必须从该点开始进行原子操作的客户端视图,或播放错误可能会发生<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> The server MUST NOT change the Media Playlist file, except to: Append lines to it (Section 6.2.1). Remove Media Segment URIs from the Playlist in the order that they appear, along with any tags that apply only to those segments (Section 6.2.2). Increment the value of the EXT-X-MEDIA-SEQUENCE or EXT-X -DISCONTINUITY-SEQUENCE tags (Section 6.2.2). Add an EXT-X-ENDLIST tag to the Playlist (Section 6.2.1).</pre> <p>     如果媒体播放列表携带 EXT-X-PLAYLIST-TYPE tag ,你意味着服务器不能随意更新播放列表。 EXT-X-PLAYLIST-TYPE标签<br> VOD的值表示播放列表文件不能改变。 一个值为EVENT的EXT-X-PLAYLIST-TYPE标记表示服务器不得更改或删除播放列表文件的任何部分; 它可以附加行。</p> <p>       媒体播放列表中EXT-X-TARGETDURATION标签的值务必不变。 典型的目标持续时间是10秒。<br></p> <p>     除此之外的改动,可能导致播放器异常或者不一致行为。</p> <p>   媒体播放列表中的每个媒体段都具有整数不连续性序列号。 不连续序列号可用于除媒体内的时间戳以同步媒体 跨越不同演绎的细分。<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> A segment's Discontinuity Sequence Number is the value of the EXT-X -DISCONTINUITY-SEQUENCE tag (or zero if none) plus the number of EXT-X-DISCONTINUITY tags in the Playlist preceding the URI line of the segment.</pre>服务器可以将绝对日期和时间与媒体相关联通过对其应用EXT-X-PROGRAM-DATE-TIME标记来分段。 这个定义了(墙上时钟)日期和时间的信息映射由标记指定给段中的第一个媒体时间戳,这可以用作寻求,显示或其他的基础 <br> <p>   目的。 如果一个服务器提供这个映射,它应该应用一个 EXT-X-PROGRAM-DATE-TIME标记到每个有一个段的段EXT-X-DISCONTINUITY标签应用于它。</p> <p>服务器不得将任何EXT-X-PROGRAM-DATE-TIME标签添加到播放列表中这会导致节目日期和媒体分段之间的映射变得模糊。<br></p> <p>6.2.1.  General Server Responsibilities<br></p> <p>6.2.2.  Live Playlists<br></p> <p>6.2.3.  Encrypting Media Segments<br></p> <p>6.2.4.  Providing Variant Streams<br></p> <p>服务器可以提供多个媒体播放列表文件来提供不同的<br>   相同演示文稿的编码。如果它这样做,它应该提供<br>   列出每个变体流允许的主播放列表文件<br>   客户端动态地在编码之间切换。<br><br><br>   主播放列表用EXT-X-STREAM-<br>   INF标签和I-frame Variant Streams与EXT-X-I-FRAME-STREAM-INF<br>   标签。<br><br><br>   如果EXT-X-STREAM-INF标签或EXT-X-I-FRAME-STREAM-INF标签包含<br>   CODECS属性,属性值必须包含每个媒体<br>   格式[RFC6381]出现在任何媒体段中<br>   由变体流指定的演绎。<br><br><br>   生成变体时,服务器必须满足以下约束条件<br>   Streams为了让客户能够无缝切换它们:<br><br><br>      每个变体流必须呈现相同的内容。<br><br><br>      匹配Variant Streams中的内容必须有匹配的时间戳。<br>      这允许客户端同步媒体。<br><br><br>      匹配Variant Streams中的内容必须匹配<br>      不连续序列号 - 见第4.3.3.3节。<br><br><br>      每个变体流中的每个媒体播放列表必须相同<br>      目标时长。唯一的例外是SUBTITLES Renditions和<br>      包含EXT-X-I-FRAMES-ONLY标签的媒体播放列表,可以<br>      如果他们有EXT-X-PLAYLIST-<br></p> <p>      VOD的类型。</p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> Each Media Playlist in each Variant Stream MUST have the same target duration. The only exceptions are SUBTITLES Renditions and Media Playlists containing an EXT-X-I-FRAMES-ONLY tag, which MAY have different target durations if they have an EXT-X-PLAYLIST- TYPE of VOD.</pre>出现在一个变体流的媒体播放列表中的内容 <br>      不在另一个必须出现在开始或结束 <br>      的媒体播放列表文件,并且不得超过目标 <br>      持续时间。 <br> <br> <br>      如果任何媒体播放列表具有EXT-X-PLAYLIST-TYPE标签,则所有媒体 <br>      播放列表必须具有相同的EXT-X-PLAYLIST-TYPE标签 <br>      值。 <br> <br> <br>      如果播放列表包含带值的EXT-X-PLAYLIST-TYPE标签 <br>      VOD,每个变体中每个媒体播放列表的第一部分 <br>      流必须从相同的媒体时间戳开始。 <br> <br> <br>      如果主播放列表中的任何媒体播放列表包含EXT-X <br>      -PROGRAM-DATE-TIME标记,然后是该主设备中的所有媒体播放列表 <br>      播放列表必须包含一致的EXT-X-PROGRAM-DATE-TIME标签 <br>      日期和时间到媒体时间戳的映射。 <br> <br> <br>      每个变体流必须包含相同的一组日期范围 <br>      一个由具有相同ID的EXT-X-DATERANGE标签标识 <br>      属性值并包含相同的一组属性/值 <br>      对。 <br> <br> <br>   此外,为了最广泛的兼容性,变体流应该 <br>   包含相同的编码音频比特流。这允许客户 <br>   在变化流之间切换而不会听到干扰。 <br> <br> <br>   Variant Streams的规则也适用于替代转换 -  <br>   参见第4.3.4.2.1节。 <br> <p>6.3.  Client Responsibilities<br></p> <p>6.3.1.  General Client Responsibilities<br></p> <p>客户端如何获取播放列表文件的URI不在<br>    本文档的范围; 据推测已经这样做了。<br><br><br>    客户端从URI获取播放列表文件。 如果播放列表<br>    如此获得的文件是一个主播放列表,客户可以选择一个<br>    变体流从主播放列表加载。<br><br><br>    客户必须确保加载的播放列表符合第4节和<br>    EXT-X-VERSION标签(如果存在)指定协议版本<br>    由客户支持; 如果任一检查失败,则客户端禁止<br></p> <p>    尝试使用播放列表,或者可能会发生意外行为。</p> <p>如果播放列表中的任何URI元素包含一个URI方案<br>    客户端无法处理,客户端必须停止播放。 所有客户<br>    必须支持HTTP方案。<br><br><br>    在解析播放列表,客户端时支持向前兼容性<br>    必须:<br><br><br>    o忽略任何无法识别的标签。<br><br><br>    o忽略任何具有无法识别的属性/值对<br>      AttributeName会。<br><br><br>    o忽略包含类型的属性/值对的任何标签<br>       枚举字符串的属性名称被识别,但是其中的<br>       AttributeValue不被识别,除非定义了<br>       否则属性说。<br><br><br>    客户端用于在Variant Stream之间切换的算法是<br>    超出了本文的范围。<br></p> <p>6.3.2.  Loading the Media Playlist file<br></p> <p>每次播放列表加载或重新加载媒体播放列表时<br>   URI,客户端必须确定要加载的下一个媒体段<br>   如果它打算播放演示文稿,在第6.3.5节中描述<br>   通常(即按标称播放速率按播放列表顺序)。<br><br><br>   如果媒体播放列表包含EXT-X-MEDIA-SEQUENCE标签,则<br>   客户端应该假设其中的每个媒体段都会变成<br>   播放列表文件加载时不可用<br>   播放列表文件的持续时间。<br><br><br>   客户可以使用段媒体序列号来跟踪<br>   当播放列表存在时,媒体段在播放列表中的位置<br>   重新加载。<br><br><br>   客户不得假定具有相同媒体序列的片段<br>   不同变种流或变种中的数量相同<br>   在演讲中的位置;播放列表可以有独立的媒体<br>   序列号。相反,客户端必须使用相对位置<br>   播放列表时间轴上的每个片段及其不连续性<br>   序列号来定位相应的片段。<br><br><br>   客户端必须加载每个Rendition的媒体播放列表文件<br>   选定用于播放以便定位特定于该媒体的媒体<br>   移交。但是,为了防止服务器上不必要的负载,它应该<br></p> <p>   不要加载任何其他Rendition的播放列表文件。</p> <p>对于某些变体流,可以选择这样做的Renditions<br>    不包括由EXT-X-STREAM-INF标签指定的Rendition。 如<br>    如上所述,客户端不应该加载那些Rendition<br>   案例。<br></p> <p>6.3.3.  Playing the Media Playlist file<br></p> <p>    客户端应该首先选择从那个分片开始播放。如果EXT-X-ENDLIST没有出现,而且客户希望正常速度播放,那么不应该选择离结束时间点少于3个分片的段开始播放,因为可能导致停顿。</p> <p>    正常播放可以通过播放中的媒体片段来实现<br>   为了它们出现在播放列表中。客户可以出示<br>   可用媒体以其希望的任何方式,包括正常播放,<br>   随机存取和特技模式。<br><br><br>   媒体片段中的样本的编码参数<br>   媒体播放列表中的多个媒体片段应该保持一致。<br>   但是,客户应该按照原样处理编码更改<br>   遇到,例如通过缩放视频内容以适应a<br>   分辨率变化。如果变体流包含解决方案<br>   属性,客户端应该显示矩形内的所有视频<br>   与该决议相同的比例。<br><br><br>   客户应该准备好处理一个特定的多个轨道<br>   类型(例如音频或视频)。没有其他偏好的客户应该<br>   选择具有最低数字轨道标识符的轨道<br>   可以玩。<br><br><br>   客户端应该忽略传输流内的私有流<br>   他们不承认。私人流可用于支持<br>   不同的设备具有相同的流,虽然流作者<br>   应该对这种额外的网络负载敏感。<br><br><br>   客户端必须准备重置它的解析器和解码器,<br>   在播放具有EXT-X-DISCONTINUITY标记的媒体分段之前<br>   应用于它,否则会发生播放错误。<br><br><br>   客户应该尝试在时间之前加载媒体片段<br>   他们将需要不间断播放来弥补<br></p> <p>   等待时间和吞吐量的暂时变化。</p> <p>如果该值包含时区信息,则客户端应将其带入<br>    帐户; 如果不是,客户可能会认为时间是本地的。<br><br><br>    请注意,播放列表中的日期可以引用内容的时间<br>    产生(或其他时间),这与时间无关<br>    回放。<br><br><br>    如果播放列表中的第一个EXT-X-PROGRAM-DATE-TIME标签出现在后面<br>    一个或多个媒体分段URI,客户端应该外推<br>    从该标记向后(使用EXTINF持续时间和/或媒体)<br>    时间戳)将日期与这些段相关联。 关联一个<br>    与任何其他没有EXT-X的媒体片段一起使用<br>    -PROGRAM-DATE-TIME标签直接应用于它,客户端应该<br>    从最后一个EXT-X-PROGRAM-DATE-TIME标签推断<br>    出现在播放列表中的该段之前。<br></p> <p>6.3.4.  Reloading the Media Playlist file<br></p> <p><br></p> <p> 客户端必须定期重新加载媒体播放列表文件来学习<br>   目前有哪些媒体可用,除非它包含EXT-X<br>   -PLAYLIST-TYPE标记的值为VOD,或值为EVENT和<br>   EXT-X-ENDLIST标签也存在。<br><br><br>   但客户端不得尝试重新加载播放列表文件<br>   经常超过本节规定的限制<br>   服务器上的集体负载。<br></p> <pre class="newpage" style="font-size:13.3333px;"> Variant Stream. It can use the EXTINF durations and the constraints in Section 6.2.4 to determine the approximate location of corresponding media. Once media from the new Variant Stream has been loaded, the timestamps in the Media Segments can be used to synchronize the old and new timelines precisely. A client MUST NOT attempt to use the Media Sequence Number to synchronize between streams - see Section 6.3.2.</pre> <br> <br>   当客户端第一次加载播放列表文件或重新加载时 <br>   播放列表文件,并发现自上次播放列表文件以来发生了更改 <br>   被加载时,客户端必须至少等待目标持续时间 <br>   在尝试重新加载播放列表文件之前,从测量 <br>   上次客户端开始加载播放列表文件。 <br> <br> <br>   如果客户端重新加载播放列表文件并发现它没有 <br>   改变,那么它必须等待目标的一半 <br>   重试前的持续时间。 <br> <br> <br>   重新加载媒体播放列表后,客户端应该验证每个 <br>   其中的媒体段具有相同的URI(如果指定了字节范围) <br>   作为具有相同媒体序列号的媒​​体​​段 <br>   之前的媒体播放列表。它应该停止播放,如果没有,如 <br>   这通常表示服务器错误。 <br> <br> <br>   为了减少服务器负载,客户端不应该重新加载 <br>   变体流的播放列表文件或替代演绎 <br>   目前未播放。如果它决定将播放切换到 <br>   不同的变种流,它应该停止重新加载播放列表 <br>   旧的Variant Stream并开始加载新的播放列表 <br> <p>6.3.5.  Determining the next segment to load<br></p> <p>6.3.6.  Decrypting encrypted Media Segments<br></p> <p>7.  Protocol version compatibility<br></p> <p>8.  Playlist Examples<br></p> <p>8.1.  Simple Media Playlist<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> #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</pre> <p>8.2.  Live Media Playlist, using HTTPS<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> #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</pre> <p>8.3.  Playlist with encrypted Media Segments<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> #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</pre> <p>8.4.  Master Playlist<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000 http://example.com/low.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000 http://example.com/mid.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000 http://example.com/hi.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5" http://example.com/audio-only.m3u8</pre> <p>8.5.  Master Playlist with I-Frames<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1280000 low/audio-video.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=86000,URI="low/iframe.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=2560000 mid/audio-video.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=150000,URI="mid/iframe.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=7680000 hi/audio-video.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=550000,URI="hi/iframe.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5" audio-only.m3u8</pre> <br> <p>8.6.  Master Playlist with Alternative audio<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> In this example, the CODECS attributes have been condensed for space. A '\' is used to indicate that the tag continues on the following line with whitespace removed: #EXTM3U #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="English", \ DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="en", \ URI="main/english-audio.m3u8" #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Deutsch", \ DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="de", \ URI="main/german-audio.m3u8" #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Commentary", \ DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="en", \ URI="commentary/audio-only.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac" low/video-only.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac" mid/video-only.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac" hi/video-only.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5",AUDIO="aac" main/english-audio.m3u8</pre> <br> <p>8.7.  Master Playlist with Alternative video<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> This example shows 3 different video Renditions (Main, Centerfield and Dugout), and 3 different Variant Streams (low, mid and high). In this example, clients that did not support the EXT-X-MEDIA tag and the VIDEO attribute of the EXT-X-STREAM-INF tag would only be able to play the video Rendition "Main". </pre> <pre class="newpage" style="font-size:13.3333px;"> Since the EXT-X-STREAM-INF tag has no AUDIO attribute, all video Renditions would be required to contain the audio. In this example, the CODECS attributes have been condensed for space. A '\' is used to indicate that the tag continues on the following line with whitespace removed: #EXTM3U #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Main", \ DEFAULT=YES,URI="low/main/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Centerfield", \ DEFAULT=NO,URI="low/centerfield/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Dugout", \ DEFAULT=NO,URI="low/dugout/audio-video.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",VIDEO="low" low/main/audio-video.m3u8 #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Main", \ DEFAULT=YES,URI="mid/main/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Centerfield", \ DEFAULT=NO,URI="mid/centerfield/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Dugout", \ DEFAULT=NO,URI="mid/dugout/audio-video.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",VIDEO="mid" mid/main/audio-video.m3u8 #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Main", \ DEFAULT=YES,URI="hi/main/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Centerfield", \ DEFAULT=NO,URI="hi/centerfield/audio-video.m3u8" #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Dugout", \ DEFAULT=NO,URI="hi/dugout/audio-video.m3u8" #EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",VIDEO="hi" hi/main/audio-video.m3u8</pre> <br> <p>8.8.  Session Data in a Master Playlist<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;">In this example, only the EXT-X-SESSION-DATA is shown: </pre> <pre class="newpage" style="font-size:13.3333px;"> #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"</pre> <br> <p>8.9.  CHARACTERISTICS attribute containing multiple characteristics<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> Certain characteristics are valid in combination, as in: CHARACTERISTICS= "public.accessibility.transcribes-spoken-dialog,public.easy-to-read"</pre> <br> <p>8.10.  EXT-X-DATERANGE carrying SCTE-35 tags<br></p> <p></p> <pre class="newpage" style="font-size:13.3333px;"> This example shows two EXT-X-DATERANGE tags that describe a single Date Range, with a SCTE-35 "out" splice_insert() command that is subsequently updated with an SCTE-35 "in" splice_insert() command. #EXTM3U ... #EXT-X-DATERANGE:ID="splice-6FFFFFF0",START-DATE="2014-03-05T11: 15:00Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC002F0000000000FF0 00014056FFFFFF000E011622DCAFF000052636200000000000A0008029896F50 000008700000000 ... Media Segment declarations for 60s worth of media #EXT-X-DATERANGE:ID="splice-6FFFFFF0",DURATION=59.993,SCTE35-IN= 0xFC002A0000000000FF00000F056FFFFFF000401162802E6100000000000A00 08029896F50000008700000000</pre> <br> <p>9.  Contributors<br></p> <p>10.  IANA Considerations<br></p> <p>11.  Security Considerations<br></p> <p>12.  References<br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1296107964494585856"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(http-live-streaming)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1296107964494585856.htm" title="http-live-streaming" target="_blank">http-live-streaming</a> <span class="text-muted">nier2006</span> <div>https://tools.ietf.org/html/draft-pantos-http-live-streaming-231.HTTP直播流简介HTTP实时流媒体提供了一个可靠的,成本效益的手段通过互联网提供连续和长时间的视频。它允许接收器使媒体的比特率适应当前网络条件,以保持不间断播放最好的质量。它支持插页式内容边界。它为媒体加密提供了一个灵活的框架。它可以有效地提供相同内容的多个呈现,例如</div> </li> <li><a href="/article/4555240.htm" title="http-live-streaming 协议分析" target="_blank">http-live-streaming 协议分析</a> <span class="text-muted">yangzhiloveyou</span> <div>http-live-streaming协议分析:不受限制的多媒体数据流的传输。协议支持媒体数据加密与流切换(例如不同码率)。媒体数据创建后立即传输,播放接近实时。媒体数据通常采用HTTP进行传输。播放列表由一个有序的媒体URI列表和信息标签组成,每个媒体URI指向一个媒体文件,这个媒体文件是单个连续媒体流上的一个片断。为了播放媒体流,客户端首先获取播放列表文件,然后获取并播放播放列表中的每个媒体流</div> </li> <li><a href="/article/24.htm" title="tomcat基础与部署发布" target="_blank">tomcat基础与部署发布</a> <span class="text-muted">暗黑小菠萝</span> <a class="tag" taget="_blank" href="/search/Tomcat+java+web/1.htm">Tomcat java web</a> <div>从51cto搬家了,以后会更新在这里方便自己查看。 做项目一直用tomcat,都是配置到eclipse中使用,这几天有时间整理一下使用心得,有一些自己配置遇到的细节问题。 Tomcat:一个Servlets和JSP页面的容器,以提供网站服务。 一、Tomcat安装     安装方式:①运行.exe安装包      &n</div> </li> <li><a href="/article/151.htm" title="网站架构发展的过程" target="_blank">网站架构发展的过程</a> <span class="text-muted">ayaoxinchao</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%AB%99%E6%9E%B6%E6%9E%84/1.htm">网站架构</a> <div>1.初始阶段网站架构:应用程序、数据库、文件等资源在同一个服务器上 2.应用服务和数据服务分离:应用服务器、数据库服务器、文件服务器 3.使用缓存改善网站性能:为应用服务器提供本地缓存,但受限于应用服务器的内存容量,可以使用专门的缓存服务器,提供分布式缓存服务器架构 4.使用应用服务器集群改善网站的并发处理能力:使用负载均衡调度服务器,将来自客户端浏览器的访问请求分发到应用服务器集群中的任何</div> </li> <li><a href="/article/278.htm" title="[信息与安全]数据库的备份问题" target="_blank">[信息与安全]数据库的备份问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>       如果你们建设的信息系统是采用中心-分支的模式,那么这里有一个问题   如果你的数据来自中心数据库,那么中心数据库如果出现故障,你的分支机构的数据如何保证安全呢?    是否应该在这种信息系统结构的基础上进行改造,容许分支机构的信息系统也备份一个中心数据库的文件呢?  &n</div> </li> <li><a href="/article/405.htm" title="使用maven tomcat plugin插件debug关联源代码" target="_blank">使用maven tomcat plugin插件debug关联源代码</a> <span class="text-muted">商人shang</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/debug/1.htm">debug</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E7%9C%8B%E6%BA%90%E7%A0%81/1.htm">查看源码</a><a class="tag" taget="_blank" href="/search/tomcat-plugin/1.htm">tomcat-plugin</a> <div>*首先需要配置好'''maven-tomcat7-plugin''',参见[[Maven开发Web项目]]的'''Tomcat'''部分。 *配置好后,在[[Eclipse]]中打开'''Debug Configurations'''界面,在'''Maven Build'''项下新建当前工程的调试。在'''Main'''选项卡中点击'''Browse Workspace...'''选择需要开发的</div> </li> <li><a href="/article/532.htm" title="大访问量高并发" target="_blank">大访问量高并发</a> <span class="text-muted">oloz</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E8%AE%BF%E9%97%AE%E9%87%8F%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">大访问量高并发</a> <div>大访问量高并发的网站主要压力还是在于数据库的操作上,尽量避免频繁的请求数据库。下面简 要列出几点解决方案: 01、优化你的代码和查询语句,合理使用索引 02、使用缓存技术例如memcache、ecache将不经常变化的数据放入缓存之中 03、采用服务器集群、负载均衡分担大访问量高并发压力 04、数据读写分离 05、合理选用框架,合理架构(推荐分布式架构)。 </div> </li> <li><a href="/article/659.htm" title="cache 服务器" target="_blank">cache 服务器</a> <span class="text-muted">小猪猪08</span> <a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>Cache   即高速缓存.那么cache是怎么样提高系统性能与运行速度呢?是不是在任何情况下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期开发的项目中有所体会,写下来当作总结也希望能跟大家一起探讨探讨,有错误的地方希望大家批评指正。   1.Cache   是怎么样工作的?   Cache   是分配在服务器上</div> </li> <li><a href="/article/786.htm" title="mysql存储过程" target="_blank">mysql存储过程</a> <span class="text-muted">香水浓</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>Description:插入大量测试数据 use xmpl; drop procedure if exists mockup_test_data_sp; create procedure mockup_test_data_sp( in number_of_records int ) begin declare cnt int; declare name varch</div> </li> <li><a href="/article/913.htm" title="CSS的class、id、css文件名的常用命名规则" target="_blank">CSS的class、id、css文件名的常用命名规则</a> <span class="text-muted">agevs</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>  CSS的class、id、css文件名的常用命名规则     (一)常用的CSS命名规则   头:header   内容:content/container   尾:footer   导航:nav   侧栏:sidebar   栏目:column   页面外围控制整体布局宽度:wrapper   左右中:left right </div> </li> <li><a href="/article/1040.htm" title="全局数据源" target="_blank">全局数据源</a> <span class="text-muted">AILIKES</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a><a class="tag" taget="_blank" href="/search/JNDI/1.htm">JNDI</a> <div>实验目的:为了研究两个项目同时访问一个全局数据源的时候是创建了一个数据源对象,还是创建了两个数据源对象。 1:将diuid和mysql驱动包(druid-1.0.2.jar和mysql-connector-java-5.1.15.jar)copy至%TOMCAT_HOME%/lib下;2:配置数据源,将JNDI在%TOMCAT_HOME%/conf/context.xml中配置好,格式如下:&l</div> </li> <li><a href="/article/1167.htm" title="MYSQL的随机查询的实现方法" target="_blank">MYSQL的随机查询的实现方法</a> <span class="text-muted">baalwolf</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,</div> </li> <li><a href="/article/1294.htm" title="JAVA的getBytes()方法" target="_blank">JAVA的getBytes()方法</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/OS/1.htm">OS</a> <div>    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同OS下,返回的东西不一样!      String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如: byte[] b_gbk = "</div> </li> <li><a href="/article/1421.htm" title="AngularJS中操作Cookies" target="_blank">AngularJS中操作Cookies</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/Cookies/1.htm">Cookies</a> <div>        如果你的应用足够大、足够复杂,那么你很快就会遇到这样一咱种情况:你需要在客户端存储一些状态信息,这些状态信息是跨session(会话)的。你可能还记得利用document.cookie接口直接操作纯文本cookie的痛苦经历。         幸运的是,这种方式已经一去不复返了,在所有现代浏览器中几乎</div> </li> <li><a href="/article/1548.htm" title="[Maven学习笔记五]Maven聚合和继承特性" target="_blank">[Maven学习笔记五]Maven聚合和继承特性</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>Maven聚合   在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块: 1. 模型和数据持久化层user-core, 2. 业务逻辑层user-service以 3. web展现层user-web, user-service依赖于user-core user-web依赖于user-core和use</div> </li> <li><a href="/article/1675.htm" title="【JVM七】JVM知识点总结" target="_blank">【JVM七】JVM知识点总结</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>  1. JVM运行模式 1.1 JVM运行时分为-server和-client两种模式,在32位机器上只有client模式的JVM。通常,64位的JVM默认都是使用server模式,因为server模式的JVM虽然启动慢点,但是,在运行过程,JVM会尽可能的进行优化 1.2 JVM分为三种字节码解释执行方式:mixed mode, interpret mode以及compiler </div> </li> <li><a href="/article/1802.htm" title="linux下查看nginx、apache、mysql、php的编译参数" target="_blank">linux下查看nginx、apache、mysql、php的编译参数</a> <span class="text-muted">ronin47</span> <div>在linux平台下的应用,最流行的莫过于nginx、apache、mysql、php几个。而这几个常用的应用,在手工编译完以后,在其他一些情况下(如:新增模块),往往想要查看当初都使用了那些参数进行的编译。这时候就可以利用以下方法查看。 1、nginx [root@361way ~]# /App/nginx/sbin/nginx -V nginx: nginx version: nginx/</div> </li> <li><a href="/article/1929.htm" title="unity中运用Resources.Load的方法?" target="_blank">unity中运用Resources.Load的方法?</a> <span class="text-muted">brotherlamp</span> <a class="tag" taget="_blank" href="/search/unity%E8%A7%86%E9%A2%91/1.htm">unity视频</a><a class="tag" taget="_blank" href="/search/unity%E8%B5%84%E6%96%99/1.htm">unity资料</a><a class="tag" taget="_blank" href="/search/unity%E8%87%AA%E5%AD%A6/1.htm">unity自学</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/unity%E6%95%99%E7%A8%8B/1.htm">unity教程</a> <div>问:unity中运用Resources.Load的方法? 答:Resources.Load是unity本地动态加载资本所用的方法,也即是你想动态加载的时分才用到它,比方枪弹,特效,某些实时替换的图像什么的,主张此文件夹不要放太多东西,在打包的时分,它会独自把里边的一切东西都会集打包到一同,不论里边有没有你用的东西,所以大多数资本应该是自个建文件放置 1、unity实时替换的物体即是依据环境条件</div> </li> <li><a href="/article/2056.htm" title="线段树-入门" target="_blank">线段树-入门</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%AE%B5%E6%A0%91/1.htm">线段树</a> <div> /** * 线段树入门 * 问题:已知线段[2,5] [4,6] [0,7];求点2,4,7分别出现了多少次 * 以下代码建立的线段树用链表来保存,且树的叶子结点类似[i,i] * * 参考链接:http://hi.baidu.com/semluhiigubbqvq/item/be736a33a8864789f4e4ad18 * @author lijinna</div> </li> <li><a href="/article/2183.htm" title="全选与反选" target="_blank">全选与反选</a> <span class="text-muted">chicony</span> <a class="tag" taget="_blank" href="/search/%E5%85%A8%E9%80%89/1.htm">全选</a> <div>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>全选与反选</title> </div> </li> <li><a href="/article/2310.htm" title="vim一些简单记录" target="_blank">vim一些简单记录</a> <span class="text-muted">chenchao051</span> <a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>mac在/usr/share/vim/vimrc linux在/etc/vimrc   1、问:后退键不能删除数据,不能往后退怎么办?       答:在vimrc中加入set backspace=2   2、问:如何控制tab键的缩进?       答:在vimrc中加入set tabstop=4 (任何</div> </li> <li><a href="/article/2437.htm" title="Sublime Text 快捷键" target="_blank">Sublime Text 快捷键</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/%E5%BF%AB%E6%8D%B7%E9%94%AE/1.htm">快捷键</a><a class="tag" taget="_blank" href="/search/sublime/1.htm">sublime</a> <div>[size=large][/size]Sublime Text快捷键:Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴并格式化Ctrl+D:选择单词,重复可增加选择下一个相同的单词Ctrl+L:选择行,重复可依次增加选择下一行Ctrl+Shift+L:</div> </li> <li><a href="/article/2564.htm" title="php 引用(&)详解" target="_blank">php 引用(&)详解</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div>在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容  复制代码代码如下: <?  $a="ABC";  $b =&$a;  echo</div> </li> <li><a href="/article/2691.htm" title="SVN中trunk,branches,tags用法详解" target="_blank">SVN中trunk,branches,tags用法详解</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a> <div>Subversion有一个很标准的目录结构,是这样的。比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是svn://proj/|+-trunk+-branches+-tags这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。</div> </li> <li><a href="/article/2818.htm" title="对软件设计的思考" target="_blank">对软件设计的思考</a> <span class="text-muted">e200702084</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/%E6%B4%BB%E5%8A%A8/1.htm">活动</a> <div>软件设计的宏观与微观    软件开发是一种高智商的开发活动。一个优秀的软件设计人员不仅要从宏观上把握软件之间的开发,也要从微观上把握软件之间的开发。宏观上,可以应用面向对象设计,采用流行的SSH架构,采用web层,业务逻辑层,持久层分层架构。采用设计模式提供系统的健壮性和可维护性。微观上,对于一个类,甚至方法的调用,从计算机的角度模拟程序的运行情况。了解内存分配,参数传</div> </li> <li><a href="/article/2945.htm" title="同步、异步、阻塞、非阻塞" target="_blank">同步、异步、阻塞、非阻塞</a> <span class="text-muted">geeksun</span> <a class="tag" taget="_blank" href="/search/%E9%9D%9E%E9%98%BB%E5%A1%9E/1.htm">非阻塞</a> <div>同步、异步、阻塞、非阻塞这几个概念有时有点混淆,在此文试图解释一下。   同步:发出方法调用后,当没有返回结果,当前线程会一直在等待(阻塞)状态。 场景:打电话,营业厅窗口办业务、B/S架构的http请求-响应模式。   异步:方法调用后不立即返回结果,调用结果通过状态、通知或回调通知方法调用者或接收者。异步方法调用后,当前线程不会阻塞,会继续执行其他任务。 实现:</div> </li> <li><a href="/article/3072.htm" title="Reverse SSH Tunnel 反向打洞實錄" target="_blank">Reverse SSH Tunnel 反向打洞實錄</a> <span class="text-muted">hongtoushizi</span> <a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a> <div>實際的操作步驟: # 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port ssh -NfR 12345:localhost:22 fred@myhost.com # 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器 ssh localhost -p 1</div> </li> <li><a href="/article/3199.htm" title="Hibernate中的缓存" target="_blank">Hibernate中的缓存</a> <span class="text-muted">Josh_Persistence</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98/1.htm">一级缓存</a><a class="tag" taget="_blank" href="/search/Hiberante%E7%BC%93%E5%AD%98/1.htm">Hiberante缓存</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E8%AF%A2%E7%BC%93%E5%AD%98/1.htm">查询缓存</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98/1.htm">二级缓存</a> <div>Hibernate中的缓存   一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存</div> </li> <li><a href="/article/3326.htm" title="对象关系行为模式之延迟加载" target="_blank">对象关系行为模式之延迟加载</a> <span class="text-muted">home198979</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%BB%B6%E8%BF%9F%E5%8A%A0%E8%BD%BD/1.htm">延迟加载</a> <div>形象化设计模式实战     HELLO!架构   一、概念 Lazy Load:一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。 延迟加载貌似很简单,就是在数据需要时再从数据库获取,减少数据库的消耗。但这其中还是有不少技巧的。     二、实现延迟加载 实现Lazy Load主要有四种方法:延迟初始化、虚</div> </li> <li><a href="/article/3453.htm" title="xml 验证" target="_blank">xml 验证</a> <span class="text-muted">pengfeicao521</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/xml%E8%A7%A3%E6%9E%90/1.htm">xml解析</a> <div>有些字符,xml不能识别,用jdom或者dom4j解析的时候就报错 public static void testPattern() { // 含有非法字符的串 String str =       "Jamey&#52828;&#01;&#02;&#209;&#1282</div> </li> <li><a href="/article/3580.htm" title="div设置半透明效果" target="_blank">div设置半透明效果</a> <span class="text-muted">spjich</span> <a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%8D%8A%E9%80%8F%E6%98%8E/1.htm">半透明</a> <div>为div设置如下样式:   div{filter:alpha(Opacity=80);-moz-opacity:0.5;opacity: 0.5;}        说明: 1、filter:对win IE设置半透明滤镜效果,filter:alpha(Opacity=80)代表该对象80%半透明,火狐浏览器不认2、-moz-opaci</div> </li> <li><a href="/article/3707.htm" title="你真的了解单例模式么?" target="_blank">你真的了解单例模式么?</a> <span class="text-muted">w574240966</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B/1.htm">单例</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>    单例模式,很多初学者认为单例模式很简单,并且认为自己已经掌握了这种设计模式。但事实上,你真的了解单例模式了么。   一,单例模式的5中写法。(回字的四种写法,哈哈。)     1,懒汉式           (1)线程不安全的懒汉式 public cla</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>