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/1902450826446696448.htm"
                           title="将 VOC 格式 XML 转换为 YOLO 格式 TXT" target="_blank">将 VOC 格式 XML 转换为 YOLO 格式 TXT</a>
                        <span class="text-muted">JeJe同学</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a>
                        <div>目录1.导入必要的模块2.定义类别名称3.设置文件路径完整代码1.导入必要的模块importosimportxml.etree.ElementTreeasETos:用于文件和目录操作,例如创建目录、遍历文件等。xml.etree.ElementTree:用于解析XML文件,从中提取信息。2.定义类别名称class_names=['nest','balloon','kite','trash']这是一</div>
                    </li>
                    <li><a href="/article/1902448305854541824.htm"
                           title="自定义Retriever的实现方法" target="_blank">自定义Retriever的实现方法</a>
                        <span class="text-muted">vaidfl</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>技术背景介绍在许多大语言模型(LLM)应用中,检索器(Retriever)用于从外部数据源获取信息。检索器的任务是根据用户查询检索相关的文档,这些文档通常被格式化为提示,供LLM使用,从而生成适当的响应,例如,根据知识库回答用户问题。核心原理解析要实现自定义的检索器,需要继承BaseRetriever类,并实现以下方法:_get_relevant_documents:获取与查询相关的文档,必需实现</div>
                    </li>
                    <li><a href="/article/1902437844945793024.htm"
                           title="python 输入一行字符串 删除其中所有大写字母后输出_Python练习题3.17删除字符" target="_blank">python 输入一行字符串 删除其中所有大写字母后输出_Python练习题3.17删除字符</a>
                        <span class="text-muted">weixin_39624873</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%BE%93%E5%85%A5%E4%B8%80%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2/1.htm">输入一行字符串</a><a class="tag" taget="_blank" href="/search/%E5%88%A0%E9%99%A4%E5%85%B6%E4%B8%AD%E6%89%80%E6%9C%89%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%E5%90%8E%E8%BE%93%E5%87%BA/1.htm">删除其中所有大写字母后输出</a>
                        <div>输入一个字符串str,再输入要删除字符c,大小写不区分,将字符串str中出现的所有字符c删除。输入格式:在第一行中输入一行字符在第二行输入待删除的字符输出格式:在一行中输出删除后的字符串输入样例:在这里给出一组输入。例如:beee输出样例:在这里给出相应的输出。例如:result:b代码如下:#!/usr/bin/python#-*-coding:utf-8-*-s=input().strip()</div>
                    </li>
                    <li><a href="/article/1902428498778189824.htm"
                           title="ffmpeg+ubuntu16.04编译ffmpeg库" target="_blank">ffmpeg+ubuntu16.04编译ffmpeg库</a>
                        <span class="text-muted">小gpt&</span>
<a class="tag" taget="_blank" href="/search/QT%2BFFMPEG%E5%AE%9E%E6%88%98/1.htm">QT+FFMPEG实战</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>个人使用环境:ubuntudesktop16.04+ffmpeg4.2.1以下的库进行完整编译ffmpeg介绍FFmpeg是一个开源的多媒体框架,广泛用于处理音频、视频、字幕等多媒体数据。它包含了丰富的工具和库,能够进行音视频的编解码、转码、流媒体处理、滤镜应用等操作。FFmpeg是许多多媒体应用程序和工具的核心引擎,功能强大且灵活,支持几乎所有常见的音视频格式。FFmpeg的主要组成部分ffmp</div>
                    </li>
                    <li><a href="/article/1902421931429261312.htm"
                           title="Tree of Thought Prompting(思维树提示)" target="_blank">Tree of Thought Prompting(思维树提示)</a>
                        <span class="text-muted">大数据追光猿</span>
<a class="tag" taget="_blank" href="/search/%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/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/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>
                        <div>TreeofThoughtPrompting(思维树提示)是一种新兴的提示工程技术,旨在通过模拟人类解决问题时的多步推理过程,提升大型语言模型(LLM)在复杂任务中的表现。与传统的线性提示方法不同,思维树提示将问题分解为多个可能的推理路径,并以树状结构探索这些路径,从而找到最优解或生成更高质量的结果。这种方法特别适用于需要多步推理的任务,例如数学问题求解、逻辑推理、规划和创造性写作等场景。它结合了</div>
                    </li>
                    <li><a href="/article/1902412981405282304.htm"
                           title="3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案" target="_blank">3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案</a>
                        <span class="text-muted">3D小将</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%AA%E5%A8%81%E6%A8%A1%E5%9E%8B/1.htm">迪威模型</a><a class="tag" taget="_blank" href="/search/%E8%81%94%E8%AE%AF%E8%BD%AF%E4%BB%B6/1.htm">联讯软件</a><a class="tag" taget="_blank" href="/search/SolidWorks%E6%A8%A1%E5%9E%8B/1.htm">SolidWorks模型</a><a class="tag" taget="_blank" href="/search/UG%E6%A8%A1%E5%9E%8B/1.htm">UG模型</a><a class="tag" taget="_blank" href="/search/Rhino%E6%A8%A1%E5%9E%8B/1.htm">Rhino模型</a><a class="tag" taget="_blank" href="/search/SketchUp%E6%A8%A1%E5%9E%8B/1.htm">SketchUp模型</a><a class="tag" taget="_blank" href="/search/catia%E6%A8%A1%E5%9E%8B/1.htm">catia模型</a><a class="tag" taget="_blank" href="/search/stl%E6%A8%A1%E5%9E%8B/1.htm">stl模型</a><a class="tag" taget="_blank" href="/search/stp%E6%A8%A1%E5%9E%8B/1.htm">stp模型</a>
                        <div>一、引言在产品设计的前沿领域,3DXML与SOLIDWORKS作为主流格式,虽各有所长,但因格式差异,常成为数据流通与协作的阻碍。对于技术人员和学生党而言,掌握二者间的转换技术,不仅能提升设计效率,更是参与复杂项目协作的必备技能。迪威模型在线转换功能,凭借其先进技术,为这一转换难题提供了高效解决方案。二、3DXML与SOLIDWORKS格式基础(一)3DXML3DXML由达索系统精心打造,其核心压</div>
                    </li>
                    <li><a href="/article/1902410835003764736.htm"
                           title="Camera常用算法介绍1" target="_blank">Camera常用算法介绍1</a>
                        <span class="text-muted">记录美好</span>
<a class="tag" taget="_blank" href="/search/android%E7%9B%B8%E6%9C%BA%E5%AD%A6%E4%B9%A0/1.htm">android相机学习</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E6%89%8B%E6%9C%BA/1.htm">智能手机</a>
                        <div>Camera常用数据格式及算法介绍1二、Camera常用算法介绍2.1基础图像处理算法2.1.1HDR算法2.1.1.1HDR算法概述2.1.1.2发展历程2.1.1.2.1传统多帧合成阶段(2010年代初期)2.1.1.2.2.算法优化阶段(2016-2020年)2.1.1.2.3实时处理阶段(2020年至今)2.1.1.3技术原理2.1.1.3.1多帧采集2.1.1.3.2图像合成2.1.1.</div>
                    </li>
                    <li><a href="/article/1902408689906675712.htm"
                           title="pandas 读取某一单元格的值_07-Pandas Excel新建/读取/填充(一)" target="_blank">pandas 读取某一单元格的值_07-Pandas Excel新建/读取/填充(一)</a>
                        <span class="text-muted">扇贝编程</span>
<a class="tag" taget="_blank" href="/search/pandas/1.htm">pandas</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E6%9F%90%E4%B8%80%E5%8D%95%E5%85%83%E6%A0%BC%E7%9A%84%E5%80%BC/1.htm">读取某一单元格的值</a>
                        <div>Excel是微软的经典之作,几乎可以满足我们日常工作的所有需求,但是在处理海量数据时,Excel在效率及性能方面就显得很吃力。正因为Pandas在数据处理方面有着独特的优势,所有掌握pandas库处理excel格式的数据就显得十分必要。目录excel文档新建读取excel文档行列操作空值自动填充行列函数运算excel数据排序excel数据按条件筛选#1.创建excel文件在jupyter中导入pa</div>
                    </li>
                    <li><a href="/article/1902406664972201984.htm"
                           title="如何用Python批量将CSV文件编码转换为UTF-8并转为Excel格式?" target="_blank">如何用Python批量将CSV文件编码转换为UTF-8并转为Excel格式?</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><a class="tag" taget="_blank" href="/search/excel/1.htm">excel</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在处理数据时,CSV文件格式常常用作数据的交换格式。不过,很多情况下我们会遇到编码问题,特别是当文件不是UTF-8编码时。为了更好地处理这些文件,可能需要将它们转换为UTF-8编码,并且将其转换为Excel格式,这样可以方便后续的数据分析和使用。今天就来聊聊如何用Python实现这一过程。准备工作:安装必要的库我们需要确保安装了所需的Python库。主要用到的库有pandas和openpyxl。p</div>
                    </li>
                    <li><a href="/article/1902403007077740544.htm"
                           title="小蓝的图书馆" target="_blank">小蓝的图书馆</a>
                        <span class="text-muted">琴声码语</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E8%93%9D%E6%A1%A5%E6%9D%AF/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%93%88%E5%B8%8C%E8%A1%A8/1.htm">哈希表</a><a class="tag" taget="_blank" href="/search/unordered_map/1.htm">unordered_map</a>
                        <div>问题描述小蓝是一个热爱阅读的年轻人,他有一个小型图书馆。为了能够管理他的书籍库存,他需要一个程序来记录图书的信息并执行两种操作:添加图书add和查找作者find。初始小蓝没有书,给出n个操作。add操作给出两个字符串bookname,author,表示添加的图书图书名和作者;find操作给出一个字符串author,你需要输出小蓝的图书馆里这个author有多少本图书。输入格式第一行一个整数n,表示</div>
                    </li>
                    <li><a href="/article/1902399101849366528.htm"
                           title="大模型相关网站整理" target="_blank">大模型相关网站整理</a>
                        <span class="text-muted">gorgor在码农</span>
<a class="tag" taget="_blank" href="/search/AI%E5%AE%9E%E6%88%98/1.htm">AI实战</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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>目录一:大模型开发网站1.开源模型平台2.私有化部署大模型3.LangChain中文网4.LangChain4j5.通过标准的OpenAIAPI格式访问所有的大模型二:国内AI大模型应用盘点聊天1、阿里云--通义千问2、科大讯飞--星火大模型园3、百度--文心一言4、字节跳动豆包5、智谱华章--智谱清言6、华为云园--盘古7、百川智能--百小应8、腾讯--腾讯元宝9、商汤--商量10、MiniMa</div>
                    </li>
                    <li><a href="/article/1902395318473912320.htm"
                           title="#Python 项目:实现功能——使用钉钉“自定义”机器人在群中发送文字消息" target="_blank">#Python 项目:实现功能——使用钉钉“自定义”机器人在群中发送文字消息</a>
                        <span class="text-muted">Window Unlock</span>
<a class="tag" taget="_blank" href="/search/%E9%92%89%E9%92%89/1.htm">钉钉</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">机器人</a>
                        <div>(目前还是新手,程序难免有废话代码,请大家耐心看__比心)第一步:创建群聊机器人,参考官方手册官方链接:自定义机器人的创建和安装-钉钉开放平台此步骤可以得到两个关键参数:Webhook(机器人的通信网址):https://oapi.dingtalk.com/robot/send?############(如这样)secret(加签未解密密钥):SECe2######################</div>
                    </li>
                    <li><a href="/article/1902394940302880768.htm"
                           title="Java 处理 json 格式数据解析为 csv 格式" target="_blank">Java 处理 json 格式数据解析为 csv 格式</a>
                        <span class="text-muted">李昊哲小课</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</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/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                        <div>Java处理json格式数据解析为csv格式如果不使用JSON工具库,你可以手动解析JSON格式字符串并将其转换为CSV格式字符串。以下是一个简单示例,展示如何实现这一功能。示例代码下面的示例代码手动处理JSON字符串,将其转换为CSV格式字符串:/***接收JSON字符串,去掉开头和结尾的方括号,按对象划分。*通过extractKeys方法提取字段名,添加到CSV的第一行。*逐项解析JSON对象</div>
                    </li>
                    <li><a href="/article/1902389643370885120.htm"
                           title="Apache Doris整合Iceberg + Flink CDC构建实时湖仓体的联邦查询分析架构" target="_blank">Apache Doris整合Iceberg + Flink CDC构建实时湖仓体的联邦查询分析架构</a>
                        <span class="text-muted">MfvShell</span>
<a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/Flink/1.htm">Flink</a>
                        <div>随着大数据技术的迅猛发展,构建实时湖仓体并进行联邦查询分析成为了许多企业的迫切需求。在这篇文章中,我们将探讨如何利用ApacheDoris整合Iceberg和FlinkCDC来构建这样一个架构,并提供相应的源代码示例。简介实时湖仓体是一种灵活、可扩展的数据架构,结合了数据湖和数据仓库的优势。ApacheDoris是一款开源的分布式SQL引擎,专注于实时分析和查询。Iceberg是一种开放式表格格式</div>
                    </li>
                    <li><a href="/article/1902389265258573824.htm"
                           title="类的创建 以及 类的继承及其应用对象" target="_blank">类的创建 以及 类的继承及其应用对象</a>
                        <span class="text-muted">烈焰猩猩</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>类的创建以及类的继承及其应用场景一,类的创建格式:格式1:class类名:pass格式2:class类名():pass格式3:#class类名(父类名):class类名(object):pass案例:案例需求定义老师类.实现思路定义老师类(三种方式).函数内容.创建该类对象.打印该类对象.#1.定义老师类(三种方式).#classTeacher:#classTeacher():classTeach</div>
                    </li>
                    <li><a href="/article/1902376902207795200.htm"
                           title="常见Linux指令详解:新手入门指南" target="_blank">常见Linux指令详解:新手入门指南</a>
                        <span class="text-muted">PS下载安装免费教程</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/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>一、文件和目录管理1.ls:列出目录内容功能:显示指定目录中的文件和文件夹。常用选项:-l:以详细列表形式显示-a:显示所有文件,包括隐藏文件-h:以人类可读的格式显示文件大小示例:ls-lh/home/user2.cd:改变当前工作目录功能:切换当前的工作目录。示例:cd/var/www3.mkdir:创建新目录功能:创建一个或多个新目录。示例:mkdirmy_projectmkdir-ppro</div>
                    </li>
                    <li><a href="/article/1902374886299463680.htm"
                           title="嵌入式C语言学习笔记(2)" target="_blank">嵌入式C语言学习笔记(2)</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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>1.数组指针数组指针本质上就是一个指针,它里面存放的是数组的首地址。#includevoidshow(int(*p)[4],intn){for(inti=0;i4*4=16;3.命令行传递参数,main函数的标准格式intmain(intargc,constchar*argv[]){return0;}//argc:参数的个数包括./a.out//argv:参数的值列表argv[0]="./a.ou</div>
                    </li>
                    <li><a href="/article/1902369844171436032.htm"
                           title="庖丁解牛:CANoe开发从入门到精通 4 - 1测量与分析窗口 Measurement Setup 2" target="_blank">庖丁解牛:CANoe开发从入门到精通 4 - 1测量与分析窗口 Measurement Setup 2</a>
                        <span class="text-muted">代码悟者:算法之外的智慧</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>庖丁解牛:CANoe开发从入门到精通4-1测量与分析窗口MeasurementSetup2第4章CANoe开发从入门到精通4-1测量与分析窗口2文章目录庖丁解牛:CANoe开发从入门到精通4-1测量与分析窗口MeasurementSetup2第4章CANoe开发从入门到精通4-1测量与分析窗口2前言日志文件设置前言目标:掌握测量分析窗口相关知识!口诀:慢慢来,干中学么!日志文件设置格式选择:BLF</div>
                    </li>
                    <li><a href="/article/1902367700227780608.htm"
                           title="从零实现B站视频下载器:Python自动化实战教程" target="_blank">从零实现B站视频下载器:Python自动化实战教程</a>
                        <span class="text-muted">木觞清</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一、项目背景与实现原理1.1B站视频分发机制Bilibili的视频采用音视频分离技术,通过以下方式提升用户体验:动态码率适配(1080P/4K/HDR)分段加载技术(基于M4S格式)内容保护机制(防盗链/签名验证)1.2技术实现路线graphTDA[模拟浏览器请求]-->B[获取加密播放信息]B-->C[解析音视频地址]C-->D[多线程下载]D-->E[FFmpeg合并]二、代码逐层解析2.1请</div>
                    </li>
                    <li><a href="/article/1902366817091907584.htm"
                           title="PyCINRAD读取探测中心天气雷达拼图系统v3产品" target="_blank">PyCINRAD读取探测中心天气雷达拼图系统v3产品</a>
                        <span class="text-muted">pysoer</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>PyCINRADPyCINRAD号称国内最强大的雷达数据处理工具,支持多种CINRAD雷达数据格式,兼容性强,横扫CMA雷达基数据和产品,国内首个支持“探测中心拼图3.0”。快速提取、计算雷达衍生产品,如组合反射率CR、回波顶高ET、降水粒子分类HCL等。作为一个开源项目,PyCINRAD对所有用户免费开放,鼓励社区贡献和改进。据悉已遍布CMA的各个系统角落。PyCINRAD官网https://p</div>
                    </li>
                    <li><a href="/article/1902364672351334400.htm"
                           title="This robot has a joint named “gripper_finger_joint“ which is not in the gazebo model." target="_blank">This robot has a joint named “gripper_finger_joint“ which is not in the gazebo model.</a>
                        <span class="text-muted">无码不欢的我</span>
<a class="tag" taget="_blank" href="/search/ROS/1.htm">ROS</a>
                        <div>在B站上看古月居的课《ROS机械臂开发:从入门到实战》,在运行第9节的代码时,出现如下报错:Thisrobothasajointnamed"gripper_finger_joint"whichisnotinthegazebomodel.本人所运行环境为:ubuntu版本:20.04ROS版本:noetic错误分析:xacro的宏调用格式错误,正确格式为或者为:...修改方法:1.找到probot_</div>
                    </li>
                    <li><a href="/article/1902364293693763584.htm"
                           title="chatgpt赋能python:Python处理雷达基数据:从入门到实践" target="_blank">chatgpt赋能python:Python处理雷达基数据:从入门到实践</a>
                        <span class="text-muted">lvsetongdao123</span>
<a class="tag" taget="_blank" href="/search/ChatGpt/1.htm">ChatGpt</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</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/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a>
                        <div>Python处理雷达基数据:从入门到实践随着气象技术的不断发展,雷达探测技术已成为当今天气预报和气象研究的主要手段之一。雷达基数据是气象雷达接收到的未经加工的原始数据,因其包含大量天气信息,不仅在天气预报、天气预警等方面得到了广泛应用,还被广泛地用于气象科研和大气环境研究。本文将介绍如何使用Python处理雷达基数据,解析其中的信息,获取有效的天气数据,以及分析和可视化这些数据。雷达基数据格式与处</div>
                    </li>
                    <li><a href="/article/1902363913199087616.htm"
                           title="微信小程序面试内容整理-图片优化" target="_blank">微信小程序面试内容整理-图片优化</a>
                        <span class="text-muted">不务正业的猿</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/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/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/notepad%2B%2B/1.htm">notepad++</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a>
                        <div>在微信小程序中,图片优化是提升加载速度、节省网络带宽和提高用户体验的重要步骤。图片通常是小程序页面中的主要资源,合理的图片优化能显著提高小程序的性能,尤其是在用户网络状况较差的情况下。1.选择合适的图片格式不同的图片格式有不同的特点,选择合适的格式能够有效减小图片的大小,同时保证图片质量。</div>
                    </li>
                    <li><a href="/article/1902362272978759680.htm"
                           title="AIGC时代品牌突围战:10招玩转DeepSeek内容推荐(深度扩展版)" target="_blank">AIGC时代品牌突围战:10招玩转DeepSeek内容推荐(深度扩展版)</a>
                        <span class="text-muted">白雪讲堂</span>
<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/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>一、认知革命:从SEO到GEO的生死迭代案例对比:传统SEO困境:某家电品牌2023年投入200万SEO优化,关键词排名TOP3但流量下降42%(SEMrush数据)GEO突破案例:某母婴品牌通过结构化数据改造,AI推荐量从日均300次飙升至1.2万次(来源:DeepSeek官方案例库)实战要点:内容形态改造:将产品参数表升级为JSON-LD格式(某手机品牌实现参数类问题100%引用)流量分配逻辑</div>
                    </li>
                    <li><a href="/article/1902361768223633408.htm"
                           title="PTA天梯赛PYthon7-10 树的遍历" target="_blank">PTA天梯赛PYthon7-10 树的遍历</a>
                        <span class="text-muted">胡同Alley</span>
<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/python/1.htm">python</a>
                        <div>给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:723157641234567输出样例:4163572代码长度限制</div>
                    </li>
                    <li><a href="/article/1902346175512637440.htm"
                           title="集团公司邮箱格式怎么写?" target="_blank">集团公司邮箱格式怎么写?</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/html%E5%AE%89%E5%85%A8/1.htm">html安全</a>
                        <div>在现代企业中,邮箱不仅是日常沟通的工具,更是企业形象的重要组成部分。尤其是对于集团公司来说,邮箱格式的规范性和专业性尤为重要,因为它直接影响外界对公司的第一印象。那么,集团公司邮箱的格式该如何设计?本文将从邮箱格式的重要性、常见格式设计、命名规则以及注意事项等方面为您一一解析。一、为什么集团公司邮箱格式如此重要?集团公司邮箱不仅是员工之间沟通的工具,也是对外展示企业文化和品牌形象的重要窗口。一个规</div>
                    </li>
                    <li><a href="/article/1902345541157711872.htm"
                           title="PDCA循环:从目标设定到持续改进的流程图" target="_blank">PDCA循环:从目标设定到持续改进的流程图</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">数据可视化</a>
                        <div>  通过图形天下的关系数据可视化,PDCA循环关系清晰地展现了从目标设定到改进措施的动态流程。通过计划制定、任务分解与资源配置,再到执行控制、监控调整,直至评估反馈,每个阶段紧密相连,形成持续优化的闭环。通过这种可视化方式,用户可以更容易地理解PDCA循环的本质,并应用到实际工作中去。                    PDCA循环图  PDCA循环,即计划(Plan)、执行(Do)、检查(C</div>
                    </li>
                    <li><a href="/article/1902336060298424320.htm"
                           title="飞书自定义机器人消息接入指南" target="_blank">飞书自定义机器人消息接入指南</a>
                        <span class="text-muted">师小师</span>
<a class="tag" taget="_blank" href="/search/%E9%A3%9E%E4%B9%A6/1.htm">飞书</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">机器人</a>
                        <div>操作流程第一步邀请自定义机器人入群:进入你的目标群组,打开会话设置,找到群机器人,并点击添加机器人,选择自定义机器人加入群聊。为机器人输入一个合适的名字和描述,也可以为机器人设置一个合适的头像,然后点击下一步。第二部:配置webhook获取该机器人的webhook地址,格式如下:https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxx</div>
                    </li>
                    <li><a href="/article/1902330384071323648.htm"
                           title="基于 Python 将 PDF 转 Markdown 并拆解为 JSON,支持自定义标题处理" target="_blank">基于 Python 将 PDF 转 Markdown 并拆解为 JSON,支持自定义标题处理</a>
                        <span class="text-muted">drebander</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a>
                        <div>在日常工作中,我们经常需要将PDF文件转换为可编辑、可结构化的数据格式,比如Markdown和JSON。但实际操作中,自动化工具往往会出现标题识别不准确的问题,尤其是PDF转换过程中,缺乏明确的标题标识。这篇文章将教你如何使用Python将PDF转换为Markdown,并通过自定义规则精准识别标题,最终将内容按标题结构拆解为JSON,方便后续快速检索与使用。1.实现目标将PDF文件转换为Markd</div>
                    </li>
                    <li><a href="/article/1902326220515766272.htm"
                           title="web端 -- RPC - 通用方案" target="_blank">web端 -- RPC - 通用方案</a>
                        <span class="text-muted">扁舟·TF</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                        <div>背景当一个目标站加密字段特别多,而且我们对其并不需要大规模爬取时,考虑到时间成本,我们就可以使用RPC来获取加密数据。原理:搭建一个后端服务器,然后在浏览器中hook加密函数,注册到web.js端中,最后通过client端来回调加密函数,实现rpc远程调用以上就是整个RPC获取加密数据的流程。自己封装了一个通用框架,使用时只需修改一个点就行:自定义client端的type自定义web端typecl</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>