m3u8 文件格式详解

Note: 文章中的参考链接大多来自 维基百科,需要 “科学上网” 才可以访问。

文章目录

    • 简介
    • M3U8 文件简介
    • m3u8 文件格式简解
      • 1.文件播放列表格式定义
      • 2.属性列表(Attribute Lists)
      • 3.标签
        • 3.1 基础标签(Basic Tags)
        • 3.2 媒体片段类型标签(Media Segment Tags)
          • EXTINF
          • EXT-X-BYTERANGE
          • EXT-X-DISCONTINUITY
          • EXT-X-KEY
          • EXT-X-MAP
          • EXT-X-PROGRAM-DATE-TIME
        • 3.3 媒体播放列表类型标签
          • EXT-X-TARGETDURATION
          • EXT-X-MEDIA-SEQUENCE
          • EXT-X-DISCONTINUITY-SEQUENCE
          • EXT-X-ENDLIST
          • EXT-X-PLAYLIST-TYPE
          • EXT-X-I-FRAMES-ONLY
        • 3.4 主播放列表类型标签
          • EXT-X-MEDIA
          • EXT-X-STREAM-INF
          • EXT-X-I-FRAME-STREAM-INF
          • EXT-X-SESSION-DATA
          • EXT-X-SESSION-KEY
        • 3.5 播放列表类型标签
          • EXT-X-INDEPENDENT-SEGMENTS
          • EXT-X-START
    • 其余一些注意事项
    • 附录

简介

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。“M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

上述文字定义来自于维基百科。可以看到,m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS) 协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。

HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。
HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

简而言之,HLS 是新一代流媒体传输协议,其基本实现原理为将一个大的媒体文件进行分片,将该分片文件资源路径记录于 m3u8 文件(即 playlist)内,其中附带一些额外描述(比如该资源的多带宽信息···)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。

因此,客户端获取 HLS 流文件,主要就是对 m3u8 文件进行解析操作。

那么,下面就简单介绍下 m3u8 文件。

M3U8 文件简介

m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

当 m3u8 文件作为媒体播放列表(Meida 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

对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要 定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。

当 m3u8 作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Stream)。其格式如下所示:

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

该备用流资源指定了多种不同码率,不同格式的媒体播放列表,并且,该备用流资源也可同时提供不同版本的资源内容,比如不同语言的音频文件,不同角度拍摄的视屏文件等等。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。

更多详细内容,可查看:

  • Creating a Master Playlist
  • Adding Alternate Media to a Playlist

以上,就是 m3u8 文件的大概内容。下面,我们就对 m3u8 内容格式进行讲解。

m3u8 文件格式简解

m3u8 的文件格式主要包含三方面内容:

1.文件播放列表格式定义

文件播放列表格式定义:播放列表(Playlist,也即 m3u8 文件) 内容需严格满足规范定义所提要求。下面罗列一些主要遵循的条件:

  • m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
  • m3u8 文件的每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素。
  • m3u8 文件中以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。

2.属性列表(Attribute Lists)

属性列表(Attribute Lists):某些特定的标签的值为属性列表。标签后面的属性列表以 逗号 作为分隔符,分离出多组不带空格的 属性/值 对。

属性/值 对的语法格式如下:

AttributeName=AttributeValue

其中:

  • 属性AttributeName 是由 [A…Z],[0…9] 和 - 组成的不带引号的字符串。因此,属性AttributeName只能使用大写字母,不能使用小写字母,并且AttributeName=中间不能有空格,同理,=AttributeValue之间也不能有空格。
  • AttributeValue 的只能取以下类型:
    • 十进制整型(decimal-interger):由 [0…9] 之间组成的十进制不带引号的字符串,范围为 0 − 2 64 0 - 2^{64} 0264字符长度为 1 ~ 20 之间。
    • 十六进制序列:由 [0…9] 和 [A…F] 且前缀为 0x 或 0X 组合成的不带引号的字符串。其序列的最大长度取决于他的属性名AttributeNames
    • 带符号十进制浮点型(signed-decimal-floating-point):由 [0…9],-.组合成的不带引号的字符串。
    • 字符串(quoted-string):由双引号包裹表示的字符串。其中,0xA,0xD 和 双引号"不能出现在该字符串中。该字符串区分大小写。
    • 可枚举字符串(enumerated-string):由AttributeName显示定义的一系列不带引号的字符串。该字符串不能包含双引号",逗号,和空白字符。
    • decimal-resolution:由字符x进行隔离的两个十进制整型数。第一个整型表示水平宽度大小,第二个整型数表示垂直方向高度大小(单位:像素)。

3.标签

标签:标签用于指定 m3u8 文件的全局参数或在其后面的切片文件/媒体播放列表的一些信息。

标签的类型可分为五种类型:基础标签(Basic Tags)媒体片段类型标签(Media Segment Tags)媒体播放列表类型标签主播放列表类型标签播放列表类型标签。其具体内容如下所示:

3.1 基础标签(Basic Tags)

基础标签(Basic Tags):可同时适用于媒体播放列表(Media Playlist)和主播放列表(Master Playlist)。具体标签如下:

  • EXTM3U:表明该文件是一个 m3u8 文件。每个 M3U 文件必须将该标签放置在第一行。
  • EXT-X-VERSION:表示 HLS 的协议版本号,该标签与流媒体的兼容性相关。该标签为全局作用域,使能整个 m3u8 文件;每个 m3u8 文件内最多只能出现一个该标签定义。如果 m3u8 文件不包含该标签,则默认为协议的第一个版本。

3.2 媒体片段类型标签(Media Segment Tags)

媒体片段类型标签(Media Segment Tags):每个切片 URI 前面都有一系列媒体片段标签对其进行描述。有些片段标签只对其后切片资源有效;有些片段标签对其后所有切片都有效,直到后续遇到另一个该标签描述。媒体片段类型标签不能出现在主播放列表(Master Playlist)中。具体标签如下:

EXTINF

EXTINF:表示其后 URL 指定的媒体片段时长(单位为秒)。每个 URL 媒体片段之前必须指定该标签。该标签的使用格式为:

#EXTINF:,[]
</code></pre> 
  <p>其中:<br><br> <code>duration</code>:可以为十进制的整型或者浮点型,其值必须小于或等于 <strong>EXT-X-TARGETDURATION</strong> 指定的值。<br> 注:建议始终使用浮点型指定时长,这可以让客户端在定位流时,减少四舍五入错误。但是如果兼容版本号 <strong>EXT-X-VERSION</strong> 小于 3,那么必须使用整型。</p> 
  <h5>EXT-X-BYTERANGE</h5> 
  <p><strong>EXT-X-BYTERANGE</strong>:该标签表示接下来的切片资源是其后 URI 指定的媒体片段资源的局部范围(即截取 URI 媒体资源部分内容作为下一个切片)。该标签只对其后一个 URI 起作用。其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-BYTERANGE:<n>[@<o>]
</code></pre> 
  <p>其中: <br></p> 
  <ul> 
   <li><code>n</code>是一个十进制整型,表示截取片段大小(单位:字节)。</li> 
   <li>可选参数<code>o</code>也是一个十进制整型,指示截取起始位置(以字节表示,在 URI 指定的资源开头移动该字节位置后进行截取)。</li> 
  </ul> 
  <p>如果<code>o</code>未指定,则截取起始位置从上一个该标签截取完成的下一个字节(即上一个<code>n+o+1</code>)开始截取。<br> 如果没有指定该标签,则表明的切分范围为整个 URI 资源片段。<br> 注:使用 <strong>EXT-X-BYTERANGE</strong> 标签要求兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 4。</p> 
  <h5>EXT-X-DISCONTINUITY</h5> 
  <p><strong>EXT-X-DISCONTINUITY</strong>:该标签表明其前一个切片与下一个切片之间存在中断。其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-DISCONTINUITY
</code></pre> 
  <p>当以下任一情况变化时,必须使用该标签:</p> 
  <ul> 
   <li>文件格式(file format) 
    <ul> 
     <li>数字(number),类型(type),媒体标识符(identifiers of tracks)</li> 
    </ul> </li> 
   <li>时间戳序列(timestamp sequence)</li> 
  </ul> 
  <p>当以下任一情况变化时,应当使用该标签:</p> 
  <ul> 
   <li>编码参数(encoding parameters) 
    <ul> 
     <li>编码序列(encoding sequence)</li> 
    </ul> </li> 
  </ul> 
  <p>注:<strong>EXT-X-DISCONTINUITY</strong> 的一个经典使用场景就是在视屏流中插入广告,由于视屏流与广告视屏流不是同一份资源,因此在这两种流切换时使用 <strong>EXT-X-DISCONTINUITY</strong> 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。<br> 更多详细内容,请查看:Incorporating Ads into a Playlist</p> 
  <h5>EXT-X-KEY</h5> 
  <p><strong>EXT-X-KEY</strong>:媒体片段可以进行加密,而该标签可以指定解密方法。<br> 该标签对所有 <em>媒体片段</em> 和 由标签 <strong>EXT-X-MAP</strong> 声明的围绕其间的所有 <em>媒体初始化块(Meida Initialization Section)</em> 都起作用,直到遇到下一个 <strong>EXT-X-KEY</strong>(若 m3u8 文件只有一个 <strong>EXT-X-KEY</strong> 标签,则其作用于所有媒体片段)。<br> 多个 <strong>EXT-X-KEY</strong> 标签如果最终生成的是同样的秘钥,则他们都可作用于同一个媒体片段。</p> 
  <p>该标签使用格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-KEY:<attribute-list>
</code></pre> 
  <p>属性列表可以包含如下几个键:</p> 
  <ul> 
   <li><strong>METHOD</strong>:该值是一个可枚举的字符串,指定了加密方法。<br> 该键是必须参数。其值可为<code>NONE</code>,<code>AES-128</code>,<code>SAMPLE-AES</code>当中的一个。<br> 其中:<br> <code>NONE</code>:表示切片未进行加密(此时其他属性不能出现);<br> <code>AES-128</code>:表示表示使用 AES-128 进行加密。<br> <code>SAMPLE-AES</code>:意味着媒体片段当中包含样本媒体,比如音频或视频,它们使用 AES-128 进行加密。这种情况下 <strong>IV</strong> 属性可以出现也可以不出现。</li> 
   <li><strong>URI</strong>:指定密钥路径。<br> 该密钥是一个 16 字节的数据。<br> 该键是必须参数,除非 <strong>METHOD</strong> 为<code>NONE</code>。</li> 
   <li><strong>IV</strong>:该值是一个 128 位的十六进制数值。<br> AES-128 要求使用相同的 16字节 IV 值进行加密和解密。使用不同的 IV 值可以增强密码强度。<br> 如果属性列表出现 <strong>IV</strong>,则使用该值;如果未出现,则默认使用媒体片段序列号(即 <strong>EXT-X-MEDIA-SEQUENCE</strong>)作为其 <strong>IV</strong> 值,使用大端字节序,往左填充 0 直到序列号满足 16 字节(128 位)。</li> 
   <li><strong>KEYFORMAT</strong>:由双引号包裹的字符串,标识密钥在密钥文件中的存储方式(密钥文件中的 AES-128 密钥是以二进制方式存储的16个字节的密钥)。<br> 该属性为可选参数,其默认值为<code>"identity"</code>。<br> 使用该属性要求兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 5。</li> 
   <li><strong>KEYFORMATVERSIONS</strong>:由一个或多个被<code>/</code>分割的正整型数值构成的带引号的字符串(比如:<code>"1"</code>,<code>"1/2"</code>,<code>"1/2/5"</code>)。<br> 如果有一个或多特定的 <strong>KEYFORMT</strong> 版本被定义了,则可使用该属性指示具体版本进行编译。<br> 该属性为可选参数,其默认值为<code>"1"</code>。<br> 使用该属性要求兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 5。</li> 
  </ul> 
  <h5>EXT-X-MAP</h5> 
  <p><strong>EXT-X-MAP</strong>:该标签指明了获取媒体初始化块(Meida Initialization Section)的方法。<br> 该标签对其后所有媒体片段生效,直至遇到另一个 <strong>EXT-X-MAP</strong> 标签。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-MAP:<attribute-list>
</code></pre> 
  <p>其属性列表取值范围如下:</p> 
  <ul> 
   <li><strong>URI</strong>:由引号包裹的字符串,指定了包含媒体初始化块的资源的路径。该属性为必选参数。</li> 
   <li><strong>BYTERANGE</strong>:由引号包裹的字符串,指定了媒体初始化块在 <strong>URI</strong> 指定的资源的位置(片段)。<br> 该属性指定的范围应当只包含媒体初始化块。<br> 该属性为可选参数,如果未指定,则表示 <strong>URI</strong> 指定的资源就是全部的媒体初始化块。</li> 
  </ul> 
  <h5>EXT-X-PROGRAM-DATE-TIME</h5> 
  <p><strong>EXT-X-PROGRAM-DATE-TIME</strong>:该标签使用一个绝对日期/时间表明第一个样本片段的取样时间。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-PROGRAM-DATE-TIME:<date-time-msec>
</code></pre> 
  <p>其中,<code>date-time-msec</code>是一个 ISO/IEC 8601:2004 规定的日期格式,形如:YYYY-MM-DDThh:mm:ss.SSSZ。</p> 
  <ul> 
   <li><strong>EXT-X-DATERANGE</strong>:该标签定义了一系列由属性/值对组成的日期范围。<br> 其格式为:</li> 
  </ul> 
  <pre><code class="prism language-m3u8">#EXT-X-DATERANGE:<attribute-list>
</code></pre> 
  <p>其属性列表取值如下:</p> 
  <p><strong>ID</strong>:双引号包裹的唯一指明日期范围的标识。<br> 该属性为必选参数。</p> 
  <p><strong>CLASS</strong>:双引号包裹的由客户定义的一系列属性与与之对应的语意值。<br> 所有拥有同一 <strong>CLASS</strong> 属性的日期范围必须遵守对应的语意。<br> 该属性为可选参数。</p> 
  <p><strong>START-DATE</strong>:双引号包裹的日期范围起始值。<br> 该属性为必选参数。</p> 
  <p><strong>END-DATE</strong>:双引号包裹的日期范围结束值。<br> 该属性值必须大于或等于 <strong>START-DATE</strong>。<br> 该属性为可选参数。</p> 
  <p><strong>DURATION</strong>:日期范围的持续时间是一个十进制浮点型数值类型(单位:秒)。<br> 该属性值不能为负数。<br> 当表达立即时间时,将该属性值设为 0 即可。<br> 该属性为可选参数。</p> 
  <p><strong>PLANNED-DURATION</strong>:该属性为日期范围的期望持续时长。<br> 其值为一个十进制浮点数值类型(单位:秒)。<br> 该属性值不能为负数。<br> 在预先无法得知真实持续时长的情况下,可使用该属性作为日期范围的期望预估时长。<br> 该属性为可选参数。</p> 
  <ul> 
   <li> <p><strong>X-</strong>:<code>X-</code>前缀是预留给客户端自定义属性的命名空间。<br> 客户端自定义属性名时,应当使用反向 DNS(reverse-DNS)语法来避免冲突。<br> 自定义属性值必须是使用双引号包裹的字符串,或者是十六进制序列,或者是十进制浮点数,比如:<code>X-COM-EXAMPLE-AD-ID="XYZ123"</code>。<br> 该属性为可选参数。</p> </li> 
   <li> <p><strong>SCTE35-CMD, SCTE35-OUT, SCTE35-IN</strong>:用于携带 SCET-35 数据。<br> 该属性为可选参数。</p> </li> 
   <li> <p><strong>END-ON-NEXT</strong>:该属性值为一个可枚举字符串,其值必须为<code>YES</code>。<br> 该属性表明达到该范围末尾,也即等于后续范围的起始位置 <strong>START-DATE</strong>。后续范围是指具有相同 <strong>CLASS</strong> 的,在该标签 <strong>START-DATE</strong> 之后的具有最早 <strong>START-DATE</strong> 值的日期范围。<br> 该属性时可选参数。</p> </li> 
  </ul> 
  <h4>3.3 媒体播放列表类型标签</h4> 
  <p><strong>媒体播放列表类型标签</strong>:媒体播放列表标签为 m3u8 文件的全局参数信息。<br> 这些标签只能在 m3u8 文件中至多出现一次。<br> 媒体播放列表(Media Playlist)标签不能出现在主播放列表(Master Playlist)中。<br> 媒体播放列表具体标签如下所示:</p> 
  <h5>EXT-X-TARGETDURATION</h5> 
  <p><strong>EXT-X-TARGETDURATION</strong>:表示每个视频分段最大的时长(单位秒)。<br> 该标签为必选标签。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-TARGETDURATION:<s>
</code></pre> 
  <p>其中:参数<code>s</code>表示目标时长(单位:秒)。</p> 
  <h5>EXT-X-MEDIA-SEQUENCE</h5> 
  <p><strong>EXT-X-MEDIA-SEQUENCE</strong>:表示播放列表第一个 URL 片段文件的序列号。<br> 每个媒体片段 URL 都拥有一个唯一的整型序列号。<br> 每个媒体片段序列号按出现顺序依次加 1。<br> 如果该标签未指定,则默认序列号从 0 开始。<br> 媒体片段序列号与片段文件名无关。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-MEDIA-SEQUENCE:<number>
</code></pre> 
  <p>其中:参数<code>number</code>即为切片序列号。</p> 
  <h5>EXT-X-DISCONTINUITY-SEQUENCE</h5> 
  <p><strong>EXT-X-DISCONTINUITY-SEQUENCE</strong>:该标签使能同步相同流的不同 Rendition 和 具备 <strong>EXT-X-DISCONTINUITY</strong> 标签的不同备份流。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-DISCONTINUITY-SEQUENCE:<number>
</code></pre> 
  <p>其中:参数<code>number</code>为一个十进制整型数值。</p> 
  <p>如果播放列表未设置 <strong>EXT-X-DISCONTINUITY-SEQUENCE</strong> 标签,那么对于第一个切片的中断序列号应当为 0。</p> 
  <h5>EXT-X-ENDLIST</h5> 
  <p><strong>EXT-X-ENDLIST</strong>:表明 m3u8 文件的结束。</p> 
  <p>该标签可出现在 m3u8 文件任意位置,一般是结尾。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-ENDLIST
</code></pre> 
  <h5>EXT-X-PLAYLIST-TYPE</h5> 
  <p><strong>EXT-X-PLAYLIST-TYPE</strong>:表明流媒体类型。全局生效。</p> 
  <p>该标签为可选标签。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-PLAYLIST-TYPE:<type-enum>
</code></pre> 
  <p>其中:<code>type-enum</code>可选值如下:</p> 
  <ul> 
   <li> <p><strong>VOD</strong>:即 Video on Demand,表示该视屏流为点播源,因此服务器不能更改该 m3u8 文件;</p> </li> 
   <li> <p><strong>EVENT</strong>:表示该视频流为直播源,因此服务器不能更改或删除该文件任意部分内容(但是可以在文件末尾添加新内容)。</p> <p>注:<strong>VOD</strong> 文件通常带有 <strong>EXT-X-ENDLIST</strong> 标签,因为其为点播源,不会改变;而 <strong>EVEVT</strong> 文件初始化时一般不会有 <strong>EXT-X-ENDLIST</strong> 标签,暗示有新的文件会添加到播放列表末尾,因此也需要客户端定时获取该 m3u8 文件,以获取新的媒体片段资源,直到访问到 <strong>EXT-X-ENDLIST</strong> 标签才停止)。</p> </li> 
  </ul> 
  <h5>EXT-X-I-FRAMES-ONLY</h5> 
  <p><strong>EXT-X-I-FRAMES-ONLY</strong>:该标签表示每个媒体片段都是一个 <strong>I-frame</strong>。<strong>I-frames</strong> 帧视屏编码不依赖于其他帧数,因此可以通过 <strong>I-frame</strong> 进行快速播放,急速翻转等操作。<br> 该标签全局生效。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-I-FRAMES-ONLY
</code></pre> 
  <p>如果播放列表设置了 <strong>EXT-X-I-FRAMES-ONLY</strong>,那么切片的时长(<strong>EXTINF</strong> 标签的值)即为当前切片 <strong>I-frame</strong> 帧开始到下一个 <strong>I-frame</strong> 帧出现的时长。</p> 
  <p>媒体资源如果包含 <strong>I-frame</strong> 切片,那么必须提供媒体初始化块或者通过 <strong>EXT-X-MAP</strong> 标签提供媒体初始化块的获取途径,这样客户端就能通过这些 <strong>I-frame</strong> 切片以任意顺序进行加载和解码。</p> 
  <p>如果 <strong>I-frame</strong> 切片设置了 <strong>EXT-BYTERANGE</strong>,那么就绝对不能提供媒体初始化块。</p> 
  <p>使用 <strong>EXT-X-I-FRAMES-ONLY</strong> 要求的兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 4。</p> 
  <h4>3.4 主播放列表类型标签</h4> 
  <p><strong>主播放列表类型标签</strong>:主播放列表(Master Playlist)定义了备份流,多语言翻译流和其他全局参数。</p> 
  <p>主播放列表标签绝不能出现在媒体播放列表(Media Playlist)中。</p> 
  <p>其具体标签如下:</p> 
  <h5>EXT-X-MEDIA</h5> 
  <p><strong>EXT-X-MEDIA</strong>:用于指定相同内容的可替换的多语言翻译播放媒体列表资源。<br> 比如,通过三个 <strong>EXT-X-MEIDA</strong> 标签,可以提供包含英文,法语和西班牙语版本的相同内容的音频资源,或者通过两个 <strong>EXT-X-MEDIA</strong> 提供两个不同拍摄角度的视屏资源。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-MEDIA:<attribute-list>
</code></pre> 
  <p>其中,属性列表取值范围如下:</p> 
  <ul> 
   <li><strong>TYPE</strong>:该属性值为一个可枚举字符串。<br> 其值有如下四种:<code>AUDIO</code>,<code>VIDEO</code>,<code>SUBTITLES</code>,<code>CLOSED-CAPTIONS</code>。<br> 通常使用的都是<code>CLOSED-CAPTIONS</code>。<br> 该属性为必选参数。</li> 
   <li><strong>URI</strong>:双引号包裹的媒体资源播放列表路径。<br> 如果 <strong>TYPE</strong> 属性值为 <code>CLOSED-CAPTIONS</code>,那么则不能提供 <strong>URI</strong>。<br> 该属性为可选参数。</li> 
   <li><strong>GROUP-ID</strong>:双引号包裹的字符串,表示多语言翻译流所属组。<br> 该属性为必选参数。</li> 
   <li><strong>LANGUAGE</strong>:双引号包裹的字符串,用于指定流主要使用的语言。<br> 该属性为可选参数。</li> 
   <li><strong>ASSOC-LANGUAGE</strong>:双引号包裹的字符串,其内包含一个语言标签,用于提供多语言流的其中一种语言版本。<br> 该参数为可选参数。</li> 
   <li><strong>NAME</strong>:双引号包裹的字符串,用于为翻译流提供可读的描述信息。<br> 如果设置了 <strong>LANGUAGE</strong> 属性,那么也应当设置 <strong>NAME</strong> 属性。<br> 该属性为必选参数。</li> 
   <li><strong>DEFAULT</strong>:该属性值为一个可枚举字符串。<br> 可选值为<code>YES</code>和<code>NO</code>。<br> 该属性未指定时默认值为<code>NO</code>。<br> 如果该属性设为<code>YES</code>,那么客户端在缺乏其他可选信息时应当播放该翻译流。<br> 该属性为可选参数。</li> 
   <li><strong>AUTOSELECT</strong>:该属性值为一个可枚举字符串。<br> 其有效值为<code>YES</code>或<code>NO</code>。<br> 未指定时,默认设为<code>NO</code>。<br> 如果该属性设置<code>YES</code>,那么客户端在用户没有显示进行设置时,可以选择播放该翻译流,因为其能配置当前播放环境,比如系统语言选择。<br> 如果设置了该属性,那么当 <strong>DEFAULT</strong> 设置<code>YES</code>时,该属性也必须设置为<code>YES</code>。<br> 该属性为可选参数。</li> 
   <li><strong>FORCED</strong>:该属性值为一个可枚举字符串。<br> 其有效值为<code>YES</code>或<code>NO</code>。<br> 未指定时,默认设为<code>NO</code>。<br> 只有在设置了 <strong>TYPE</strong> 为 <strong>SUBTITLES</strong> 时,才可以设置该属性。<br> 当该属性设为<code>YES</code>时,则暗示该翻译流包含重要内容。当设置了该属性,客户端应当选择播放匹配当前播放环境最佳的翻译流。<br> 当该属性设为<code>NO</code>时,则表示该翻译流内容意图用于回复用户显示进行请求。<br> 该属性为可选参数。</li> 
   <li><strong>INSTREAM-ID</strong>:由双引号包裹的字符串,用于指示切片的语言(Rendition)版本。<br> 当 <strong>TYPE</strong> 设为 <strong>CLOSED-CAPTIONS</strong> 时,必须设置该属性。<br> 其可选值为:<code>"CC1"</code>, <code>"CC2"</code>, <code>"CC3"</code>, <code>"CC4"</code> 和 <code>"SERVICEn"</code>(<code>n</code>的值为 1~63)。<br> 对于其他 <strong>TYPE</strong> 值,该属性绝不能进行设置。</li> 
   <li><strong>CHARACTERISTICS</strong>:由双引号包裹的由一个或多个由逗号分隔的 UTI 构成的字符串。<br> 每个 UTI 表示一种翻译流的特征。<br> 该属性可包含私有 UTI。<br> 该属性为可选参数。</li> 
   <li><strong>CHANNELS</strong>:由双引号包裹的有序,由反斜杠<code>/</code>分隔的参数列表组成的字符串。<br> 所有音频 <strong>EXT-X-MEDIA</strong> 标签应当都设置 <strong>CHANNELS</strong> 属性。<br> 如果主播放列表包含两个相同编码但是具有不同数目 channed 的翻译流,则必须设置 <strong>CHANNELS</strong> 属性;否则,<strong>CHANNELS</strong> 属性为可选参数。</li> 
  </ul> 
  <h5>EXT-X-STREAM-INF</h5> 
  <p><strong>EXT-X-STREAM-INF</strong>:该属性指定了一个备份源。该属性值提供了该备份源的相关信息。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-STREAM-INF:<attribute-list>
<URI>
</code></pre> 
  <p>其中:</p> 
  <ul> 
   <li><strong>URI</strong> 指定的媒体播放列表携带了该标签指定的翻译备份源。<br> <strong>URI</strong> 为必选参数。</li> 
   <li><strong>EXT-X-STREAM-INF</strong> 标签的参数属性列表有如下选项:</li> 
   <li><strong>BANDWIDTH</strong>:该属性为每秒传输的比特数,也即带宽。代表该备份流的巅峰速率。<br> 该属性为必选参数。 
    <ul> 
     <li><strong>AVERAGE-BANDWIDTH</strong>:该属性为备份流的平均切片传输速率。<br> 该属性为可选参数。</li> 
     <li><strong>CODECS</strong>:双引号包裹的包含由逗号分隔的格式列表组成的字符串。<br> 每个 <strong>EXT-X-STREAM-INF</strong> 标签都应当携带 <strong>CODECS</strong> 属性。</li> 
     <li><strong>RESOLUTION</strong>:该属性描述备份流视屏源的最佳像素方案。<br> 该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</li> 
     <li><strong>FRAME-RATE</strong>:该属性用一个十进制浮点型数值作为描述备份流所有视屏最大帧率。<br> 对于备份流中任意视屏源帧数超过每秒 30 帧的,应当增加该属性设置。<br> 该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</li> 
     <li><strong>HDCP-LEVEL</strong>:该属性值为一个可枚举字符串。<br> 其有效值为<code>TYPE-0</code>或<code>NONE</code>。<br> 值为<code>TYPE-0</code>表示该备份流可能会播放失败,除非输出被高带宽数字内容保护(HDCP)。<br> 值为<code>NONE</code>表示流内容无需输出拷贝保护。<br> 使用不同程度的 HDCP 加密备份流应当使用不同的媒体加密密钥。<br> 该属性为可选参数。在缺乏 HDCP 可能存在播放失败的情况下,应当提供该属性。</li> 
     <li><strong>AUDIO</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>AUDIO</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</li> 
     <li><strong>VIDEO</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>VIDEO</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</li> 
     <li><strong>SUBTITLES</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>SUBTITLES</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</li> 
     <li><strong>CLOSED-CAPTIONS</strong>:该属性值可以是一个双引号包裹的字符串或<code>NONE</code>。<br> 如果其值为一个字符串,则必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>CLOSED-CAPTIONS</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 如果其值为<code>NONE</code>,则所有的 <strong>ext-x-stream-inf</strong> 标签必须同样将该属性设置<code>NONE</code>,表示主播放列表备份流均没有关闭的标题。对于某个备份流具备关闭标题,另一个备份流不具备关闭标题可能会触发播放中断。<br> 该属性为可选参数。</li> 
    </ul> </li> 
  </ul> 
  <h5>EXT-X-I-FRAME-STREAM-INF</h5> 
  <p><strong>EXT-X-I-FRAME-STREAM-INF</strong>:该标签表明媒体播放列表文件包含多种媒体资源的 <strong>I-frame</strong> 帧。<br> 其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-I-FRAME-STREAM-INF:<attribute-list>
</code></pre> 
  <p>该标签的属性列表包含了 <strong>EXT-X-I-FRAME-STREAM-INF</strong> 标签同样的属性列表选项,除了 <strong>FRAME-RATE</strong>,<strong>AUDIO</strong>,<strong>SUBTITLES</strong> 和 <strong>CLOSED-CAPTIONS</strong>。除此之外,其他的属性还有:</p> 
  <ul> 
   <li><strong>URI</strong>:该属性值由双引号包裹的字符串,指示了 <strong>I-frame</strong> 媒体播放列表文件的路径,该媒体播放列表文件必须包含 <strong>EXT-X-I-FRAMES-ONLY</strong> 标签。</li> 
  </ul> 
  <h5>EXT-X-SESSION-DATA</h5> 
  <p><strong>EXT-X-SESSION-DATA</strong>:该标签允许主播放列表携带任意 session 数据。</p> 
  <p>该标签为可选参数。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-SESSION-DATA:<attribute-list>
</code></pre> 
  <p>其中,其参数属性列表值如下可选项:</p> 
  <ul> 
   <li><strong>DATA-ID</strong>:由双引号包裹的字符串,代表一个特定的数据值。<br> 该属性应当使用反向 DNS 进行命名,如<code>"com.example.movie.title"</code>。然而,由于没有中央注册机构,所以可能出现冲突情况。<br> 该属性为必选参数。</li> 
   <li><strong>VALUE</strong>:该属性值为一个双引号包裹的字符串,其包含 <strong>DATA-ID</strong> 指定的值。<br> 如果设置了 <strong>LANGUAGE</strong>,则 <strong>VALUE</strong> 应当包含一个用该语言书写的可读字符串。 
    <ul> 
     <li><strong>URI</strong>:由双引号包裹的 URI 字符串。由该 URI 指示的资源必选使用 JSON 格式,否则,客户端可能会解析失败。</li> 
    </ul> </li> 
   <li><strong>LANGUAGE</strong>:由双引号包裹的,包含一个语言标签的字符串。指示了 <strong>VALUE</strong> 所使用的语言。</li> 
  </ul> 
  <h5>EXT-X-SESSION-KEY</h5> 
  <p>EXT-X-SESSION-KEY:该标签允许主播放列表(Master Playlist)指定媒体播放列表(Meida Playlist)的加密密钥。这使得客户端可以预先加载这些密钥,而无需从媒体播放列表中获取。</p> 
  <p>该标签为可选参数。</p> 
  <p>其格式为</p> 
  <pre><code class="prism language-m3u8">#EXT-X-SESSION-KEY:<attribute-list>
</code></pre> 
  <p>其属性列表与 EXT-X-KEY 相同,除了 METHOD 属性的值必须不为 <code>NONE</code>.</p> 
  <h4>3.5 播放列表类型标签</h4> 
  <p><strong>播放列表类型标签</strong>:以下标签可同时设置于主播放列表(Master Playlist)和媒体播放列表(Media Playlist)中。</p> 
  <p>但是对于在主播放列表中设置了的标签,不应当再次设置在主播放列表指向的媒体播放列表中。</p> 
  <p>同时出现在两者播放列表的相同标签必须具备相同的值。这些标签在播放列表中不能出现多次(只能使用一次)。具体标签如下所示:</p> 
  <h5>EXT-X-INDEPENDENT-SEGMENTS</h5> 
  <p><strong>EXT-X-INDEPENDENT-SEGMENTS</strong>:该标签表明对于一个媒体片段中的所有媒体样本均可独立进行解码,而无须依赖其他媒体片段信息。</p> 
  <p>该标签对列表内所有媒体片段均有效。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-INDEPENDENT-SEGMENTS
</code></pre> 
  <p>如果该标签出现在主播放列表中,则其对所有媒体播放列表的所有媒体片段都生效。</p> 
  <h5>EXT-X-START</h5> 
  <p><strong>EXT-X-START</strong>:该标签表示播放列表播放起始位置。</p> 
  <p>默认情况下,客户端开启一个播放会话时,应当使用该标签指定的位置进行播放。</p> 
  <p>该标签为可选标签。</p> 
  <p>其格式为:</p> 
  <pre><code class="prism language-m3u8">#EXT-X-START:<attribute-list>
</code></pre> 
  <p>其参数属性列表的取值范围如下:</p> 
  <ul> 
   <li><strong>TIME-OFFSET</strong>:该属性值为一个带符号十进制浮点数(单位:秒)。<br> 一个正数表示以播放列表起始位置开始的时间偏移量。<br> 一个负数表示播放列表上一个媒体片段最后位置往前的时间偏移量。<br> 该属性的绝对值应当不超过播放列表的时长。如果超过,则表示到达文件结尾(数值为正数),或者达到文件起始(数值为负数)。<br> 如果播放列表不包含 <strong>EXT-X-ENDLIST</strong> 标签,那么 <strong>TIME-OFFSET</strong> 属性值不应当在播放文件末尾三个切片时长之内。</li> 
   <li><strong>PRECISE</strong>:该值为一个可枚举字符串。<br> 有效的取值为<code>YES</code> 或 <code>NO</code>。<br> 如果值为<code>YES</code>,客户端应当播放包含 <strong>TIME-OFFSET</strong> 的媒体片段,但不要渲染该块内优先于 <strong>TIME-OFFSET</strong> 的样本块。<br> 如果值为<code>NO</code>,客户端应当尝试渲染在媒体片段内的所有样本块。<br> 该属性为可选参数,未指定则认为<code>NO</code>。</li> 
  </ul> 
  <p>到此,m3u8 相关的标签我们已经完全介绍完毕。</p> 
  <p><strong>下面我们再简单介绍下资源文件的获取具体操作</strong>。</p> 
  <p>上文提到,m3u8 文件要么是媒体播放列表(Meida Playlist),要么是主播放列表(Master Playlist)。但无论是哪种列表,其有效内容均由两部分结构组成:</p> 
  <ul> 
   <li>以 <strong>#EXT</strong> 开头的为标签信息,作为对媒体资源的进一步描述;</li> 
   <li>剩余的为资源信息,要么是片段资源(Media Playlist)路径,要么是 m3u8 资源(Master Playlist)路径;</li> 
  </ul> 
  <p>我们先简单介绍下 m3u8 文件媒体片段的表示方法:</p> 
  <ul> 
   <li>m3u8 文件中,媒体片段可以采用全路径表示。如下所示:</li> 
  </ul> 
  <pre><code class="prism language-m3u8">#EXTINF:10.0,
http://example.com/movie1/fileSequenceA.ts
</code></pre> 
  <p>这样,获取资源片段的路径就是 m3u8 文件内指定的路径,即:<code>http://example.com/movie1/fileSequenceA.ts</code></p> 
  <ul> 
   <li>m3u8 文件中,媒体片段还可以使用相对路径表示。如下所示:</li> 
  </ul> 
  <pre><code class="prism language-m3u8">#EXTINF:10.0,
fileSequenceA.ts
</code></pre> 
  <p>这表示片段文件的路径是相对于 m3u8 文件路径的,即假设当前 m3u8 的路径为:<code>https://127.0.0.1/hls/m3u8</code>,那么,片段文件 fileSequenceA.ts 的路径即为:<code>https://127.0.0.1/hls/fileSequenceA.ts</code></p> 
  <p>尽管可以在 m3u8 文件中使用绝对路径指定媒体片段资源路径,但是更好的选择是使用相对路径。相对路径相较于绝对路径更轻便,同时是相对于 m3u8 文件的 URL。相比之下,绝对路径增加了 m3u8 文件内容(更多字符),增大了文件内容,同时也增大了网络传输量。</p> 
  <h2>其余一些注意事项</h2> 
  <ul> 
   <li>有两种请求 m3u8 播放列表的方法:一是通过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8 或 .m3u 结尾;<br> 二是通过 HTTP 进行请求,则请求头<code>Content-Type</code>必须设置为 <code>application/vnd.apple.mpegurl</code>或者<code>audio/mpegurl</code>。</li> 
   <li>空行和注释行在解析时都忽略。</li> 
   <li>媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。</li> 
   <li>每个切片的码率(bit rate)就是切片的大小除以它对应的时长(<strong>EXTINF</strong> 指定的时长)。</li> 
   <li>一个标签的属性列表的同一个属性<code>AttributeName</code>只能出现一次。</li> 
   <li><strong>EXT-X-TARGETDURATION</strong> 指定的时长绝对不能进行更改。通常该值指定的时长为 10 秒。</li> 
   <li>对于指定了 <strong>EXT-X-I-FRAMES-ONLY</strong> 且 第一个媒体片段(或者第一个尾随 <strong>EXT-X-DISCONTINUITY</strong> 的片段)其资源没有立即携带媒体初始化块的切片,应当增加使用标签 <strong>EXT-X-MAP</strong> 指定媒体初始化块获取途径。</li> 
   <li>使用 <strong>EXT-X-MAP</strong> 标签内含标签 <strong>EXT-X-I-FRAMES-ONLY</strong> 要求的兼容版本号 <strong>EXT-X-VERSION</strong> 要大于等于 5;只使用 <strong>EXT-X-MAP</strong> 要求的兼容版本号要大于等于 6。</li> 
   <li>由标签 <strong>EXT-X-MAP</strong> 声明的媒体初始化块可使用 AES-128 方法进行加密,此时,作用于 <strong>EXT-X-MAP</strong> 标签的 <strong>EXT-X-KEY</strong> 标签必须设置 <strong>IV</strong> 属性。</li> 
   <li>带有属性 <strong>END-ON-NEXT=YES</strong> 的标签 <strong>EXT-X-DATERANGE</strong> 必须携带 <strong>CLASS</strong> 属性,但不能携带 <strong>DURATION</strong> 和 <strong>END-DATE</strong> 属性。其余带有相同 <strong>CLASS</strong> 的标签 <strong>EXT-X-DATERANGE</strong> 不能指定重叠的日期范围。</li> 
   <li>日期范围如果未指明 <strong>DURATION</strong>,<strong>END_DATE</strong>,<strong>END-ON-NEXT=YES</strong> 属性时,则其时长(duration)未知,即使其设置了 <strong>PLANNED-DURATION</strong> 属性。</li> 
   <li>如果播放列表设置了 <strong>EXT-X-DATERANGE</strong> 标签,则必须同时设置 <strong>EXT-X-PROGRAM-DATE-TIME</strong> 标签。</li> 
   <li>如果播放列表设置了拥有相同 <strong>ID</strong> 属性值的两个 <strong>EXT-X-DATERANGE</strong> 标签,则对于相同的属性名,在这两个 <strong>EXT-X-DATERANGE</strong> 中对应的值必须一致。</li> 
   <li>如果 <strong>EXT-X-DATERANGE</strong> 同时设置了 <strong>DURATION</strong> 和 <strong>END-DATE</strong> 属性,则 <strong>END-DATE</strong> 属性值必须等于 <strong>START-DATE</strong> 属性值加上 <strong>DURATION</strong> 属性值。</li> 
   <li><strong>EXT-X-MEDIA-SEQUENCE</strong> 标签必须出现在播放列表第一个切片之前。</li> 
   <li><strong>EXT-X-DISCONTINUITY-DEQUENCE</strong> 标签必须出现在播放列表第一个切片之前。</li> 
   <li><strong>EXT-X-DISCONTINUITY-DEQUENCE</strong> 标签必须出现在任意 <strong>EXT-X-DISCONTINUITY</strong> 标签之前。</li> 
   <li>m3u8 文件如果没有设置 <strong>EXT-X-PLAYLIST-TYPE</strong> 标签,那么播放列表可以随时进行更改。比如,可以更新或删除播放列表中的媒体片段。</li> 
   <li>每个 <strong>EXT-X-I-FRAME-STREAM-INF</strong> 标签必须包含一个 <strong>BANDWIDTH</strong> 和 <strong>URI</strong> 属性。</li> 
   <li>每个 <strong>EXT-X-SESSION-DATA</strong> 标签都必须包含一个 <strong>VALUE</strong> 或 <strong>URI</strong> 属性,但不能同时包含两者。</li> 
   <li>一个播放列表可以包含多个携带相同 <strong>DATA-ID</strong> 属性的 <strong>EXT-X-SESSION-DATA</strong> 标签。但是不能包含多个携带相同 <strong>DATA-ID</strong> 和相同 <strong>LANGUAGE</strong> 属性的 <strong>EXT-X-SESSION-DATA</strong> 标签。</li> 
   <li>如果设置了 <strong>EXT-X-SESSION-KEY</strong>,那么其 <strong>METHOD</strong>,<strong>KEYFORMAT</strong> 和 <strong>KEYFORMATVERSIONS</strong> 属性值必须与任意相同 <strong>URI</strong> 的 <strong>EXT-X-KEY</strong> 标签值相同。</li> 
   <li>如果多份备用流或者多语言流使用相同的加密密钥和格式,则应当设置 <strong>EXT-X-SESSION-KEY</strong> 标签。</li> 
   <li>主播放列表必须不能设置多个具有相同 <strong>METHOD</strong>,<strong>URI</strong>,<strong>IV</strong>,<strong>KEYFORMAT</strong> 和 <strong>KEYFORMATVERSIONS</strong> 属性值得 <strong>EXT-X-SESSION-KEY</strong> 标签。</li> 
  </ul> 
  <h2>附录</h2> 
  <ul> 
   <li>苹果官方文档</li> 
   <li>HTTP Live Streaming - rfc8216</li> 
   <li>视频内容加密封装技术研究</li> 
  </ul> 
  <center> <b>(完)</b> 
  </center> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1614407580619145216"></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">你可能感兴趣的:(m3u8,m3u8格式,m3u8加密,m3u8解密,m3u8分解)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1939289953930375168.htm"
                           title="第5篇:Gin的数据验证与绑定——确保请求数据合法性" target="_blank">第5篇:Gin的数据验证与绑定——确保请求数据合法性</a>
                        <span class="text-muted">GO兔</span>
<a class="tag" taget="_blank" href="/search/gin/1.htm">gin</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>引言在Web开发中,你是否遇到过这些令人头疼的问题?用户提交的表单数据格式混乱导致系统崩溃,恶意请求携带非法参数攻击API接口,或者因为数据校验不完善而引发的各种业务异常?这些问题的根源往往在于——我们没有在数据进入业务逻辑之前就建立起坚固的防线。今天,我将带你深入探索Gin框架的数据验证与绑定机制,教你如何用最少的代码构建最坚固的数据防护墙。一、数据绑定:自动化数据处理Gin框架最强大的特性之一</div>
                    </li>
                    <li><a href="/article/1939283148491780096.htm"
                           title="Qt开发:QCustomPlot" target="_blank">Qt开发:QCustomPlot</a>
                        <span class="text-muted">倔强老吕</span>
<a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/QCustomPlot/1.htm">QCustomPlot</a>
                        <div>【官方网站】:QtPlottingWidgetQCustomPlot-IntroductionQCustomPlot是一个用于绘制图形的QtC++库,它使得在Qt程序中创建高质量的2D图表变得简单。这个库非常适合用来展示实时数据,同时它也支持多种输出格式,包括打印质量的矢量图形如PDF文件。以下是QCustomPlot的一些主要特性:提供丰富的2D绘图类型,比如折线图、散点图、柱状图等。支持多轴图</div>
                    </li>
                    <li><a href="/article/1939278232150929408.htm"
                           title="MCP 与 AI 任务分解:如何让 AI 高效执行复杂任务?" target="_blank">MCP 与 AI 任务分解:如何让 AI 高效执行复杂任务?</a>
                        <span class="text-muted">Echo_Wish</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6/1.htm">进阶</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>MCP与AI任务分解:如何让AI高效执行复杂任务?在人工智能应用中,任务分解(TaskDecomposition)是一个绕不开的话题。无论是自动驾驶、智能客服,还是代码生成,AI都需要将复杂问题拆解成可执行的小任务,逐步完成目标。而在AI领域,MCP(Multi-StepCognitiveProcessing,多步认知处理)是一种前沿技术,旨在提升AI的任务分解能力,使其能够更精准、高效地执行复杂</div>
                    </li>
                    <li><a href="/article/1939275206300332032.htm"
                           title="什么是 MongoDB?它的主要特点有哪些?" target="_blank">什么是 MongoDB?它的主要特点有哪些?</a>
                        <span class="text-muted">真IT布道者</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>一、MongoDB概述MongoDB是一个开源的、面向文档的NoSQL数据库系统,由MongoDBInc.公司开发并维护。它采用BSON(BinaryJSON)格式存储数据,属于分布式文档数据库的类别。关键结论:MongoDB通过灵活的文档模型、水平扩展能力和丰富的查询功能,成为现代应用开发中最流行的NoSQL数据库之一。二、核心架构特点1.文档数据模型MongoDB使用文档(Document)作</div>
                    </li>
                    <li><a href="/article/1939274197603774464.htm"
                           title="VeraCrypt磁盘加密v1.26.24,绿色便携版" target="_blank">VeraCrypt磁盘加密v1.26.24,绿色便携版</a>
                        <span class="text-muted">米豆学社</span>
<a class="tag" taget="_blank" href="/search/%E7%A3%81%E7%9B%98%E5%8A%A0%E5%AF%86/1.htm">磁盘加密</a>
                        <div>[软件名称]:VeraCrypt磁盘加密v1.26.24[软件大小]:17.1MB[下载通道]:夸克盘|迅雷盘软件介绍VeraCrypt加密神器️——给你的数字世界加上金钟罩VeraCrypt是一款免费开源的跨平台磁盘加密工具,它继承了经典加密软件TrueCrypt的优秀基因,并进行了全面升级。无论你是普通用户还是专业人士,都能通过这款强大的工具保护重要数据安全。核心功能亮点虚拟加密磁盘:可以在任</div>
                    </li>
                    <li><a href="/article/1939268020748742656.htm"
                           title="AutoGPT,自主完成复杂任务" target="_blank">AutoGPT,自主完成复杂任务</a>
                        <span class="text-muted">小雷FansUnion</span>
<a class="tag" taget="_blank" href="/search/AI2025/1.htm">AI2025</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>AutoGPT是一个开源的AIAgent项目,它的核心目标是让AI能够自主完成复杂任务,而不仅仅是回答单个问题。简单来说,它让AI具备了"自主思考和行动"的能力。1.AutoGPT的核心概念什么是AIAgent?AIAgent(智能代理)是一种能够:自主规划:将大任务分解成小步骤自主决策:根据情况选择最佳行动自主执行:调用各种工具和API完成任务自主反思:评估结果并调整策略AutoGPT的独特之处</div>
                    </li>
                    <li><a href="/article/1939267389258526720.htm"
                           title="go build -gcflags 参数学习" target="_blank">go build -gcflags 参数学习</a>
                        <span class="text-muted">岳来</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录一、常用编译选项二、使用模式与包匹配规则三、应用场景与注意事项四、其他相关参数五、删除-gcflagsall=-N-l对构建的影响参考文档gobuild的-gcflags参数用于向Go编译器(gotoolcompile)传递额外选项,控制编译行为。其格式为-gcflags="[pattern=]arglist",其中pattern定义作用范围,arglist是空格分隔的编译选项。以下是关键</div>
                    </li>
                    <li><a href="/article/1939266379664388096.htm"
                           title="POS(权益证明机制)" target="_blank">POS(权益证明机制)</a>
                        <span class="text-muted">Chinatesila</span>
<a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a>
                        <div>由来:SunnyKing和ScottNadal首先建议使用权益证明作为工作量证明(PoW)的替代方案,并创造了权益一词。他们描述了一种算法,该算法根据个人钱包中代币的数量和年龄选择生产区块的节点。Peercoin(PPC)被创造出来,并成为第一个混合加密货币。PPC使用PoW分发令牌,并使用PoS验证交易。简介:权益证明机制的目的是让所谓的“权益者”、“锻造者”或者“验证者”来代替矿工,他们本质上</div>
                    </li>
                    <li><a href="/article/1939264865784885248.htm"
                           title="什么是MPC(多方安全计算,Multi-Party Computation)" target="_blank">什么是MPC(多方安全计算,Multi-Party Computation)</a>
                        <span class="text-muted">MonkeyKing.sun</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>MPC(多方安全计算,Multi-PartyComputation)是一种密码学技术,允许多个参与方在不泄露各自私密输入数据的前提下,共同完成一个计算,并得到正确的计算结果。一、什么是MPC?定义:**多方安全计算(MPC)是一种加密协议,允许多个参与者在输入保持私密的情况下,**安全地进行联合计算,并仅暴露计算结果,而不暴露任何中间信息或原始数据。二、通俗理解:一群人合算工资平均值,但不想互相知</div>
                    </li>
                    <li><a href="/article/1939258942773325824.htm"
                           title="区块链知识总结——POS权益证明" target="_blank">区块链知识总结——POS权益证明</a>
                        <span class="text-muted">The_Killer.</span>
<a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a>
                        <div>背景:pow由于其对资源的消耗而饱受争议。由此引入pos权益证明:posVSpow优缺点:1.节能2.pos是闭环生态,pow是开源生态。pos天然防范了51%攻击解释:pow之下,attacker可以在现实世界中购买矿机,来增加算力以达到51%attack目的,而pos下attacker必须购买更多的加密货币(相当于成为股东),才有发动attack的能力,但此时对币的开发者和早起的矿工其实是受益</div>
                    </li>
                    <li><a href="/article/1939254024456957952.htm"
                           title="TDengine 运维全攻略:五种备份与恢复方法深度解析(2025 最新版)" target="_blank">TDengine 运维全攻略:五种备份与恢复方法深度解析(2025 最新版)</a>
                        <span class="text-muted">TDengine (老段)</span>
<a class="tag" taget="_blank" href="/search/TDengine/1.htm">TDengine</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/tdengine/1.htm">tdengine</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%B6%9B%E6%80%9D%E6%95%B0%E6%8D%AE/1.htm">涛思数据</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">时序数据库</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>备份与还原是数据库运维的核心环节,TDengine提供了五种主流数据备份方法,覆盖不同场景需求。本文将详细解析各方法的特性与操作要点。1.taosdump介绍taosdump是TDengine社区版首选的数据备份工具(企业版同样支持),其核心特点是操作简便、支持多线程处理,且备份文件采用ApacheAvro格式(大数据领域通用数据交换格式),便于向其他系统共享数据。工具支持跨平台连接远程服务器执行</div>
                    </li>
                    <li><a href="/article/1939248725318758400.htm"
                           title="Promptify与ReActAgent" target="_blank">Promptify与ReActAgent</a>
                        <span class="text-muted">frostmelody</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>一、Promptify定位:NLP任务的「自动化流水线」1.解决什么问题?传统LLM应用开发痛点:反复调试:需手工编写/调整prompt格式(如调整分隔符、示例数量)兼容性差:不同模型需重写适配代码输出不稳定:非结构化文本需额外解析Promptify用标准化流水线解决上述问题,将复杂prompt工程简化为三行代码:model=OpenAI(api_key)#选择模型prompter=Prompte</div>
                    </li>
                    <li><a href="/article/1939243429133348864.htm"
                           title="Python | 期末复习具体知识点(hbut 邵光普)" target="_blank">Python | 期末复习具体知识点(hbut 邵光普)</a>
                        <span class="text-muted">我推是大富翁</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>Python复习具体知识点1、表达式not3or6的值:在Python中,not3or6这个表达式的含义可以分解为以下步骤来理解:not3:not是一个逻辑运算符,用于对一个布尔值进行取反。但在这里,它作用于一个整数值3。在Python中,任何非零数值都被视为True,因此not3会被转换为False。Falseor6:接下来,or运算符会检查其左侧的值。如果左侧为False(或任何被视为Fals</div>
                    </li>
                    <li><a href="/article/1939240027649273856.htm"
                           title="深入解析微信协议逆向:基于Go语言的手机号绑定功能实现" target="_blank">深入解析微信协议逆向:基于Go语言的手机号绑定功能实现</a>
                        <span class="text-muted">梦玄海</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1/1.htm">微信</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>引言在即时通讯系统开发领域,微信协议的逆向工程一直是一个充满挑战的技术方向。本文将基于一段真实的Go语言实现代码,深入剖析微信客户端绑定手机号功能的核心实现机制,解密其通信协议、数据序列化及安全传输等关键技术细节。一、功能概述与模块架构该代码片段实现了微信客户端的手机号绑定功能(BindOpMobile),主要包含以下技术模块:用户凭证管理:通过comm.GetLoginata获取会话密钥、设备信</div>
                    </li>
                    <li><a href="/article/1939235357564399616.htm"
                           title="我的世界1.20.1forge模组开发进阶教程——序列化(1)" target="_blank">我的世界1.20.1forge模组开发进阶教程——序列化(1)</a>
                        <span class="text-muted">lemon_sjdk</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C/1.htm">我的世界</a><a class="tag" taget="_blank" href="/search/mc/1.htm">mc</a><a class="tag" taget="_blank" href="/search/forge%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91/1.htm">forge模组开发</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">序列化</a>
                        <div>mc的序列化在《Minecraft》(MC)中,序列化指将游戏数据(如方块、实体、玩家状态等)转换为可存储或传输的格式。这是游戏运行、存档保存和网络通信的关键技术。以下是Minecraft中常见的序列化方式及其用途:一、序列化在Minecraft中的作用存档数据持久化将玩家建筑、地图、物品栏等数据保存到硬盘(如.minecraft/saves中的区域文件)。网络传输服务器与客户端同步方块更新、实体</div>
                    </li>
                    <li><a href="/article/1939228799031898112.htm"
                           title="Python爬虫实战:研究untangle库相关技术" target="_blank">Python爬虫实战:研究untangle库相关技术</a>
                        <span class="text-muted">ylfhpy</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/1.htm">爬虫项目实战</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/untangle/1.htm">untangle</a>
                        <div>1.引言在大数据时代,网络数据已成为重要的信息资源。XML和HTML作为互联网上最常用的数据表示格式,广泛应用于API接口、网站结构和数据交换等场景。Python凭借其丰富的爬虫库(如Requests、Scrapy)和灵活的数据处理能力,成为网络数据采集的首选语言。然而,从复杂的XML/HTML文档中提取结构化数据仍然面临诸多挑战,如文档结构多样性、动态内容渲染和数据格式转换等问题。Untangl</div>
                    </li>
                    <li><a href="/article/1939220727068684288.htm"
                           title="从入门到精通:前端工程师必学的 JSON 全解析" target="_blank">从入门到精通:前端工程师必学的 JSON 全解析</a>
                        <span class="text-muted">前端视界</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>从入门到精通:前端工程师必学的JSON全解析关键词:JSON、前端工程师、数据交换、JavaScript、数据格式摘要:本文围绕前端工程师必学的JSON展开全面解析。从JSON的基本概念、背景知识入手,深入探讨其核心原理、算法实现、数学模型等方面。通过详细的代码示例和实际应用场景分析,帮助前端工程师从入门到精通掌握JSON的使用。同时,提供了丰富的学习资源、开发工具和相关论文推荐,最后对JSON的</div>
                    </li>
                    <li><a href="/article/1939211527764635648.htm"
                           title="【网络安全】对称密码体制" target="_blank">【网络安全】对称密码体制</a>
                        <span class="text-muted">Hacker_xingchen</span>
<a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>1.对称密码体制概述1.1定义与特点对称密码体制,也称为单钥密码体制,是一种加密方法,其中加密和解密过程使用相同的密钥。这种加密方式的主要特点包括简单、高效和计算速度快,适合于大量数据的快速加密和解密。对称密码体制的安全性完全依赖于密钥的保密性,一旦密钥被泄露,加密的安全性就会受到威胁。效率:对称密码算法通常比非对称密码算法要快,因为它们的算法结构相对简单,计算量较小。密钥管理:对称密码体制的密钥</div>
                    </li>
                    <li><a href="/article/1939210394077818880.htm"
                           title="【网络安全】网络安全中的离散数学" target="_blank">【网络安全】网络安全中的离散数学</a>
                        <span class="text-muted">flyair_China</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/1.htm">安全架构</a>
                        <div>一、离散数学核心知识点与网络安全映射1.数论(NumberTheory)知识点安全应用场景实例说明质因数分解RSA公钥加密大整数分解难题(2048位密钥需数万年破解)模运算Diffie-Hellman密钥交换利用(gamodp)实现安全协商欧拉定理RSA加密/解密me*d≡m(modn)保障解密还原中国剩余定理高效解密优化RSA-CRT加速解密运算达70%2.代数结构(AlgebraicStruc</div>
                    </li>
                    <li><a href="/article/1939207615603077120.htm"
                           title="同态加密库(HElib)" target="_blank">同态加密库(HElib)</a>
                        <span class="text-muted">deepdata_cn</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8C%E6%80%81%E5%8A%A0%E5%AF%86/1.htm">同态加密</a><a class="tag" taget="_blank" href="/search/%E5%90%8C%E6%80%81%E5%8A%A0%E5%AF%86/1.htm">同态加密</a>
                        <div>HElib是一个开源的同态加密软件库,由耶鲁大学专家开发,最初由ShaiHalevi和VictorShoup开发,CraigGentry在IBM任职期间也参与相关研究,于2013年5月5日首次发布。主要支持带自举(Bootstrapping)的Brakerski-Gentry-Vaikuntanathan(BGV)方案和近似数Cheon-Kim-Kim-Song(CKKS)方案。一、项目概述开发背</div>
                    </li>
                    <li><a href="/article/1939205222354186240.htm"
                           title="MapReduce概述" target="_blank">MapReduce概述</a>
                        <span class="text-muted">Tate小白</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AD%A6%E4%B9%A0/1.htm">大数据学习</a><a class="tag" taget="_blank" href="/search/mapreduce/1.htm">mapreduce</a>
                        <div>1、MapReduce概述1.1MapReduce定义MapReduce是一个分布式运算程序的编程框架,是用户开发“Hadoop的数据分析应用”的核心框架。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reduc</div>
                    </li>
                    <li><a href="/article/1939202824185376768.htm"
                           title="口罩检测数据集-1591张图片疫情防控管理 智能门禁系统 公共场所安全监控" target="_blank">口罩检测数据集-1591张图片疫情防控管理 智能门禁系统 公共场所安全监控</a>
                        <span class="text-muted">cver123</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86/1.htm">数据集</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E8%B7%9F%E8%B8%AA/1.htm">目标跟踪</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a>
                        <div>口罩检测数据集-1591张图片已发布目标检测数据集合集(持续更新)口罩检测数据集介绍数据集概览包含类别应用场景数据样本展示文件结构与使用建议使用建议技术标签YOLOv8训练实战1.环境配置安装YOLOv8官方库ultralytics2.数据准备2.1数据标注格式(YOLO)2.2文件结构示例2.3创建data.yaml配置文件3.模型训练关键参数补充说明:4.模型验证与测试4.1验证模型性能关键参</div>
                    </li>
                    <li><a href="/article/1939202572086734848.htm"
                           title="springboot3集成minio" target="_blank">springboot3集成minio</a>
                        <span class="text-muted"></span>

                        <div>1.说明注意:本代码是在若依springboot3版本上实现的,如果你不是在若依上面实现,需要将所有用到若依的相关代码修改后才能运行文件管理文件上传:支持单文件上传,可指定存储桶和路径,支持自动按日期目录存储文件下载:支持文件直接下载,自动处理文件名编码文件预览:支持图片、文档等文件的在线预览功能文件删除:支持单文件删除和批量删除文件重命名:支持文件重命名操作图片处理:支持图片压缩和格式转换(We</div>
                    </li>
                    <li><a href="/article/1939200049636503552.htm"
                           title="C++ 第三阶段 新标准库组件 - 第二节:std::filesystem(文件系统操作)" target="_blank">C++ 第三阶段 新标准库组件 - 第二节:std::filesystem(文件系统操作)</a>
                        <span class="text-muted">程序员弘羽</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%85%A5%E5%9C%9F%E8%BF%9E%E8%BD%BD/1.htm">C++从入门到入土连载</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>目录一、std::filesystem概述1.核心作用2.核心组件二、std::filesystem的基本用法1.路径操作(std::filesystem::path)(1)路径构造与拼接(2)路径分解(3)路径修改2.目录与文件操作(1)创建目录(2)删除目录(3)检查文件存在(4)查询文件属性3.目录遍历(1)非递归遍历(2)递归遍历(3)过滤条件4.文件与目录操作(1)复制文件或目录(2)移</div>
                    </li>
                    <li><a href="/article/1939180770304258048.htm"
                           title="phpexcel 读取数据" target="_blank">phpexcel 读取数据</a>
                        <span class="text-muted"></span>

                        <div>http://extjs.org.cn/fatjames/archives/379require_once'/home/PHPExcel_1.8.0/PHPExcel/IOFactory.php';$reader=PHPExcel_IOFactory::createReader('Excel2007');//设置以Excel5格式(Excel97-2003工作簿)$PHPExcel=$reader</div>
                    </li>
                    <li><a href="/article/1939180013408546816.htm"
                           title="Java 数组的创建、取值、赋值" target="_blank">Java 数组的创建、取值、赋值</a>
                        <span class="text-muted">Y1_again_0_again</span>
<a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>一、一维数组1.1什么是一维数组一维数组是指仅包含一个维度的数据集合,类似于Excel表格中的单行数据,例如{1,2,3}。1.2在元素已知的情况下创建一维数组语法格式:数据类型[]数组名={值1,值2,值3,...};元素访问:通过数组下标获取元素,格式为数组名[数组下标]。需要注意的是,数组下标从0开始计数,即a[0]表示数组a的第一个元素,依此类推。示例1:创建一个整型一维数组,并输出其第1</div>
                    </li>
                    <li><a href="/article/1939178121727111168.htm"
                           title="Apache POI导入导出excel文件实战" target="_blank">Apache POI导入导出excel文件实战</a>
                        <span class="text-muted">小白de成长之路</span>
<a class="tag" taget="_blank" href="/search/Java%E7%9B%B8%E5%85%B3/1.htm">Java相关</a><a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>文章目录前言技术栈1、引入依赖2、导入代码实现3、导出代码实现3.1、准备导出文件模板3.2、导出代码实现4、代码实现解释5、常见问题前言这两天公司项目业务提出需求,要求在前端上传excel文件然后解析展示,因此写篇文章记录一下实现。技术栈springboot2.6.61、引入依赖maven格式:org.apache.poipoi3.14org.apache.poipoi-ooxml3.142、导</div>
                    </li>
                    <li><a href="/article/1939158581513351168.htm"
                           title="Netty案例:群聊天室" target="_blank">Netty案例:群聊天室</a>
                        <span class="text-muted">熙客</span>
<a class="tag" taget="_blank" href="/search/12_%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/1.htm">12_计算机网络</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>目录1、系统设计2、代码实现2.1服务端代码2.2客户端代码2.3启动说明3、关键技术解析3.1编解码器使用3.2通道管理3.3消息协议设计3.4用户管理1、系统设计核心功能:用户加入/离开聊天室通知群发聊天消息在线用户列表管理用户昵称设置通信协议设计:使用简单的文本协议,消息格式:[类型]:[内容]消息类型:JOIN(改昵称),MSG(消息),LIST(用户列表),SYS(系统消息)关键技术组件</div>
                    </li>
                    <li><a href="/article/1939155934169329664.htm"
                           title="git本地裸仓库的“激活”:在同一台 Linux 服务器上创建工作区" target="_blank">git本地裸仓库的“激活”:在同一台 Linux 服务器上创建工作区</a>
                        <span class="text-muted">运维开发王义杰</span>
<a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E8%BF%90%E7%BB%B4/1.htm">系统运维</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7/1.htm">软件工具</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>大家好!在之前的文章中,我们探讨了Git裸仓库(BareRepository)的概念,它是没有工作目录,只包含.git目录内容的特殊仓库格式,非常适合作为中心化的代码集散地或备份。我们也了解了gitclone--mirror命令会生成这样的裸仓库。现在,假设我们已经在Linux服务器上的/data/gitlab/cex-cicd/pipeline.git路径下拥有一个这样的裸仓库(之前备份或创建的</div>
                    </li>
                    <li><a href="/article/1939147364379979776.htm"
                           title="html5-video标签做视频加密的方法" target="_blank">html5-video标签做视频加密的方法</a>
                        <span class="text-muted">视频砖家</span>
<a class="tag" taget="_blank" href="/search/HTML5/1.htm">HTML5</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%8A%A0%E5%AF%86/1.htm">视频加密</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%AE%89%E5%85%A8/1.htm">视频安全</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%8A%A0%E5%AF%86/1.htm">视频加密</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86/1.htm">文件加密</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%AE%89%E5%85%A8/1.htm">视频安全</a>
                        <div>html5-video标签做视频加密的方法/**在这里可以进行权限验证等操作*///创建文件对象Filef=newFile("E:\\test.mp4");//获取文件名称StringfileName=f.getName();//导出文件Stringagent=getRequest().getHeader("User-Agent").toUpperCase();InputStreamfis=nul</div>
                    </li>
                                <li><a href="/article/64.htm"
                                       title="关于旗正规则引擎中的MD5加密问题" target="_blank">关于旗正规则引擎中的MD5加密问题</a>
                                    <span class="text-muted">何必如此</span>
<a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/MD5/1.htm">MD5</a><a class="tag" taget="_blank" href="/search/%E8%A7%84%E5%88%99/1.htm">规则</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%AF%86/1.htm">加密</a>
                                    <div>一般情况下,为了防止个人隐私的泄露,我们都会对用户登录密码进行加密,使数据库相应字段保存的是加密后的字符串,而非原始密码。 
在旗正规则引擎中,通过外部调用,可以实现MD5的加密,具体步骤如下: 
1.在对象库中选择外部调用,选择“com.flagleader.util.MD5”,在子选项中选择“com.flagleader.util.MD5.getMD5ofStr({arg1})”; 
2.在规</div>
                                </li>
                                <li><a href="/article/191.htm"
                                       title="【Spark101】Scala Promise/Future在Spark中的应用" target="_blank">【Spark101】Scala Promise/Future在Spark中的应用</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Promise/1.htm">Promise</a>
                                    <div>Promise和Future是Scala用于异步调用并实现结果汇集的并发原语,Scala的Future同JUC里面的Future接口含义相同,Promise理解起来就有些绕。等有时间了再仔细的研究下Promise和Future的语义以及应用场景,具体参见Scala在线文档:http://docs.scala-lang.org/sips/completed/futures-promises.html</div>
                                </li>
                                <li><a href="/article/318.htm"
                                       title="spark sql 访问hive数据的配置详解" target="_blank">spark sql 访问hive数据的配置详解</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/spark+sql/1.htm">spark sql</a><a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/thriftserver/1.htm">thriftserver</a>
                                    <div>spark sql 能够通过thriftserver 访问hive数据,默认spark编译的版本是不支持访问hive,因为hive依赖比较多,因此打的包中不包含hive和thriftserver,因此需要自己下载源码进行编译,将hive,thriftserver打包进去才能够访问,详细配置步骤如下: 
  
1、下载源码 
  
2、下载Maven,并配置 
此配置简单,就略过</div>
                                </li>
                                <li><a href="/article/445.htm"
                                       title="HTTP 协议通信" target="_blank">HTTP 协议通信</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/httpclient/1.htm">httpclient</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E4%BF%A1/1.htm">通信</a>
                                    <div>  
                      
一:简介 
 HTTPCLIENT,通过JAVA基于HTTP协议进行点与点间的通信! 
  
  
二: 代码举例 
  
   测试类: 
 
import java</div>
                                </li>
                                <li><a href="/article/572.htm"
                                       title="java unix时间戳转换" target="_blank">java unix时间戳转换</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>把java时间戳转换成unix时间戳: 
Timestamp appointTime=Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:m</div>
                                </li>
                                <li><a href="/article/699.htm"
                                       title="web报表工具FineReport常用函数的用法总结(报表函数)" target="_blank">web报表工具FineReport常用函数的用法总结(报表函数)</a>
                                    <span class="text-muted">老A不折腾</span>
<a class="tag" taget="_blank" href="/search/web%E6%8A%A5%E8%A1%A8/1.htm">web报表</a><a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a>
                                    <div>说明:本次总结中,凡是以tableName或viewName作为参数因子的。函数在调用的时候均按照先从私有数据源中查找,然后再从公有数据源中查找的顺序。 
  
CLASS 
CLASS(object):返回object对象的所属的类。 
  
CNMONEY 
CNMONEY(number,unit)返回人民币大写。 
number:需要转换的数值型的数。 
unit:单位,</div>
                                </li>
                                <li><a href="/article/826.htm"
                                       title="java jni调用c++ 代码 报错" target="_blank">java jni调用c++ 代码 报错</a>
                                    <span class="text-muted">墙头上一根草</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a>
                                    <div># 
# A fatal error has been detected by the Java Runtime Environment: 
# 
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000777c3290, pid=5632, tid=6656 
# 
# JRE version: Java(TM) SE Ru</div>
                                </li>
                                <li><a href="/article/953.htm"
                                       title="Spring中事件处理de小技巧" target="_blank">Spring中事件处理de小技巧</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Spring+%E6%95%99%E7%A8%8B/1.htm">Spring 教程</a><a class="tag" taget="_blank" href="/search/Spring+%E5%AE%9E%E4%BE%8B/1.htm">Spring 实例</a><a class="tag" taget="_blank" href="/search/Spring+%E5%85%A5%E9%97%A8/1.htm">Spring 入门</a><a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a>
                                    <div>Spring   中提供一些Aware相关de接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到de匙ApplicationContextAware.实现ApplicationContextAwaredeBean,在Bean被初始后,将会被注入 Applicati</div>
                                </li>
                                <li><a href="/article/1080.htm"
                                       title="linux shell ls脚本样例" target="_blank">linux shell ls脚本样例</a>
                                    <span class="text-muted">annan211</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux+ls%E6%BA%90%E7%A0%81/1.htm">linux ls源码</a><a class="tag" taget="_blank" href="/search/linux+%E6%BA%90%E7%A0%81/1.htm">linux 源码</a>
                                    <div>
#! /bin/sh -
#查找输入文件的路径
#在查找路径下寻找一个或多个原始文件或文件模式
# 查找路径由特定的环境变量所定义

#标准输出所产生的结果 通常是查找路径下找到的每个文件的第一个实体的完整路径
# 或是filename :not found 的标准错误输出。

#如果文件没有找到 则退出码为0
#否则 即为找不到的文件个数
#语法 pathfind [--</div>
                                </li>
                                <li><a href="/article/1207.htm"
                                       title="List,Set,Map遍历方式 (收集的资源,值得看一下)" target="_blank">List,Set,Map遍历方式 (收集的资源,值得看一下)</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/set/1.htm">set</a><a class="tag" taget="_blank" href="/search/Map%E9%81%8D%E5%8E%86%E6%96%B9%E5%BC%8F/1.htm">Map遍历方式</a>
                                    <div>List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身</div>
                                </li>
                                <li><a href="/article/1334.htm"
                                       title="解决SimpleDateFormat的线程不安全问题的方法" target="_blank">解决SimpleDateFormat的线程不安全问题的方法</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/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8/1.htm">线程安全</a>
                                    <div>在Java项目中,我们通常会自己写一个DateUtil类,处理日期和字符串的转换,如下所示: 
public class DateUtil01 {

	private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public void format(Date d</div>
                                </li>
                                <li><a href="/article/1461.htm"
                                       title="http请求测试实例(采用fastjson解析)" target="_blank">http请求测试实例(采用fastjson解析)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a>
                                    <div>        在实际开发中,我们经常会去做http请求的开发,下面则是如何请求的单元测试小实例,仅供参考。 
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import </div>
                                </li>
                                <li><a href="/article/1588.htm"
                                       title="【RPC框架Hessian三】Hessian 异常处理" target="_blank">【RPC框架Hessian三】Hessian 异常处理</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hessian/1.htm">hessian</a>
                                    <div>RPC异常处理概述   
RPC异常处理指是,当客户端调用远端的服务,如果服务执行过程中发生异常,这个异常能否序列到客户端? 
  
如果服务在执行过程中可能发生异常,那么在服务接口的声明中,就该声明该接口可能抛出的异常。 
  
在Hessian中,服务器端发生异常,可以将异常信息从服务器端序列化到客户端,因为Exception本身是实现了Serializable的</div>
                                </li>
                                <li><a href="/article/1715.htm"
                                       title="【日志分析】日志分析工具" target="_blank">【日志分析】日志分析工具</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90/1.htm">日志分析</a>
                                    <div>1. 网站日志实时分析工具 GoAccess 
http://www.vpsee.com/2014/02/a-real-time-web-log-analyzer-goaccess/ 
2. 通过日志监控并收集 Java 应用程序性能数据(Perf4J) 
http://www.ibm.com/developerworks/cn/java/j-lo-logforperf/ 
3.log.io 
和</div>
                                </li>
                                <li><a href="/article/1842.htm"
                                       title="nginx优化加强战斗力及遇到的坑解决" target="_blank">nginx优化加强战斗力及遇到的坑解决</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/nginx+%E4%BC%98%E5%8C%96/1.htm">nginx 优化</a>
                                    <div>   先说遇到个坑,第一个是负载问题,这个问题与架构有关,由于我设计架构多了两层,结果导致会话负载只转向一个。解决这样的问题思路有两个:一是改变负载策略,二是更改架构设计。 
   由于采用动静分离部署,而nginx又设计了静态,结果客户端去读nginx静态,访问量上来,页面加载很慢。解决:二者留其一。最好是保留apache服务器。 
  
   来以下优化: 
  
    </div>
                                </li>
                                <li><a href="/article/1969.htm"
                                       title="java-50-输入两棵二叉树A和B,判断树B是不是A的子结构" target="_blank">java-50-输入两棵二叉树A和B,判断树B是不是A的子结构</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>思路来自: 
http://zhedahht.blog.163.com/blog/static/25411174201011445550396/ 
 

import ljn.help.*;
public class HasSubtree {

	/**Q50.
	 * 输入两棵二叉树A和B,判断树B是不是A的子结构。

例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一</div>
                                </li>
                                <li><a href="/article/2096.htm"
                                       title="mongoDB 备份与恢复" target="_blank">mongoDB 备份与恢复</a>
                                    <span class="text-muted">开窍的石头</span>
<a class="tag" taget="_blank" href="/search/mongDB%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D/1.htm">mongDB备份与恢复</a>
                                    <div>Mongodb导出与导入 
 
1: 导入/导出可以操作的是本地的mongodb服务器,也可以是远程的. 
所以,都有如下通用选项: 
-h host   主机 
--port port    端口 
-u username 用户名 
-p passwd   密码 
 
 
2: mongoexport 导出json格式的文件 </div>
                                </li>
                                <li><a href="/article/2223.htm"
                                       title="[网络与通讯]椭圆轨道计算的一些问题" target="_blank">[网络与通讯]椭圆轨道计算的一些问题</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                                    <div> 
     如果按照中国古代农历的历法,现在应该是某个季节的开始,但是由于农历历法是3000年前的天文观测数据,如果按照现在的天文学记录来进行修正的话,这个季节已经过去一段时间了。。。。。 
 
      也就是说,还要再等3000年。才有机会了,太阳系的行星的椭圆轨道受到外来天体的干扰,轨道次序发生了变</div>
                                </li>
                                <li><a href="/article/2350.htm"
                                       title="软件专利如何申请" target="_blank">软件专利如何申请</a>
                                    <span class="text-muted">cuiyadll</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E4%B8%93%E5%88%A9/1.htm">软件专利</a><a class="tag" taget="_blank" href="/search/%E7%94%B3%E8%AF%B7/1.htm">申请</a>
                                    <div>软件技术可以申请软件著作权以保护软件源代码,也可以申请发明专利以保护软件流程中的步骤执行方式。专利保护的是软件解决问题的思想,而软件著作权保护的是软件代码(即软件思想的表达形式)。例如,离线传送文件,那发明专利保护是如何实现离线传送文件。基于相同的软件思想,但实现离线传送的程序代码有千千万万种,每种代码都可以享有各自的软件著作权。申请一个软件发明专利的代理费大概需要5000-8000申请发明专利可</div>
                                </li>
                                <li><a href="/article/2477.htm"
                                       title="Android学习笔记" target="_blank">Android学习笔记</a>
                                    <span class="text-muted">darrenzhu</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>1.启动一个AVD 
2.命令行运行adb shell可连接到AVD,这也就是命令行客户端 
3.如何启动一个程序 
  am start -n package name/.activityName 
  am start -n com.example.helloworld/.MainActivity 
 
启动Android设置工具的命令如下所示: 
# am start -</div>
                                </li>
                                <li><a href="/article/2604.htm"
                                       title="apache虚拟机配置,本地多域名访问本地网站" target="_blank">apache虚拟机配置,本地多域名访问本地网站</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a>
                                    <div>现在假定你有两个目录,一个存在于 /htdocs/a,另一个存在于 /htdocs/b 。 
现在你想要在本地测试的时候访问 www.freeman.com 对应的目录是 /xampp/htdocs/freeman ,访问 www.duchengjiu.com 对应的目录是 /htdocs/duchengjiu。 
1、首先修改C盘WINDOWS\system32\drivers\etc目录下的 </div>
                                </li>
                                <li><a href="/article/2731.htm"
                                       title="yii2 restful web服务[速率限制]" target="_blank">yii2 restful web服务[速率限制]</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/yii2/1.htm">yii2</a>
                                    <div>速率限制 
为防止滥用,你应该考虑增加速率限制到您的API。 例如,您可以限制每个用户的API的使用是在10分钟内最多100次的API调用。 如果一个用户同一个时间段内太多的请求被接收, 将返回响应状态代码 429 (这意味着过多的请求)。 
要启用速率限制, [[yii\web\User::identityClass|user identity class]] 应该实现 [[yii\filter</div>
                                </li>
                                <li><a href="/article/2858.htm"
                                       title="Hadoop2.5.2安装——单机模式" target="_blank">Hadoop2.5.2安装——单机模式</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/hadoop%E5%8D%95%E6%9C%BA%E9%83%A8%E7%BD%B2/1.htm">hadoop单机部署</a>
                                    <div>转载请出自出处:http://eksliang.iteye.com/blog/2185414 一、概述 
       Hadoop有三种模式 单机模式、伪分布模式和完全分布模式,这里先简单介绍单机模式 ,默认情况下,Hadoop被配置成一个非分布式模式,独立运行JAVA进程,适合开始做调试工作。 
  二、下载地址 
Hadoop 网址http:</div>
                                </li>
                                <li><a href="/article/2985.htm"
                                       title="LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构" target="_blank">LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构</a>
                                    <span class="text-muted">gundumw100</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>一切为了快速迭代 
 
 
 
 

import java.util.ArrayList;

import org.json.JSONObject;

import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayo</div>
                                </li>
                                <li><a href="/article/3112.htm"
                                       title="三道简单的前端HTML/CSS题目" target="_blank">三道简单的前端HTML/CSS题目</a>
                                    <span class="text-muted">ini</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E7%9B%AE/1.htm">题目</a>
                                    <div>使用CSS为多个网页进行相同风格的布局和外观设置时,为了方便对这些网页进行修改,最好使用( )。http://hovertree.com/shortanswer/bjae/7bd72acca3206862.htm 
  
在HTML中加入<table style=”color:red; font-size:10pt”>,此为( )。http://hovertree.com/s</div>
                                </li>
                                <li><a href="/article/3239.htm"
                                       title="overrided方法编译错误" target="_blank">overrided方法编译错误</a>
                                    <span class="text-muted">kane_xie</span>
<a class="tag" taget="_blank" href="/search/override/1.htm">override</a>
                                    <div> 
 问题描述: 
 
在实现类中的某一或某几个Override方法发生编译错误如下: 
Name clash: The method put(String) of type XXXServiceImpl has the same erasure as put(String) of type XXXService but does not override it 
  
当去掉@Over</div>
                                </li>
                                <li><a href="/article/3366.htm"
                                       title="Java中使用代理IP获取网址内容(防IP被封,做数据爬虫)" target="_blank">Java中使用代理IP获取网址内容(防IP被封,做数据爬虫)</a>
                                    <span class="text-muted">mcj8089</span>
<a class="tag" taget="_blank" href="/search/%E5%85%8D%E8%B4%B9%E4%BB%A3%E7%90%86IP/1.htm">免费代理IP</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%90%86IP/1.htm">代理IP</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%88%AC%E8%99%AB/1.htm">数据爬虫</a><a class="tag" taget="_blank" href="/search/JAVA%E8%AE%BE%E7%BD%AE%E4%BB%A3%E7%90%86IP/1.htm">JAVA设置代理IP</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E5%B0%81IP/1.htm">爬虫封IP</a>
                                    <div>推荐两个代理IP网站: 
  
1. 全网代理IP:http://proxy.goubanjia.com/ 
  
2. 敲代码免费IP:http://ip.qiaodm.com/ 
  
Java语言有两种方式使用代理IP访问网址并获取内容, 
  
方式一,设置System系统属性 
  
// 设置代理IP
System.getProper</div>
                                </li>
                                <li><a href="/article/3493.htm"
                                       title="Nodejs Express 报错之 listen EADDRINUSE" target="_blank">Nodejs Express 报错之 listen EADDRINUSE</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a>
                                    <div>当你启动 nodejs服务报错: 
>node app
Express server listening on port 80
events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: listen EADDRINUSE
    at exports._errnoException (</div>
                                </li>
                                <li><a href="/article/3620.htm"
                                       title="C++中三种new的用法" target="_blank">C++中三种new的用法</a>
                                    <span class="text-muted">_荆棘鸟_</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/new/1.htm">new</a>
                                    <div>转载自:http://news.ccidnet.com/art/32855/20100713/2114025_1.html 
作者: mt 
其一是new operator,也叫new表达式;其二是operator new,也叫new操作符。这两个英文名称起的也太绝了,很容易搞混,那就记中文名称吧。new表达式比较常见,也最常用,例如: 
string* ps = new string("</div>
                                </li>
                                <li><a href="/article/3747.htm"
                                       title="Ruby深入研究笔记1" target="_blank">Ruby深入研究笔记1</a>
                                    <span class="text-muted">wudixiaotie</span>
<a class="tag" taget="_blank" href="/search/Ruby/1.htm">Ruby</a>
                                    <div>module是可以定义private方法的 
module MTest
  def aaa
    puts "aaa"
    private_method
  end

  private
    def private_method
      puts "this is private_method"
    end
end

</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>