m3u8 文件格式详解

简介

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 开头,大小写敏感。

  1. 属性列表(Attribute Lists):某些特定的标签的值为属性列表。标签后面的属性列表以 逗号 作为分隔符,分离出多组不带空格的 属性/值 对。
    属性/值 对的语法格式如下:
AttributeName=AttributeValue

其中:

  • 属性AttributeName是由 [A..Z],[0..9] 和 - 组成的不带引号的字符串。因此,属性AttributeName只能使用大写字母,不能使用小写字母,并且AttributeName=中间不能有空格,同理,=AttributeValue之间也不能有空格。

  • AttributeValue的只能取以下类型:

    • 十进制整型(decimal-interger):由 [0..9] 之间组成的十进制不带引号的字符串,范围为 ~ (18446744073709551615),字符长度为 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进行隔离的两个十进制整型数。第一个整型表示水平宽度大小,第二个整型数表示垂直方向高度大小(单位:像素)。
  1. 标签:标签用于指定 m3u8 文件的全局参数或在其后面的切片文件/媒体播放列表的一些信息。

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

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

    • EXTM3U:表明该文件是一个 m3u8 文件。每个 M3U 文件必须将该标签放置在第一行。
    • EXT-X-VERSION:表示 HLS 的协议版本号,该标签与流媒体的兼容性相关。该标签为全局作用域,使能整个 m3u8 文件;每个 m3u8 文件内最多只能出现一个该标签定义。如果 m3u8 文件不包含该标签,则默认为协议的第一个版本。
  • 媒体片段类型标签(Media Segment Tags):每个切片 URI 前面都有一系列媒体片段标签对其进行描述。有些片段标签只对其后切片资源有效;有些片段标签对其后所有切片都有效,直到后续遇到另一个该标签描述。媒体片段类型标签不能出现在主播放列表(Master Playlist)中。具体标签如下:

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

      #EXTINF:,[]
      </code></pre> <p>其中:</p> 
           <ul> 
            <li> <code>duration</code>:可以为十进制的整型或者浮点型,其值必须小于或等于 <strong>EXT-X-TARGETDURATION</strong> 指定的值。<br> 注:建议始终使用浮点型指定时长,这可以让客户端在定位流时,减少四舍五入错误。但是如果兼容版本号 <strong>EXT-X-VERSION</strong> 小于 3,那么必须使用整型。</li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-BYTERANGE</strong>:该标签表示接下来的切片资源是其后 URI 指定的媒体片段资源的局部范围(即截取 URI 媒体资源部分内容作为下一个切片)。该标签只对其后一个 URI 起作用。其格式为:</p> <pre><code class="m3u8">#EXT-X-BYTERANGE:<n>[@<o>]
      </code></pre> <p>其中:</p> 
           <ul> 
            <li> <code>n</code>是一个十进制整型,表示截取片段大小(单位:字节)。</li> 
            <li>可选参数<code>o</code>也是一个十进制整型,指示截取起始位置(以字节表示,在 URI 指定的资源开头移动该字节位置后进行截取)。<br> 如果<code>o</code>未指定,则截取起始位置从上一个该标签截取完成的下一个字节(即上一个<code>n+o+1</code>)开始截取。<br> 如果没有指定该标签,则表明的切分范围为整个 URI 资源片段。<br> 注:使用 <strong>EXT-X-BYTERANGE</strong> 标签要求兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 4。</li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-DISCONTINUITY</strong>:该标签表明其前一个切片与下一个切片之间存在中断。其格式为:</p> <pre><code class="m3u8">#EXT-X-DISCONTINUITY
      </code></pre> <p>当以下任一情况变化时,必须使用该标签:</p> 
           <ul> 
            <li>文件格式(file format)</li> 
            <li>数字(number),类型(type),媒体标识符(identifiers of tracks)</li> 
            <li>时间戳序列(timestamp sequence)</li> 
           </ul> <p>当以下任一情况变化时,应当使用该标签:</p> 
           <ul> 
            <li>编码参数(encoding parameters)</li> 
            <li>编码序列(encoding sequence)</li> 
           </ul> <p>注:<strong>EXT-X-DISCONTINUITY</strong> 的一个经典使用场景就是在视屏流中插入广告,由于视屏流与广告视屏流不是同一份资源,因此在这两种流切换时使用 <strong>EXT-X-DISCONTINUITY</strong> 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。<br> 更多详细内容,请查看:Incorporating Ads into a Playlist</p> </li> 
          <li> <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> 标签如果最终生成的是同样的秘钥,则他们都可作用于同一个媒体片段。<br> 该标签使用格式为:</p> <pre><code class="m3u8">#EXT-X-KEY:<attribute-list>
      </code></pre> <p>属性列表可以包含如下几个键:</p> 
           <ul> 
            <li><p><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> 属性可以出现也可以不出现。</p></li> 
            <li><p><strong>URI</strong>:指定密钥路径。<br> 该密钥是一个 16 字节的数据。<br> 该键是必须参数,除非 <strong>METHOD</strong> 为<code>NONE</code>。</p></li> 
            <li><p><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 位)。</p></li> 
            <li><p><strong>KEYFORMAT</strong>:由双引号包裹的字符串,标识密钥在密钥文件中的存储方式(密钥文件中的 AES-128 密钥是以二进制方式存储的16个字节的密钥)。<br> 该属性为可选参数,其默认值为<code>"identity"</code>。<br> 使用该属性要求兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 5。</p></li> 
            <li><p><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。</p></li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-MAP</strong>:该标签指明了获取媒体初始化块(Meida Initialization Section)的方法。<br> 该标签对其后所有媒体片段生效,直至遇到另一个 <strong>EXT-X-MAP</strong> 标签。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-MAP:<attribute-list>
      </code></pre> <p>其属性列表取值范围如下:</p> 
           <ul> 
            <li><p><strong>URI</strong>:由引号包裹的字符串,指定了包含媒体初始化块的资源的路径。该属性为必选参数。</p></li> 
            <li><p><strong>BYTERANGE</strong>:由引号包裹的字符串,指定了媒体初始化块在 <strong>URI</strong> 指定的资源的位置(片段)。<br> 该属性指定的范围应当只包含媒体初始化块。<br> 该属性为可选参数,如果未指定,则表示 <strong>URI</strong> 指定的资源就是全部的媒体初始化块。</p></li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-PROGRAM-DATE-TIME</strong>:该标签使用一个绝对日期/时间表明第一个样本片段的取样时间。<br> 其格式为:</p> <pre><code class="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> </li> 
          <li> <p><strong>EXT-X-DATERANGE</strong>:该标签定义了一系列由属性/值对组成的日期范围。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-DATERANGE:<attribute-list>
      </code></pre> <p>其属性列表取值如下:</p> 
           <ul> 
            <li><p><strong>ID</strong>:双引号包裹的唯一指明日期范围的标识。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>CLASS</strong>:双引号包裹的由客户定义的一系列属性与与之对应的语意值。<br> 所有拥有同一 <strong>CLASS</strong> 属性的日期范围必须遵守对应的语意。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>START-DATE</strong>:双引号包裹的日期范围起始值。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>END-DATE</strong>:双引号包裹的日期范围结束值。<br> 该属性值必须大于或等于 <strong>START-DATE</strong>。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>DURATION</strong>:日期范围的持续时间是一个十进制浮点型数值类型(单位:秒)。<br> 该属性值不能为负数。<br> 当表达立即时间时,将该属性值设为 0 即可。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>PLANNED-DURATION</strong>:该属性为日期范围的期望持续时长。<br> 其值为一个十进制浮点数值类型(单位:秒)。<br> 该属性值不能为负数。<br> 在预先无法得知真实持续时长的情况下,可使用该属性作为日期范围的期望预估时长。<br> 该属性为可选参数。</p></li> 
           </ul> </li> 
          <li><p><strong>X-<client-attribute></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> </li> 
        <li> <p><strong>媒体播放列表类型标签</strong>:媒体播放列表标签为 m3u8 文件的全局参数信息。<br> 这些标签只能在 m3u8 文件中至多出现一次。<br> 媒体播放列表(Media Playlist)标签不能出现在主播放列表(Master Playlist)中。<br> 媒体播放列表具体标签如下所示:</p> 
         <ul> 
          <li> <p><strong>EXT-X-TARGETDURATION</strong>:表示每个视频分段最大的时长(单位秒)。<br> 该标签为必选标签。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-TARGETDURATION:<s>
      </code></pre> <p>其中:参数<code>s</code>表示目标时长(单位:秒)。</p> </li> 
          <li> <p><strong>EXT-X-MEDIA-SEQUENCE</strong>:表示播放列表第一个 URL 片段文件的序列号。<br> 每个媒体片段 URL 都拥有一个唯一的整型序列号。<br> 每个媒体片段序列号按出现顺序依次加 1。<br> 如果该标签未指定,则默认序列号从 0 开始。<br> 媒体片段序列号与片段文件名无关。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-MEDIA-SEQUENCE:<number>
      </code></pre> <p>其中:参数<code>number</code>即为切片序列号。</p> </li> 
          <li> <p><strong>EXT-X-DISCONTINUITY-SEQUENCE</strong>:该标签使能同步相同流的不同 Rendition 和 具备 <strong>EXT-X-DISCONTINUITY</strong> 标签的不同备份流。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-DISCONTINUITY-SEQUENCE:<number>
      </code></pre> <p>其中:参数<code>number</code>为一个十进制整型数值。<br> 如果播放列表未设置 <strong>EXT-X-DISCONTINUITY-SEQUENCE</strong> 标签,那么对于第一个切片的中断序列号应当为 0。</p> </li> 
          <li> <p><strong>EXT-X-ENDLIST</strong>:表明 m3u8 文件的结束。<br> 该标签可出现在 m3u8 文件任意位置,一般是结尾。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-ENDLIST
      </code></pre> </li> 
          <li> <p><strong>EXT-X-PLAYLIST-TYPE</strong>:表明流媒体类型。全局生效。<br> 该标签为可选标签。<br> 其格式为:</p> <pre><code class="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>:表示该视频流为直播源,因此服务器不能更改或删除该文件任意部分内容(但是可以在文件末尾添加新内容)。<br> 注:<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> </li> 
          <li> <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="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> 帧出现的时长。<br> 媒体资源如果包含 <strong>I-frame</strong> 切片,那么必须提供媒体初始化块或者通过 <strong>EXT-X-MAP</strong> 标签提供媒体初始化块的获取途径,这样客户端就能通过这些 <strong>I-frame</strong> 切片以任意顺序进行加载和解码。<br> 如果 <strong>I-frame</strong> 切片设置了 <strong>EXT-BYTERANGE</strong>,那么就绝对不能提供媒体初始化块。<br> 使用 <strong>EXT-X-I-FRAMES-ONLY</strong> 要求的兼容版本号 <strong>EXT-X-VERSION</strong> 大于等于 4。</p> </li> 
         </ul> </li> 
        <li> <p><strong>主播放列表类型标签</strong>:主播放列表(Master Playlist)定义了备份流,多语言翻译流和其他全局参数。<br> 主播放列表标签绝不能出现在媒体播放列表(Media Playlist)中。<br> 其具体标签如下:</p> 
         <ul> 
          <li> <p><strong>EXT-X-MEDIA</strong>:用于指定相同内容的可替换的多语言翻译播放媒体列表资源。<br> 比如,通过三个 <strong>EXT-X-MEIDA</strong> 标签,可以提供包含英文,法语和西班牙语版本的相同内容的音频资源,或者通过两个 <strong>EXT-X-MEDIA</strong> 提供两个不同拍摄角度的视屏资源。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-MEDIA:<attribute-list>
      </code></pre> <p>其中,属性列表取值范围如下:</p> 
           <ul> 
            <li><p><strong>TYPE</strong>:该属性值为一个可枚举字符串。<br> 其值有如下四种:<code>AUDIO</code>,<code>VIDEO</code>,<code>SUBTITLES</code>,<code>CLOSED-CAPTIONS</code>。<br> 通常使用的都是<code>CLOSED-CAPTIONS</code>。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>URI</strong>:双引号包裹的媒体资源播放列表路径。<br> 如果 <strong>TYPE</strong> 属性值为 <code>CLOSED-CAPTIONS</code>,那么则不能提供 <strong>URI</strong>。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>GROUP-ID</strong>:双引号包裹的字符串,表示多语言翻译流所属组。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>LANGUAGE</strong>:双引号包裹的字符串,用于指定流主要使用的语言。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>ASSOC-LANGUAGE</strong>:双引号包裹的字符串,其内包含一个语言标签,用于提供多语言流的其中一种语言版本。<br> 该参数为可选参数。</p></li> 
            <li><p><strong>NAME</strong>:双引号包裹的字符串,用于为翻译流提供可读的描述信息。<br> 如果设置了 <strong>LANGUAGE</strong> 属性,那么也应当设置 <strong>NAME</strong> 属性。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>DEFAULT</strong>:该属性值为一个可枚举字符串。<br> 可选值为<code>YES</code>和<code>NO</code>。<br> 该属性未指定时默认值为<code>NO</code>。<br> 如果该属性设为<code>YES</code>,那么客户端在缺乏其他可选信息时应当播放该翻译流。<br> 该属性为可选参数。</p></li> 
            <li><p><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> 该属性为可选参数。</p></li> 
            <li><p><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> 该属性为可选参数。</p></li> 
            <li><p><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> 值,该属性绝不能进行设置。</p></li> 
            <li><p><strong>CHARACTERISTICS</strong>:由双引号包裹的由一个或多个由逗号分隔的 UTI 构成的字符串。<br> 每个 UTI 表示一种翻译流的特征。<br> 该属性可包含私有 UTI。<br> 该属性为可选参数。</p></li> 
            <li><p><strong>CHANNELS</strong>:由双引号包裹的有序,由反斜杠<code>/</code>分隔的参数列表组成的字符串。<br> 所有音频 <strong>EXT-X-MEDIA</strong> 标签应当都设置 <strong>CHANNELS</strong> 属性。<br> 如果主播放列表包含两个相同编码但是具有不同数目 channed 的翻译流,则必须设置 <strong>CHANNELS</strong> 属性;否则,<strong>CHANNELS</strong> 属性为可选参数。</p></li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-STREAM-INF</strong>:该属性指定了一个备份源。该属性值提供了该备份源的相关信息。<br> 其格式为:</p> <pre><code>#EXT-X-STREAM-INF:<attribute-list>
      <URI>
      </code></pre> <p>其中:</p> 
           <ul> 
            <li><p><strong>URI</strong> 指定的媒体播放列表携带了该标签指定的翻译备份源。<br> <strong>URI</strong> 为必选参数。</p></li> 
            <li> <p><strong>EXT-X-STREAM-INF</strong> 标签的参数属性列表有如下选项:</p> 
             <ul> 
              <li><p><strong>BANDWIDTH</strong>:该属性为每秒传输的比特数,也即带宽。代表该备份流的巅峰速率。<br> 该属性为必选参数。</p></li> 
              <li><p><strong>AVERAGE-BANDWIDTH</strong>:该属性为备份流的平均切片传输速率。<br> 该属性为可选参数。</p></li> 
              <li><p><strong>CODECS</strong>:双引号包裹的包含由逗号分隔的格式列表组成的字符串。<br> 每个 <strong>EXT-X-STREAM-INF</strong> 标签都应当携带 <strong>CODECS</strong> 属性。</p></li> 
              <li><p><strong>RESOLUTION</strong>:该属性描述备份流视屏源的最佳像素方案。<br> 该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</p></li> 
              <li><p><strong>FRAME-RATE</strong>:该属性用一个十进制浮点型数值作为描述备份流所有视屏最大帧率。<br> 对于备份流中任意视屏源帧数超过每秒 30 帧的,应当增加该属性设置。<br> 该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</p></li> 
              <li><p><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 可能存在播放失败的情况下,应当提供该属性。</p></li> 
              <li><p><strong>AUDIO</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>AUDIO</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</p></li> 
              <li><p><strong>VIDEO</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>VIDEO</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</p></li> 
              <li><p><strong>SUBTITLES</strong>:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 <strong>TYPE</strong> 属性值为 <strong>SUBTITLES</strong> 的 <strong>EXT-X-MEDIA</strong> 标签的 <strong>GROUP-ID</strong> 属性值相匹配。<br> 该属性为可选参数。</p></li> 
              <li><p><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> 该属性为可选参数。</p></li> 
             </ul> </li> 
           </ul> </li> 
          <li> <p><strong>EXT-X-I-FRAME-STREAM-INF</strong>:该标签表明媒体播放列表文件包含多种媒体资源的 <strong>I-frame</strong> 帧。<br> 其格式为:</p> <pre><code class="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> </li> 
          <li> <p><strong>EXT-X-SESSION-DATA</strong>:该标签允许主播放列表携带任意 session 数据。<br> 该标签为可选参数。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-SESSION-DATA:<attribute-list>
      </code></pre> <p>其中,其参数属性列表值如下可选项:</p> 
           <ul> 
            <li><p><strong>DATA-ID</strong>:由双引号包裹的字符串,代表一个特定的数据值。<br> 该属性应当使用反向 DNS 进行命名,如<code>"com.example.movie.title"</code>。然而,由于没有中央注册机构,所以可能出现冲突情况。<br> 该属性为必选参数。</p></li> 
            <li><p><strong>VALUE</strong>:该属性值为一个双引号包裹的字符串,其包含 <strong>DATA-ID</strong> 指定的值。<br> 如果设置了 <strong>LANGUAGE</strong>,则 <strong>VALUE</strong> 应当包含一个用该语言书写的可读字符串。</p></li> 
            <li><p><strong>URI</strong>:由双引号包裹的 URI 字符串。由该 URI 指示的资源必选使用 JSON 格式,否则,客户端可能会解析失败。</p></li> 
            <li><p><strong>LANGUAGE</strong>:由双引号包裹的,包含一个语言标签的字符串。指示了 <strong>VALUE</strong> 所使用的语言。</p></li> 
           </ul> </li> 
         </ul> </li> 
       </ul> 
       <ul> 
        <li> <strong>EXT-X-SESSION-KEY</strong>:该标签允许主播放列表(Master Playlist)指定媒体播放列表(Meida Playlist)的加密密钥。这使得客户端可以预先加载这些密钥,而无需从媒体播放列表中获取。<br> 该标签为可选参数。<br> 其格式为: <pre><code class="m3u8">#EXT-X-SESSION-KEY:<attribute-list>
      </code></pre> 其属性列表与 <strong>EXT-X-KEY</strong> 相同,除了 <strong>METHOD</strong> 属性的值必须不为<code>NONE</code>。</li> 
       </ul> 
       <ul> 
        <li> <p><strong>播放列表类型标签</strong>:以下标签可同时设置于主播放列表(Master Playlist)和媒体播放列表(Media Playlist)中。<br> 但是对于在主播放列表中设置了的标签,不应当再次设置在主播放列表指向的媒体播放列表中。<br> 同时出现在两者播放列表的相同标签必须具备相同的值。这些标签在播放列表中不能出现多次(只能使用一次)。具体标签如下所示:</p> 
         <ul> 
          <li> <p><strong>EXT-X-INDEPENDENT-SEGMENTS</strong>:该标签表明对于一个媒体片段中的所有媒体样本均可独立进行解码,而无须依赖其他媒体片段信息。<br> 该标签对列表内所有媒体片段均有效。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-INDEPENDENT-SEGMENTS
      </code></pre> <p>如果该标签出现在主播放列表中,则其对所有媒体播放列表的所有媒体片段都生效。</p> </li> 
          <li> <p><strong>EXT-X-START</strong>:该标签表示播放列表播放起始位置。<br> 默认情况下,客户端开启一个播放会话时,应当使用该标签指定的位置进行播放。<br> 该标签为可选标签。<br> 其格式为:</p> <pre><code class="m3u8">#EXT-X-START:<attribute-list>
      </code></pre> <p>其参数属性列表的取值范围如下:</p> 
           <ul> 
            <li><p><strong>TIME-OFFSET</strong>:该属性值为一个带符号十进制浮点数(单位:秒)。<br> 一个正数表示以播放列表起始位置开始的时间偏移量。<br> 一个负数表示播放列表上一个媒体片段最后位置往前的时间偏移量。<br> 该属性的绝对值应当不超过播放列表的时长。如果超过,则表示到达文件结尾(数值为正数),或者达到文件起始(数值为负数)。<br> 如果播放列表不包含 <strong>EXT-X-ENDLIST</strong> 标签,那么 <strong>TIME-OFFSET</strong> 属性值不应当在播放文件末尾三个切片时长之内。</p></li> 
            <li><p><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>。</p></li> 
           </ul> </li> 
         </ul> </li> 
       </ul> 
       <p>到此,m3u8 相关的标签我们已经完全介绍完毕。</p> 
       <p>下面我们再简单介绍下资源文件的获取具体操作。</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="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="txt">#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><p>有两种请求 m3u8 播放列表的方法:一是通过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8 或 .m3u 结尾;<br> 二是通过 HTTP 进行请求,则请求头<code>Content-Type</code>必须设置为 <code>application/vnd.apple.mpegurl</code>或者<code>audio/mpegurl</code>。</p></li> 
        <li><p>空行和注释行在解析时都忽略。</p></li> 
        <li><p>媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。</p></li> 
        <li><p>每个切片的码率(bit rate)就是切片的大小除以它对应的时长(<strong>EXTINF</strong> 指定的时长)。</p></li> 
        <li><p>一个标签的属性列表的同一个属性<code>AttributeName</code>只能出现一次。</p></li> 
        <li><p><strong>EXT-X-TARGETDURATION</strong> 指定的时长绝对不能进行更改。通常该值指定的时长为 10 秒。</p></li> 
        <li><p>对于指定了 <strong>EXT-X-I-FRAMES-ONLY</strong> 且 第一个媒体片段(或者第一个尾随 <strong>EXT-X-DISCONTINUITY</strong> 的片段)其资源没有立即携带媒体初始化块的切片,应当增加使用标签 <strong>EXT-X-MAP</strong> 指定媒体初始化块获取途径。</p></li> 
        <li><p>使用 <strong>EXT-X-MAP</strong> 标签内含标签 <strong>EXT-X-I-FRAMES-ONLY</strong> 要求的兼容版本号 <strong>EXT-X-VERSION</strong> 要大于等于 5;只使用 <strong>EXT-X-MAP</strong> 要求的兼容版本号要大于等于 6。</p></li> 
        <li><p>由标签 <strong>EXT-X-MAP</strong> 声明的媒体初始化块可使用 AES-128 方法进行加密,此时,作用于 <strong>EXT-X-MAP</strong> 标签的 <strong>EXT-X-KEY</strong> 标签必须设置 <strong>IV</strong> 属性。</p></li> 
        <li><p>带有属性 <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> 不能指定重叠的日期范围。</p></li> 
        <li><p>日期范围如果未指明 <strong>DURATION</strong>,<strong>END_DATE</strong>,<strong>END-ON-NEXT=YES</strong> 属性时,则其时长(duration)未知,即使其设置了 <strong>PLANNED-DURATION</strong> 属性。</p></li> 
        <li><p>如果播放列表设置了 <strong>EXT-X-DATERANGE</strong> 标签,则必须同时设置 <strong>EXT-X-PROGRAM-DATE-TIME</strong> 标签。</p></li> 
        <li><p>如果播放列表设置了拥有相同 <strong>ID</strong> 属性值的两个 <strong>EXT-X-DATERANGE</strong> 标签,则对于相同的属性名,在这两个 <strong>EXT-X-DATERANGE</strong> 中对应的值必须一致。</p></li> 
        <li><p>如果 <strong>EXT-X-DATERANGE</strong> 同时设置了 <strong>DURATION</strong> 和 <strong>END-DATE</strong> 属性,则 <strong>END-DATE</strong> 属性值必须等于 <strong>START-DATE</strong> 属性值加上 <strong>DURATION</strong> 属性值。</p></li> 
        <li><p><strong>EXT-X-MEDIA-SEQUENCE</strong> 标签必须出现在播放列表第一个切片之前。</p></li> 
        <li><p><strong>EXT-X-DISCONTINUITY-DEQUENCE</strong> 标签必须出现在播放列表第一个切片之前。</p></li> 
        <li><p><strong>EXT-X-DISCONTINUITY-DEQUENCE</strong> 标签必须出现在任意 <strong>EXT-X-DISCONTINUITY</strong> 标签之前。</p></li> 
        <li><p>m3u8 文件如果没有设置 <strong>EXT-X-PLAYLIST-TYPE</strong> 标签,那么播放列表可以随时进行更改。比如,可以更新或删除播放列表中的媒体片段。</p></li> 
        <li><p>每个 <strong>EXT-X-I-FRAME-STREAM-INF</strong> 标签必须包含一个 <strong>BANDWIDTH</strong> 和 <strong>URI</strong> 属性。</p></li> 
        <li><p>每个 <strong>EXT-X-SESSION-DATA</strong> 标签都必须包含一个 <strong>VALUE</strong> 或 <strong>URI</strong> 属性,但不能同时包含两者。</p></li> 
        <li><p>一个播放列表可以包含多个携带相同 <strong>DATA-ID</strong> 属性的 <strong>EXT-X-SESSION-DATA</strong> 标签。但是不能包含多个携带相同 <strong>DATA-ID</strong> 和相同 <strong>LANGUAGE</strong> 属性的 <strong>EXT-X-SESSION-DATA</strong> 标签。</p></li> 
        <li><p>如果设置了 <strong>EXT-X-SESSION-KEY</strong>,那么其 <strong>METHOD</strong>,<strong>KEYFORMAT</strong> 和 <strong>KEYFORMATVERSIONS</strong> 属性值必须与任意相同 <strong>URI</strong> 的 <strong>EXT-X-KEY</strong> 标签值相同。</p></li> 
        <li><p>如果多份备用流或者多语言流使用相同的加密密钥和格式,则应当设置 <strong>EXT-X-SESSION-KEY</strong> 标签。</p></li> 
        <li><p>主播放列表必须不能设置多个具有相同 <strong>METHOD</strong>,<strong>URI</strong>,<strong>IV</strong>,<strong>KEYFORMAT</strong> 和 <strong>KEYFORMATVERSIONS</strong> 属性值得 <strong>EXT-X-SESSION-KEY</strong> 标签。</p></li> 
       </ul> 
       <h2>附录</h2> 
       <ul> 
        <li><p>苹果官方文档</p></li> 
        <li><p>HTTP Live Streaming - rfc8216</p></li> 
        <li><p>视频内容加密封装技术研究</p></li> 
       </ul> 
      </article>
                                  </div>
                              </div>
                          </div>
                          <!--PC和WAP自适应版-->
                          <div id="SOHUCS" sid="1385921066421014528"></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 文件格式详解)</h4>
              <div id="paradigm-article-related">
                  <div class="recommend-post mb30">
                      <ul class="widget-links">
                          <li><a href="/article/1835505606245576704.htm"
                                 title="Python中os.environ基本介绍及使用方法" target="_blank">Python中os.environ基本介绍及使用方法</a>
                              <span class="text-muted">鹤冲天Pro</span>
      <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi</div>
                          </li>
                          <li><a href="/article/1835499615491813376.htm"
                                 title="四章-32-点要素的聚合" target="_blank">四章-32-点要素的聚合</a>
                              <span class="text-muted">彩云飘过</span>
      
                              <div>本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.</div>
                          </li>
                          <li><a href="/article/1835490218845761536.htm"
                                 title="Python爬虫解析工具之xpath使用详解" target="_blank">Python爬虫解析工具之xpath使用详解</a>
                              <span class="text-muted">eqa11</span>
      <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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门</div>
                          </li>
                          <li><a href="/article/1835457443690278912.htm"
                                 title="[Python] 数据结构 详解及代码" target="_blank">[Python] 数据结构 详解及代码</a>
                              <span class="text-muted">AIAdvocate</span>
      <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</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/%E9%93%BE%E8%A1%A8/1.htm">链表</a>
                              <div>今日内容大纲介绍数据结构介绍列表链表1.数据结构和算法简介程序大白话翻译,程序=数据结构+算法数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍算法具有独立性算法是解决问题的思路和方式,最重要的是思维,而不是语言,其(算法)可以通过多种语言进行演绎.5大特性有输入,需要传入1或者多个参数有输出,需要返回1个或者多个结果有穷性,执行</div>
                          </li>
                          <li><a href="/article/1835435141535723520.htm"
                                 title="详解:如何设计出健壮的秒杀系统?" target="_blank">详解:如何设计出健壮的秒杀系统?</a>
                              <span class="text-muted">夜空_2cd3</span>
      
                              <div>作者:Yrion博客园:cnblogs.com/wyq178/p/11261711.html前言:秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀。那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统?本期我们就来探讨一下这个问题:image目录一:****秒杀系统应该考虑的问题二:****秒杀系统的设计和技术方案三:*</div>
                          </li>
                          <li><a href="/article/1835429201952468992.htm"
                                 title="非对称加密算法原理与应用2——RSA私钥加密文件" target="_blank">非对称加密算法原理与应用2——RSA私钥加密文件</a>
                              <span class="text-muted">私语茶馆</span>
      <a class="tag" taget="_blank" href="/search/%E4%BA%91%E9%83%A8%E7%BD%B2%E4%B8%8E%E5%BC%80%E5%8F%91/1.htm">云部署与开发</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E5%8F%8A%E4%BA%A7%E5%93%81%E7%81%B5%E6%84%9F%E8%AE%B0%E5%BD%95/1.htm">架构及产品灵感记录</a><a class="tag" taget="_blank" href="/search/RSA2048/1.htm">RSA2048</a><a class="tag" taget="_blank" href="/search/%E7%A7%81%E9%92%A5%E5%8A%A0%E5%AF%86/1.htm">私钥加密</a>
                              <div>作者:私语茶馆1.相关章节(1)非对称加密算法原理与应用1——秘钥的生成-CSDN博客第一章节讲述的是创建秘钥对,并将公钥和私钥导出为文件格式存储。本章节继续讲如何利用私钥加密内容,包括从密钥库或文件中读取私钥,并用RSA算法加密文件和String。2.私钥加密的概述本文主要基于第一章节的RSA2048bit的非对称加密算法讲述如何利用私钥加密文件。这种加密后的文件,只能由该私钥对应的公钥来解密。</div>
                          </li>
                          <li><a href="/article/1835421888088731648.htm"
                                 title="MyBatis 详解" target="_blank">MyBatis 详解</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/mybatis/1.htm">mybatis</a>
                              <div>目录目录一、MyBatis是什么二、为什么使用MyBatis(一)灵活性高(二)性能优化(三)易于维护三、怎么用MyBatis(一)添加依赖(二)配置MyBatis(三)创建实体类和接口(四)使用MyBatis一、MyBatis是什么MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。它可以通过简</div>
                          </li>
                          <li><a href="/article/1835401975269781504.htm"
                                 title="vue render 函数详解 (配参数详解)" target="_blank">vue render 函数详解 (配参数详解)</a>
                              <span class="text-muted">你的眼睛會笑</span>
      <a class="tag" taget="_blank" href="/search/vue2/1.htm">vue2</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                              <div>vuerender函数详解(配参数详解)在Vue3中,`render`函数被用来代替Vue2中的模板语法。它接收一个h函数(或者是`createElement`函数的别名),并且返回一个虚拟DOM。render函数的语法结构如下:render(h){returnh('div',{class:'container'},'Hello,World!')}在上面的示例中,我们使用h函数创建了一个div元素</div>
                          </li>
                          <li><a href="/article/1835395039572881408.htm"
                                 title="Dockerfile命令详解之 FROM" target="_blank">Dockerfile命令详解之 FROM</a>
                              <span class="text-muted">清风怎不知意</span>
      <a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8%E5%8C%96/1.htm">容器化</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                              <div>许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用</div>
                          </li>
                          <li><a href="/article/1835394786899619840.htm"
                                 title="Dockerfile(1) - FROM 指令详解" target="_blank">Dockerfile(1) - FROM 指令详解</a>
                              <span class="text-muted">小菠萝测试笔记</span>
      <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                              <div>FROM指明当前的镜像基于哪个镜像构建dockerfile必须以FROM开头,除了ARG命令可以在FROM前面FROM[--platform=][AS]FROM[--platform=][:][AS]FROM[--platform=][@][AS]小栗子FROMalpine:latest一个dockerfile可以有多个FROM可以有多个FROM来创建多个镜像,或区分构建阶段,将一个构建阶段作为另</div>
                          </li>
                          <li><a href="/article/1835390752381825024.htm"
                                 title="详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因" target="_blank">详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因</a>
                              <span class="text-muted">hw_happy</span>
      <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/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                              <div>前情提要在一个vue文件中需要引入定义的b.vue文件,但是提示b文件没有默认导出,对于vue2文件来说有exportdefault,在中,所有定义的变量、函数和组件都会自动被视为默认导出的组件内容。因此,不需要显式地使用exportdefault来导出组件。但是在我引用这个文件的时候还是提示了这个错误,原来是我的项目使用了ts和vite\webpack,因为TypeScript和Vue的默认导出</div>
                          </li>
                          <li><a href="/article/1835369443379736576.htm"
                                 title="【显示 后台运行 & 的命令】" target="_blank">【显示 后台运行 & 的命令】</a>
                              <span class="text-muted">晨春计</span>
      <a class="tag" taget="_blank" href="/search/debug/1.htm">debug</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</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/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                              <div>目录背景步骤详解示例背景当你在Linuxshell中使用&符号将一个命令放到后台运行时,你可以使用jobs命令来查看这些后台进程的状态。但是,jobs命令并不会直接显示进程的PID(进程ID)。它会显示一个作业列表,其中包括每个作业的状态和一个作业标识符(通常是百分号%后面跟着一个数字),但不会直接显示PID。获取后台进程的PID步骤:1、使用jobs命令查看后台作业。2、使用ps命令配合grep</div>
                          </li>
                          <li><a href="/article/1835351925957160960.htm"
                                 title="k8s中Service暴露的种类以及用法" target="_blank">k8s中Service暴露的种类以及用法</a>
                              <span class="text-muted">听说唐僧不吃肉</span>
      <a class="tag" taget="_blank" href="/search/K8S/1.htm">K8S</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                              <div>一、说明在Kubernetes中,有几种不同的方式可以将服务(Service)暴露给外部流量。这些方式通过定义服务的spec.type字段来确定。二、详解1.ClusterIP定义:默认类型,服务只能在集群内部访问。作用:通过集群内部IP地址暴露服务。示例:spec:type:ClusterIPports:-port:80targetPo</div>
                          </li>
                          <li><a href="/article/1835339820935770112.htm"
                                 title="详解mybatis的一二级缓存以及缓存失效原因" target="_blank">详解mybatis的一二级缓存以及缓存失效原因</a>
                              <span class="text-muted">仰望天花板</span>
      <a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><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/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                              <div>数据库的大部分场景下是从磁盘读取,如果数据从内存进行读取,速度较比磁盘要快得多。但因为内存的容量有限,所以一般只会把使用和查询较多的数据缓存起来,以便快速反应,其他使用率不太多的继续存放在磁盘。mybatis分为一级缓存和二级缓存1.一级缓存一级缓存存放在SqlSqeeion上,默认开启1.1pojo@DatapublicclassRole{privateLongid;privateStringr</div>
                          </li>
                          <li><a href="/article/1835321043649130496.htm"
                                 title="pythonpandas函数详解_Python pandas常用函数详解" target="_blank">pythonpandas函数详解_Python pandas常用函数详解</a>
                              <span class="text-muted">Senvn</span>
      
                              <div>本文研究的主要是pandas常用函数,具体介绍如下。1import语句importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportdatetimeimportre2文件读取df=pd.read_csv(path='file.csv')参数:header=None用默认列名,0,1,2,3...names=['A','B','C'</div>
                          </li>
                          <li><a href="/article/1835320411873701888.htm"
                                 title="HTTP 响应状态码详解" target="_blank">HTTP 响应状态码详解</a>
                              <span class="text-muted">云博客-资源宝</span>
      <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/HTTP/1.htm">HTTP</a><a class="tag" taget="_blank" href="/search/%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81%E8%AF%A6%E8%A7%A3/1.htm">响应状态码详解</a>
                              <div>HTTP状态码详解:HTTP状态码,是用以表示WEB服务器HTTP响应状态的3位数字代码小技巧:Ctrl+F快速查找Http状态码状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。101服务器已经理解了客户端的请求,并将</div>
                          </li>
                          <li><a href="/article/1835317009265553408.htm"
                                 title="Linux中GCC与GDB 常用命令详解" target="_blank">Linux中GCC与GDB 常用命令详解</a>
                              <span class="text-muted">Dijkstra's Monk-ey</span>
      <a class="tag" taget="_blank" href="/search/Linux%E4%B8%8E%E5%AE%89%E5%85%A8/1.htm">Linux与安全</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/gdb/1.htm">gdb</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a>
                              <div>GCC和GDB常用命令详解GCC常用的选项GDBLINUX下编程,少不了和GCC,GDB打交道,现在总结下常用命令,掌握这些足够用了。GCC常用的选项选项语义-o指定生成的输出文件-E仅执行编译预处理gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。-S将C代码转换为汇编代码gcc的-S选项,表示在程序编译期间,在生成汇编代码后停止-wall显示警告信息-c生成目标文件(.o),仅执</div>
                          </li>
                          <li><a href="/article/1835314613420388352.htm"
                                 title="腾讯发表多模态综述,一文详解多模态大模型" target="_blank">腾讯发表多模态综述,一文详解多模态大模型</a>
                              <span class="text-muted">存内计算开发者社区</span>
      <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E6%A8%A1%E6%80%81%E5%A4%A7%E6%A8%A1%E5%9E%8B/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/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E9%87%8F%E5%AD%90%E8%AE%A1%E7%AE%97/1.htm">量子计算</a><a class="tag" taget="_blank" href="/search/AI-native/1.htm">AI-native</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a><a class="tag" taget="_blank" href="/search/agi/1.htm">agi</a>
                              <div>多模态大语言模型(MLLM)是近年来兴起的一个新的研究热点,它利用强大的大语言模型作为大脑来执行多模态任务。MLLM令人惊讶的新兴能力,如基于图像写故事和无OCR的数学推理,在传统方法中是罕见的,这表明了一条通往人工通用智能的潜在道路。在本文中,追踪多模态大模型最新热点,讨论多模态关键技术以及现有在情绪识别上的应用。腾讯AILab发表了一篇关于多模态大模型的最新综述《MM-LLMs:RecentA</div>
                          </li>
                          <li><a href="/article/1835295893109174272.htm"
                                 title="OSPF LSA5、LSA7 中 FA 工作原理详解" target="_blank">OSPF LSA5、LSA7 中 FA 工作原理详解</a>
                              <span class="text-muted">斐夷所非</span>
      <a class="tag" taget="_blank" href="/search/network/1.htm">network</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                              <div>FA(ForwardingAddress)仅出现在LSA5或LSA7中,它是数据包访问外部网络时,在数据报文离开OSPF路由域时必须经过的设备地址。LSA5作用LSA5区别于LSA3/LSA4,LSA5仅负责通告OSPF路由域外其他协议的路由,如RIP、BGP等。当外部路由引入到OSPF后,靠LSA5将其泛洪到OSPF路由域。LSA5具有其他LSA所没有的泛洪范围,除了特殊类型区域(Stub及NS</div>
                          </li>
                          <li><a href="/article/1835283416749273088.htm"
                                 title="⭐算法入门⭐《归并排序》简单01 —— LeetCode 21. 合并两个有序链表" target="_blank">⭐算法入门⭐《归并排序》简单01 —— LeetCode 21. 合并两个有序链表</a>
                              <span class="text-muted">英雄哪里出来</span>
      <a class="tag" taget="_blank" href="/search/%E3%80%8ALeetCode%E7%AE%97%E6%B3%95%E5%85%A8%E9%9B%86%E3%80%8B/1.htm">《LeetCode算法全集》</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/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/%E9%93%BE%E8%A1%A8/1.htm">链表</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F/1.htm">归并排序</a>
                              <div>饭不食,水不饮,题必须刷C语言免费动漫教程,和我一起打卡!《光天化日学C语言》LeetCode太难?先看简单题!《C语言入门100例》数据结构难?不存在的!《数据结构入门》LeetCode太简单?算法学起来!《夜深人静写算法》文章目录一、题目1、题目描述2、基础框架3、原题链接二、解题报告1、思路分析2、时间复杂度3、代码详解三、本题小知识一、题目1、题目描述  将两个不降序链表合并为一个新的不降</div>
                          </li>
                          <li><a href="/article/1835262372638453760.htm"
                                 title="WORD批量转换器MultiDoc Converter" target="_blank">WORD批量转换器MultiDoc Converter</a>
                              <span class="text-muted">uolian</span>
      <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a>
                              <div>WORD批量转换器MultiDocConverterhttps://www.52pojie.cn/thread-1318745-1-1.html可批量将doc、docx等文件格式转成doc、docx、pdf、rtf、txt、html、epub等格式。安装包下载地址:https://wws.lanzouj.com/irvVbiz0pkd最终下载文件打包地址(未作成单文件,不确定是否可以直接使用):h</div>
                          </li>
                          <li><a href="/article/1835261739856392192.htm"
                                 title="上传文件到钉盘流程详解" target="_blank">上传文件到钉盘流程详解</a>
                              <span class="text-muted">jspyth</span>
      <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%9C%BA%E6%99%AF%E6%A1%88%E4%BE%8B%E5%88%86%E6%9E%90/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><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                              <div>文章目录前言准备工作实现过程Maven依赖封装一个工具类获取文件上传信息unionId获取钉盘目录spaceId创建上传到钉盘前言  本文详解如何通过钉钉的API实现上传文件到钉盘目录,代码通过JAVA实现。准备工作1、在钉钉开发者后台创建一个钉钉企业内部应用;2、创建并保存好应用的appKey和appSecret,后面用于获取调用API的请求token;3、应用中配置好所需权限:企业存储文件上传</div>
                          </li>
                          <li><a href="/article/1835250648069795840.htm"
                                 title="Linux中open函数详解" target="_blank">Linux中open函数详解</a>
                              <span class="text-muted">460833359</span>
      <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/open%E5%87%BD%E6%95%B0/1.htm">open函数</a>
                              <div>初级文件I/O函数(即不用缓存的I/O函数):open(打开文件)相关函数read,write,fcntl,create,lseek,close,link,stat,umask,unlink,fopen头文件#include#include#include定义函数intopen(constchar*pathname,intflags);intopen(constchar*pathname,intf</div>
                          </li>
                          <li><a href="/article/1835247118126772224.htm"
                                 title="linux open详解,Linux系统open函数详解" target="_blank">linux open详解,Linux系统open函数详解</a>
                              <span class="text-muted">墨剑心</span>
      <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/open%E8%AF%A6%E8%A7%A3/1.htm">open详解</a>
                              <div>Linux系统中open函数主要作用就是打开和创建文件,可以根据参数来定制我们需要的文件的属性和用户权限等各种参数,下面良许教程网为大家分享一下Linux系统open函数具体使用方法。一、open函数用来干什么open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。二、open函数的定义和参数我们首先来看下open函数在Linux下的</div>
                          </li>
                          <li><a href="/article/1835242577218072576.htm"
                                 title="Linux下read函数详解" target="_blank">Linux下read函数详解</a>
                              <span class="text-muted">威桑</span>
      <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</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/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                              <div>在Linux中,read函数是最常用的系统调用之一,用于从文件或其他输入设备读取数据。它是低级别的I/O操作的核心,直接与操作系统的内核交互,提供了高效的数据读取方式。一、read函数简介read函数的声明如下:#includessize_tread(intfd,void*buf,size_tcount);其中:fd是文件描述符,代表了需要读取的文件或设备。文件描述符可以通过调用open或其他文件</div>
                          </li>
                          <li><a href="/article/1835234762789318656.htm"
                                 title="Python round函数详解" target="_blank">Python round函数详解</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/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">性能测试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</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/%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91/1.htm">测试开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">性能测试</a>
                              <div>大家好,在Python编程中,经常需要对数字进行舍入操作。无论是在金融领域的货币计算,还是科学计算中的数据处理,都可能需要使用到四舍五入功能。为了满足这一需求,Python提供了一个内置函数round(),它能够方便地对数字进行舍入操作。在本文中,将深入探讨Python中round()函数的用法和特性。将从基本语法开始,逐步深入,讨论该函数在不同情况下的行为,以及如何在实际编程中灵活运用。无论您是</div>
                          </li>
                          <li><a href="/article/1835233628628545536.htm"
                                 title="Linux下open函数详解" target="_blank">Linux下open函数详解</a>
                              <span class="text-muted">威桑</span>
      <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                              <div>在Linux中,open函数是文件操作的核心系统调用之一,它用于打开文件并返回一个文件描述符,用于后续的文件操作如读取、写入、关闭等。open函数的原型#include#include#include#includeintopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);open函数有</div>
                          </li>
                          <li><a href="/article/1835223795602911232.htm"
                                 title="打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)" target="_blank">打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)</a>
                              <span class="text-muted">埋头编程~</span>
      <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/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><a class="tag" taget="_blank" href="/search/visual/1.htm">visual</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                              <div>文章目录1.前言2.memcpy函数2.1memcpy函数的原型2.2memcpy函数的形参和返回值详解3.memcpy函数的演示4.memcpy函数的模拟实现5.总结1.前言在之前写的文章中,我介绍了几个比较常用的字符串函数strlen、strcmp、strcpy。它们作用的对象只能是形如字符串类型的数据。那这难免会引起我们心中一泡浓厚的求知欲——C语言有没有给我们提供一些类似于字符串函数的功能</div>
                          </li>
                          <li><a href="/article/1835223794810187776.htm"
                                 title="详解C语言中的循环语句" target="_blank">详解C语言中的循环语句</a>
                              <span class="text-muted">埋头编程~</span>
      <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/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>文章目录1.前言2.while循环2.1if和whlie的对比2.2while语句的工作机制2.3while循环的实践3.for循环3.1for循环语法3.2for循环的工作机制3.3for循环实践4dowhile循环4.1dowhlie循环语法4.2dowhile循环的工作机理4.3dowhile循环实践5.break和continue语句5.1break举例5.2continue举例6.got</div>
                          </li>
                          <li><a href="/article/1835221527172313088.htm"
                                 title="4×4矩阵键盘详解(STM32)" target="_blank">4×4矩阵键盘详解(STM32)</a>
                              <span class="text-muted">辰哥单片机设计</span>
      <a class="tag" taget="_blank" href="/search/STM32%E4%BC%A0%E6%84%9F%E5%99%A8%E6%95%99%E5%AD%A6/1.htm">STM32传感器教学</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%A4%96%E8%AE%BE/1.htm">计算机外设</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E4%BC%A0%E6%84%9F%E5%99%A8/1.htm">传感器</a>
                              <div>目录一、介绍二、传感器原理1.原理图2.工作原理介绍三、程序设计main.c文件button4_4.h文件button4_4.c文件四、实验效果五、资料获取项目分享一、介绍矩阵键盘,又称为行列式键盘,是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上设置一个按键,因此键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率,节约单</div>
                          </li>
                                      <li><a href="/article/57.htm"
                                             title="多线程编程之join()方法" target="_blank">多线程编程之join()方法</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/JOIN/1.htm">JOIN</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a>
                                          <div>现实生活中,有些工作是需要团队中成员依次完成的,这就涉及到了一个顺序问题。现在有T1、T2、T3三个工人,如何保证T2在T1执行完后执行,T3在T2执行完后执行?问题分析:首先问题中有三个实体,T1、T2、T3, 因为是多线程编程,所以都要设计成线程类。关键是怎么保证线程能依次执行完呢?   
      Java实现过程如下: 
      public class T1 implements Runnabl</div>
                                      </li>
                                      <li><a href="/article/184.htm"
                                             title="java中switch的使用" target="_blank">java中switch的使用</a>
                                          <span class="text-muted">bingyingao</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/break/1.htm">break</a><a class="tag" taget="_blank" href="/search/continue/1.htm">continue</a>
                                          <div>java中的switch仅支持case条件仅支持int、enum两种类型。 
      用enum的时候,不能直接写下列形式。 
       
       
      switch (timeType) {
                  case ProdtransTimeTypeEnum.DAILY:
      
                      break;
      
                  default:
                      br</div>
                                      </li>
                                      <li><a href="/article/311.htm"
                                             title="hive having count 不能去重" target="_blank">hive having count 不能去重</a>
                                          <span class="text-muted">daizj</span>
      <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/%E5%8E%BB%E9%87%8D/1.htm">去重</a><a class="tag" taget="_blank" href="/search/having+count/1.htm">having count</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E6%95%B0/1.htm">计数</a>
                                          <div>hive在使用having count()是,不支持去重计数 
        
      hive (default)> select imei from t_test_phonenum where ds=20150701 group by imei having count(distinct phone_num)>1 limit 10;  
      FAILED: SemanticExcep</div>
                                      </li>
                                      <li><a href="/article/438.htm"
                                             title="WebSphere对JSP的缓存" target="_blank">WebSphere对JSP的缓存</a>
                                          <span class="text-muted">周凡杨</span>
      <a class="tag" taget="_blank" href="/search/WAS+JSP+%E7%BC%93%E5%AD%98/1.htm">WAS JSP 缓存</a>
                                          <div>      对于线网上的工程,更新JSP到WebSphere后,有时会出现修改的jsp没有起作用,特别是改变了某jsp的样式后,在页面中没看到效果,这主要就是由于websphere中缓存的缘故,这就要清除WebSphere中jsp缓存。要清除WebSphere中JSP的缓存,就要找到WAS安装后的根目录。 
             现服务</div>
                                      </li>
                                      <li><a href="/article/565.htm"
                                             title="设计模式总结" target="_blank">设计模式总结</a>
                                          <span class="text-muted">朱辉辉33</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                          <div>1.工厂模式 
        1.1 工厂方法模式 (由一个工厂类管理构造方法) 
           1.1.1普通工厂模式(一个工厂类中只有一个方法) 
           1.1.2多工厂模式(一个工厂类中有多个方法) 
           1.1.3静态工厂模式(将工厂类中的方法变成静态方法) 
      &n</div>
                                      </li>
                                      <li><a href="/article/692.htm"
                                             title="实例:供应商管理报表需求调研报告" target="_blank">实例:供应商管理报表需求调研报告</a>
                                          <span class="text-muted">老A不折腾</span>
      <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E7%B3%BB%E7%BB%9F/1.htm">报表系统</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E8%BD%AF%E4%BB%B6/1.htm">报表软件</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8C%96%E9%80%89%E5%9E%8B/1.htm">信息化选型</a>
                                          <div>引言 
      随着企业集团的生产规模扩张,为支撑全球供应链管理,对于供应商的管理和采购过程的监控已经不局限于简单的交付以及价格的管理,目前采购及供应商管理各个环节的操作分别在不同的系统下进行,而各个数据源都独立存在,无法提供统一的数据支持;因此,为了实现对于数据分析以提供采购决策,建立报表体系成为必须。 业务目标 
      1、通过报表为采购决策提供数据分析与支撑 
      2、对供应商进行综合评估以及管理,合理管理和</div>
                                      </li>
                                      <li><a href="/article/819.htm"
                                             title="mysql" target="_blank">mysql</a>
                                          <span class="text-muted">林鹤霄</span>
      
                                          <div>转载源:http://blog.sina.com.cn/s/blog_4f925fc30100rx5l.html 
      mysql -uroot -p 
      ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 
        
      [root@centos var]# service mysql</div>
                                      </li>
                                      <li><a href="/article/946.htm"
                                             title="Linux下多线程堆栈查看工具(pstree、ps、pstack)" target="_blank">Linux下多线程堆栈查看工具(pstree、ps、pstack)</a>
                                          <span class="text-muted">aigo</span>
      <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                          <div>原文:http://blog.csdn.net/yfkiss/article/details/6729364 
        
      1. pstree 
      pstree以树结构显示进程$ pstree -p work | grep adsshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552)  &n</div>
                                      </li>
                                      <li><a href="/article/1073.htm"
                                             title="html input与textarea 值改变事件" target="_blank">html input与textarea 值改变事件</a>
                                          <span class="text-muted">alxw4616</span>
      <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                          <div>// 文本输入框(input) 文本域(textarea)值改变事件 
      // onpropertychange(IE) oninput(w3c) 
      $('input,textarea').on('propertychange input', function(event) { 
           console.log($(this).val()) 
      }); 
        </div>
                                      </li>
                                      <li><a href="/article/1200.htm"
                                             title="String类的基本用法" target="_blank">String类的基本用法</a>
                                          <span class="text-muted">百合不是茶</span>
      <a class="tag" taget="_blank" href="/search/String/1.htm">String</a>
                                          <div>  
      字符串的用法; 
          // 根据字节数组创建字符串 
      byte[] by = { 'a', 'b', 'c', 'd' };
      String newByteString = new String(by); 
        
        
          1,length()  获取字符串的长度 
        
        &nbs</div>
                                      </li>
                                      <li><a href="/article/1327.htm"
                                             title="JDK1.5 Semaphore实例" target="_blank">JDK1.5 Semaphore实例</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/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/Semaphore/1.htm">Semaphore</a>
                                          <div>Semaphore类 
             一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。 
      S</div>
                                      </li>
                                      <li><a href="/article/1454.htm"
                                             title="使用GZip来压缩传输量" target="_blank">使用GZip来压缩传输量</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/GZip/1.htm">GZip</a>
                                          <div>        启动GZip压缩要用到一个开源的Filter:PJL Compressing Filter。这个Filter自1.5.0开始该工程开始构建于JDK5.0,因此在JDK1.4环境下只能使用1.4.6。 
              PJL Compressi</div>
                                      </li>
                                      <li><a href="/article/1581.htm"
                                             title="【Java范型三】Java范型详解之范型类型通配符" target="_blank">【Java范型三】Java范型详解之范型类型通配符</a>
                                          <span class="text-muted">bit1129</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                          <div>  
        
      定义如下一个简单的范型类, 
        
      package com.tom.lang.generics;
      
      public class Generics<T> {
          private T value;
          public Generics(T  value) {
              this.value = value;
          }
      } </div>
                                      </li>
                                      <li><a href="/article/1708.htm"
                                             title="【Hadoop十二】HDFS常用命令" target="_blank">【Hadoop十二】HDFS常用命令</a>
                                          <span class="text-muted">bit1129</span>
      <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                                          <div>1. 修改日志文件查看器 
        
      hdfs oev -i edits_0000000000000000081-0000000000000000089 -o edits.xml
      cat edits.xml 
        
      修改日志文件转储为xml格式的edits.xml文件,其中每条RECORD就是一个操作事务日志 
        2. fsimage查看HDFS中的块信息等 
      &nb</div>
                                      </li>
                                      <li><a href="/article/1835.htm"
                                             title="怎样区别nginx中rewrite时break和last" target="_blank">怎样区别nginx中rewrite时break和last</a>
                                          <span class="text-muted">ronin47</span>
      
                                          <div>在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。  
       
       location /    
       {     
           proxy_pass http://test; </div>
                                      </li>
                                      <li><a href="/article/1962.htm"
                                             title="java-21.中兴面试题 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等于 m" target="_blank">java-21.中兴面试题 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 , 使其和等于 m</a>
                                          <span class="text-muted">bylijinnan</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                          <div>
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Stack;
      
      public class CombinationToSum {
      
      	/*
      第21 题
      2010 年中兴面试题
      编程求解:
      输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,
      使其和等</div>
                                      </li>
                                      <li><a href="/article/2089.htm"
                                             title="eclipse svn 帐号密码修改问题" target="_blank">eclipse svn 帐号密码修改问题</a>
                                          <span class="text-muted">开窍的石头</span>
      <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a><a class="tag" taget="_blank" href="/search/svn%E5%B8%90%E5%8F%B7%E5%AF%86%E7%A0%81%E4%BF%AE%E6%94%B9/1.htm">svn帐号密码修改</a>
                                          <div>问题描述: 
           Eclipse的SVN插件Subclipse做得很好,在svn操作方面提供了很强大丰富的功能。但到目前为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,而且一旦用户的帐号、密码保存之后,就无法再变更了。 
      解决思路: 
           删除subclipse记录的帐号、密码信息,重新输入</div>
                                      </li>
                                      <li><a href="/article/2216.htm"
                                             title="[电子商务]传统商务活动与互联网的结合" target="_blank">[电子商务]传统商务活动与互联网的结合</a>
                                          <span class="text-muted">comsci</span>
      <a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1/1.htm">电子商务</a>
                                          <div> 
       
            某一个传统名牌产品,过去销售的地点就在某些特定的地区和阶层,现在进入互联网之后,用户的数量群突然扩大了无数倍,但是,这种产品潜在的劣势也被放大了无数倍,这种销售利润与经营风险同步放大的效应,在最近几年将会频繁出现。。。。 
       
             如何避免销售量和利润率增加的</div>
                                      </li>
                                      <li><a href="/article/2343.htm"
                                             title="java 解析 properties-使用 Properties-可以指定配置文件路径" target="_blank">java 解析 properties-使用 Properties-可以指定配置文件路径</a>
                                          <span class="text-muted">cuityang</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/properties/1.htm">properties</a>
                                          <div>#mq 
      xdr.mq.url=tcp://192.168.100.15:61618; 
       
      import java.io.IOException; 
      import java.util.Properties; 
       
       
      public class Test { 
       
       String conf = "log4j.properties"; 
       private static final</div>
                                      </li>
                                      <li><a href="/article/2470.htm"
                                             title="Java核心问题集锦" target="_blank">Java核心问题集锦</a>
                                          <span class="text-muted">darrenzhu</span>
      <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a><a class="tag" taget="_blank" href="/search/%E6%A0%B8%E5%BF%83/1.htm">核心</a><a class="tag" taget="_blank" href="/search/%E9%9A%BE%E7%82%B9/1.htm">难点</a>
                                          <div>注意,这里的参考文章基本来自Effective Java和jdk源码 
       
       
      1)ConcurrentModificationException 
      当你用for each遍历一个list时,如果你在循环主体代码中修改list中的元素,将会得到这个Exception,解决的办法是: 
      1)用listIterator, 它支持在遍历的过程中修改元素, 
      2)不用listIterator, new一个</div>
                                      </li>
                                      <li><a href="/article/2724.htm"
                                             title="1分钟学会Markdown语法" target="_blank">1分钟学会Markdown语法</a>
                                          <span class="text-muted">dcj3sjt126com</span>
      <a class="tag" taget="_blank" href="/search/markdown/1.htm">markdown</a>
                                          <div>markdown 简明语法 基本符号 
       
       *,-,+ 3个符号效果都一样,这3个符号被称为 Markdown符号  
       空白行表示另起一个段落 
       `是表示inline代码,tab是用来标记 代码段,分别对应html的code,pre标签 
       换行 
       
       单一段落( <p>) 用一个空白行 
       连续两个空格 会变成一个 <br> 
       连续3个符号,然后是空行</div>
                                      </li>
                                      <li><a href="/article/2851.htm"
                                             title="Gson使用二(GsonBuilder)" target="_blank">Gson使用二(GsonBuilder)</a>
                                          <span class="text-muted">eksliang</span>
      <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/gson/1.htm">gson</a><a class="tag" taget="_blank" href="/search/GsonBuilder/1.htm">GsonBuilder</a>
                                          <div>转载请出自出处:http://eksliang.iteye.com/blog/2175473 一.概述 
          GsonBuilder用来定制java跟json之间的转换格式 
        二.基本使用 
      实体测试类: 
      温馨提示:默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeField</div>
                                      </li>
                                      <li><a href="/article/2978.htm"
                                             title="报ClassNotFoundException: Didn't find class "...Activity" on path: DexPathList" target="_blank">报ClassNotFoundException: Didn't find class "...Activity" on path: DexPathList</a>
                                          <span class="text-muted">gundumw100</span>
      <a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                          <div>有一个工程,本来运行是正常的,我想把它移植到另一台PC上,结果报: 
       
       java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mobovip.bgr/com.mobovip.bgr.MainActivity}: java.lang.ClassNotFoundException: Didn't f</div>
                                      </li>
                                      <li><a href="/article/3105.htm"
                                             title="JavaWeb之JSP指令" target="_blank">JavaWeb之JSP指令</a>
                                          <span class="text-muted">ihuning</span>
      <a class="tag" taget="_blank" href="/search/javaweb/1.htm">javaweb</a>
                                          <div>  
      要点 
        
      JSP指令简介  
      page指令  
      include指令  
        
      JSP指令简介  
        
      JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。 
      JSP指令的基本语法格式: 
      <%@ 指令 属性名="</div>
                                      </li>
                                      <li><a href="/article/3232.htm"
                                             title="mac上编译FFmpeg跑ios" target="_blank">mac上编译FFmpeg跑ios</a>
                                          <span class="text-muted">啸笑天</span>
      <a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a>
                                          <div>1、下载文件:https://github.com/libav/gas-preprocessor, 复制gas-preprocessor.pl到/usr/local/bin/下, 修改文件权限:chmod 777 /usr/local/bin/gas-preprocessor.pl 
      2、安装yasm-1.2.0 
      curl http://www.tortall.net/projects/yasm</div>
                                      </li>
                                      <li><a href="/article/3359.htm"
                                             title="sql mysql oracle中字符串连接" target="_blank">sql mysql oracle中字符串连接</a>
                                          <span class="text-muted">macroli</span>
      <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                          <div>有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的: 
       
       MySQL: CONCAT() 
       Oracle: CONCAT(), || 
       SQL Server: + 
       
      CONCAT() 的语法如下: 
      Mysql 中 CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。 
      请注意,Oracle的CON</div>
                                      </li>
                                      <li><a href="/article/3486.htm"
                                             title="Git fatal: unab SSL certificate problem: unable to get local issuer ce rtificate" target="_blank">Git fatal: unab SSL certificate problem: unable to get local issuer ce rtificate</a>
                                          <span class="text-muted">qiaolevip</span>
      <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/%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/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a>
                                          <div>// 报错如下: 
      $ git pull origin master 
      fatal: unable to access 'https://git.xxx.com/': SSL certificate problem: unable to get local issuer ce 
      rtificate 
        
      // 原因: 
      由于git最新版默认使用ssl安全验证,但是我们是使用的git未设</div>
                                      </li>
                                      <li><a href="/article/3613.htm"
                                             title="windows命令行设置wifi" target="_blank">windows命令行设置wifi</a>
                                          <span class="text-muted">surfingll</span>
      <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/wifi/1.htm">wifi</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0%E6%9C%ACwifi/1.htm">笔记本wifi</a>
                                          <div>还没有讨厌无线wifi的无尽广告么,还在耐心等待它慢慢启动么 
      教你命令行设置 笔记本电脑wifi: 
       
      1、开启wifi命令 
       
      
      netsh wlan set hostednetwork mode=allow ssid=surf8 key=bb123456
      netsh wlan start hostednetwork
      pause
       
       其中pause是等待输入,可以去掉 
       
      2、</div>
                                      </li>
                                      <li><a href="/article/3740.htm"
                                             title="Linux(Ubuntu)下安装sysv-rc-conf" target="_blank">Linux(Ubuntu)下安装sysv-rc-conf</a>
                                          <span class="text-muted">wmlJava</span>
      <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/sysv-rc-conf/1.htm">sysv-rc-conf</a>
                                          <div>安装:sudo apt-get install sysv-rc-conf 使用:sudo sysv-rc-conf 
      操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。 
        
        
      背景知识 
      sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconf</div>
                                      </li>
                                      <li><a href="/article/3867.htm"
                                             title="svn切换环境,重发布应用多了javaee标签前缀" target="_blank">svn切换环境,重发布应用多了javaee标签前缀</a>
                                          <span class="text-muted">zengshaotao</span>
      <a class="tag" taget="_blank" href="/search/javaee/1.htm">javaee</a>
                                          <div>更换了开发环境,从杭州,改变到了上海。svn的地址肯定要切换的,切换之前需要将原svn自带的.svn文件信息删除,可手动删除,也可通过废弃原来的svn位置提示删除.svn时删除。 
        
      然后就是按照最新的svn地址和规范建立相关的目录信息,再将原来的纯代码信息上传到新的环境。然后再重新检出,这样每次修改后就可以看到哪些文件被修改过,这对于增量发布的规范特别有用。 
        
      检出</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>