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/1884473520507908096.htm"
                                 title="YOLOv8改进策略【Backbone/主干网络】| 替换骨干网络为2023-CVPR ConvNeXt V2 (附网络详解和完整配置步骤)" target="_blank">YOLOv8改进策略【Backbone/主干网络】| 替换骨干网络为2023-CVPR ConvNeXt V2 (附网络详解和完整配置步骤)</a>
                              <span class="text-muted">Limiiiing</span>
      <a class="tag" taget="_blank" href="/search/YOLOv8%E6%94%B9%E8%BF%9B%E4%B8%93%E6%A0%8F/1.htm">YOLOv8改进专栏</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</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%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a>
                              <div>一、本文介绍本文记录的是将ConvNeXtV2应用到YOLOv8中的改进方法研究。本文将ConvNeXtV2应用于YOLOv8,一方面利用全卷积掩码自动编码器在训练时优化特征学习,减少模型对大规模标注数据的依赖;另一方面,通过全局响应归一化层增强特征竞争,缓解特征坍塌问题,提高特征多样性。本文在YOLOv8的基础上配置了原论文中convnextv2_atto,convnextv2_femto,co</div>
                          </li>
                          <li><a href="/article/1884471504066899968.htm"
                                 title="反爬技术详解:守护数据的网络之盾" target="_blank">反爬技术详解:守护数据的网络之盾</a>
                              <span class="text-muted">MySheep.</span>
      <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E6%96%87%E7%AB%A0/1.htm">爬虫文章</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>随着互联网的快速发展,网络爬虫技术在数据采集和分析领域的应用越来越广泛。然而,爬虫行为也对网站服务器的稳定性、数据隐私及商业利益造成了威胁。为了应对这些挑战,反爬技术应运而生。本篇文章将详细介绍反爬技术的概念、常用方法以及实际应用场景。一、反爬技术的意义反爬技术旨在保护网站数据免遭未经授权的访问,同时维护服务器的性能与正常用户体验。通过阻止恶意爬虫的访问,网站可以:保护敏感数据:防止数据被非法采集</div>
                          </li>
                          <li><a href="/article/1884425421785722880.htm"
                                 title="Python 魔法学院 - 第03篇:Python 变量与数据类型 ⭐" target="_blank">Python 魔法学院 - 第03篇:Python 变量与数据类型 ⭐</a>
                              <span class="text-muted">码力全開</span>
      <a class="tag" taget="_blank" href="/search/%E3%80%8APython/1.htm">《Python</a><a class="tag" taget="_blank" href="/search/%E9%AD%94%E6%B3%95%E5%AD%A6%E9%99%A2%E3%80%8B/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/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a>
                              <div>目录1.引言:开启Python变量与数据类型的魔法之旅2.变量:数据的魔法标签️2.1什么是变量?2.2变量的命名规则3.数据类型:Python的魔法工具箱3.1数据类型示例3.2数据类型的内存结构内存结构模拟4.Python中的关键字和保留字5.Python可变类型及其方法详解️5.1列表(List)5.1.1列表的创建5.1.2列表的常用方法5.1.3列表方法的使用示例及内存模拟5.2集合(S</div>
                          </li>
                          <li><a href="/article/1884424791386025984.htm"
                                 title="通义千问 Qwen2-VL-2B:技术架构、核心原理、微调操作与场景应用详解" target="_blank">通义千问 Qwen2-VL-2B:技术架构、核心原理、微调操作与场景应用详解</a>
                              <span class="text-muted">zhangjiaofa</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/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE/1.htm">通义千问</a><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/%E5%A4%9A%E6%A8%A1%E6%80%81/1.htm">多模态</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83/1.htm">模型微调</a>
                              <div>通义千问Qwen2-VL-2B:技术架构、核心原理、微调操作与场景应用详解引言近年来,多模态大模型在人工智能领域取得了显著进展,尤其是在视觉语言理解(Vision-LanguageUnderstanding,VL)方面。阿里云通义千问团队推出的Qwen2-VL-2B模型,作为Qwen2-VL系列中的轻量级版本,凭借其高效的计算性能和强大的多模态处理能力,成为开源社区和工业界关注的焦点。本文将深入解</div>
                          </li>
                          <li><a href="/article/1884417595575169024.htm"
                                 title="【C++】设计模式详解:单例模式" target="_blank">【C++】设计模式详解:单例模式</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/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a>
                              <div>文章目录Ⅰ.设计一个类,不允许被拷贝Ⅱ.请设计一个类,只能在堆上创建对象Ⅲ.请设计一个类,只能在栈上创建对象Ⅳ.请设计一个类,不能被继承Ⅴ.请设计一个类,只能创建一个对象(单例模式)单例模式:1、饿汉模式2、懒汉模式第一种写法:第二种写法:Ⅰ.设计一个类,不允许被拷贝拷贝只会发生在两个场景中:拷贝构造函数、赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即</div>
                          </li>
                          <li><a href="/article/1884415957753982976.htm"
                                 title="python 中serial.read用法详解之serial.read(inwaiting or 1)" target="_blank">python 中serial.read用法详解之serial.read(inwaiting or 1)</a>
                              <span class="text-muted">huiyuanzhenduo</span>
      <a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                              <div>在Python中,serial.read(inwaitingor1)是pyserial库中用于从串口读取数据的代码片段,下面是详细解释:read()serial类的方法,用于从串口缓冲区读取指定数量的字节数据。格式为read(size),size为读取的字节数。inwaiting是serial类的属性,返回串口输入缓冲区中等待读取的字节数。如ser.inwaiting()可获取当前缓冲区字节数。i</div>
                          </li>
                          <li><a href="/article/1884405866304696320.htm"
                                 title="uniapp - [全端兼容] 实现精美Editor富文本编辑器功能,uniApp全平台兼容的富文本插件组件用户可上传图片及对接服务器存储文件等,手机移动端H5网页富文本/小程序富文本/App富文本!" target="_blank">uniapp - [全端兼容] 实现精美Editor富文本编辑器功能,uniApp全平台兼容的富文本插件组件用户可上传图片及对接服务器存储文件等,手机移动端H5网页富文本/小程序富文本/App富文本!</a>
                              <span class="text-muted">王二红</span>
      <a class="tag" taget="_blank" href="/search/%2B/1.htm">+</a><a class="tag" taget="_blank" href="/search/UniApp/1.htm">UniApp</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E5%AF%8C%E6%96%87%E6%9C%AC/1.htm">富文本</a><a class="tag" taget="_blank" href="/search/%E4%BD%BF%E7%94%A8%E5%AF%8C%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8%E6%8F%92%E5%85%A5%E5%9B%BE%E7%89%87%E5%9B%BE%E5%83%8F/1.htm">使用富文本编辑器插入图片图像</a><a class="tag" taget="_blank" href="/search/uni-app%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%AF%8C%E6%96%87%E6%9C%AC/1.htm">uni-app微信小程序富文本</a><a class="tag" taget="_blank" href="/search/uniapp%E7%BD%91%E9%A1%B5h5%E7%AB%AF%E5%AF%8C%E6%96%87%E6%9C%AC/1.htm">uniapp网页h5端富文本</a><a class="tag" taget="_blank" href="/search/uniap%E5%AE%89%E5%8D%93%E8%8B%B9%E6%9E%9Capp%E5%AF%8C%E6%96%87%E6%9C%AC/1.htm">uniap安卓苹果app富文本</a><a class="tag" taget="_blank" href="/search/%E5%AF%8C%E6%96%87%E6%9C%AC%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%8F%8A%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BF%9D%E5%AD%98/1.htm">富文本上传图片及服务器保存</a>
                              <div>前言网上的教程乱七八糟且兼容性太差,本文提供优质示例。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)开发中,详解引入使用富文本编辑器及图片上传显示等功能,用户可上传图片显示和服务器保存回显效果(插入图片),uniApp各平台都兼容的富文本editor插件,自定义富文本按钮功能及自由排版样式布局,uniapp富文本组件插件用于发布文章/发布资讯公告/</div>
                          </li>
                          <li><a href="/article/1884405231794581504.htm"
                                 title="小程序webview打开小程序原生页面_详解如何探测小程序返回到webview页面" target="_blank">小程序webview打开小程序原生页面_详解如何探测小程序返回到webview页面</a>
                              <span class="text-muted">weixin_39905624</span>
      
                              <div>在公司项目中经常会遇到一个场景,尝试过各种不同的方法,最后想到了一种很技术上简单且可行的方法.经常被QA同学反应同一类型的问题项目是小程序(wepy),部分页面使用webview(vue).经常会遇见一个场景:当小程序navigateTo到一些页面对用户的"收藏状态","身材细节"做了修改后,用户点击返回按钮回到上一个页面,收藏的状态或是身材细节没有改变.那是当然的,作为一个小程序中的webvie</div>
                          </li>
                          <li><a href="/article/1884401950372458496.htm"
                                 title="Java并发编程,AQS详解" target="_blank">Java并发编程,AQS详解</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a>
                              <div>AbstractQueuedSynchronizer(简称AQS)是Java并发包中一个非常重要的同步框架,它为实现锁和其他同步器提供了一种标准化的方法。AQS通过内部的状态管理、FIFO队列以及对线程调度的支持,简化了锁的实现过程。许多标准库中的同步工具(如ReentrantLock、Semaphore和CountDownLatch)都是基于AQS实现的。一、AQS的基本原理1.概念AQS是一个</div>
                          </li>
                          <li><a href="/article/1884396396472233984.htm"
                                 title="【Uniapp-Vue3】request各种不同类型的参数详解" target="_blank">【Uniapp-Vue3】request各种不同类型的参数详解</a>
                              <span class="text-muted">永久旅途</span>
      <a class="tag" taget="_blank" href="/search/Uniapp/1.htm">Uniapp</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                              <div>一、参数携带我们调用该接口的时候需要传入type参数。第一种路径名称?参数名1=参数值1&参数名2=参数值2第二种uni.request({url:"请求路径",data:{参数名:参数值}})二、请求方式常用的有get,post和put三种,默认是get请求。uni.request({url:"请求路径",method:"方式"})三、请求头配置uni.request({url:"请求路径",h</div>
                          </li>
                          <li><a href="/article/1884389206285938688.htm"
                                 title="Python SQLAlchemy库详解" target="_blank">Python SQLAlchemy库详解</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/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/%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%E6%B5%8B%E8%AF%95/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%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/1.htm">自动化测试</a>
                              <div>大家好,在Python生态系统中,SQLAlchemy库是一个强大的工具,为开发人员提供了便捷的方式来处理与数据库的交互。无论是开发一个小型的Web应用程序,还是构建一个大型的企业级系统,SQLAlchemy都能满足你的需求,并提供灵活性和性能上的优势。本文将带你深入探索SQLAlchemy库,从基础概念到高级用法,让你对其有一个全面的了解。一、介绍SQLAlchemy是Python中一个强大的开</div>
                          </li>
                          <li><a href="/article/1884387692888780800.htm"
                                 title="Flask教程5:flask数据库SQLAlchemy" target="_blank">Flask教程5:flask数据库SQLAlchemy</a>
                              <span class="text-muted">Cachel wood</span>
      <a class="tag" taget="_blank" href="/search/Flask%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/1.htm">Flask入门教程</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/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/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/LLM/1.htm">LLM</a>
                              <div>文章目录SQLAlchemy为什么使用ORM初始化数据库配置表模型的定义与数据库映射数据的增、删、改、查操作数据的添加数据的查找数据的修改数据的删除init_app作用详解SQLAlchemySQLAlchemy是一个基于Python实现的ORM(ObjectRelationalMapping,对象关系映射)框架。该框架建立在DBAPI(数据库应用程序接口系统)之上,使用关系对象映射进行数据库操作</div>
                          </li>
                          <li><a href="/article/1884373948754358272.htm"
                                 title="python【数据结构与算法】最长公共子串详解(附代码)" target="_blank">python【数据结构与算法】最长公共子串详解(附代码)</a>
                              <span class="text-muted">理想不闪火</span>
      <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                              <div>文章目录1定义1定义和最长公共子序列一样,使用动态规划的算法。下一步就要找到状态之间的转换方程。和LCS问题唯一不同的地方在于当A[i]!=B[j]时,res[i][j]就直接等于0了,因为子串必须连续,且res[i</div>
                          </li>
                          <li><a href="/article/1884369789162418176.htm"
                                 title="C/C++ 已排序的链表中删除重复项算法详解及源码" target="_blank">C/C++ 已排序的链表中删除重复项算法详解及源码</a>
                              <span class="text-muted">猿来如此yyy</span>
      <a class="tag" taget="_blank" href="/search/C%2FC%2B%2B%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3%E5%8F%8A%E6%BA%90%E7%A0%81/1.htm">C/C++算法详解及源码</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</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/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F%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>
                              <div>已排序的链表中删除重复项的算法可以通过遍历链表的方式实现。具体步骤如下:初始化一个指针cur,指向链表的头节点。遍历链表,如果当前节点的值和下一个节点的值相同,则删除下一个节点,并将当前节点的next指针指向下一个节点的next指针,即将当前节点与下一个节点的重复项跳过。如果当前节点的值和下一个节点的值不同,则将指针cur指向下一个节点。优点:时间复杂度为O(n),其中n为链表的长度,算法只需要一</div>
                          </li>
                          <li><a href="/article/1884355656547364864.htm"
                                 title="Electron 框架详解与最新动态" target="_blank">Electron 框架详解与最新动态</a>
                              <span class="text-muted">海豹工匠</span>
      <a class="tag" taget="_blank" href="/search/electron/1.htm">electron</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>什么是Electron?Electron是由GitHub开发并维护的一个开源框架,旨在使用Web技术(如HTML、CSS和JavaScript)来构建跨平台的桌面应用程序。它嵌入了Chromium和Node.js,使开发者能够使用这些Web技术在桌面环境中构建应用。Electron的核心优势在于其跨平台兼容性,允许开发者编写一次代码,运行在Windows、macOS和Linux平台上。常见的基于E</div>
                          </li>
                          <li><a href="/article/1884345188751568896.htm"
                                 title="数据库性能优化(sql优化)_索引详解04_深入理解B+树_yxy)" target="_blank">数据库性能优化(sql优化)_索引详解04_深入理解B+树_yxy)</a>
                              <span class="text-muted">yxy___</span>
      <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a>
                              <div>数据库性能优化_深入理解B+树1通过代码方式解释B+树1.1查找操作1.2插入操作1.3删除操作1.4更新操作2组合索引的查找逻辑2.1等值查找2.1范围查找1通过代码方式解释B+树B树索引在增删改操作时,底层结构会发生相应的变化,以保持树的平衡和有序性。下面通过简单的伪代码来讲解增删改查时,B+树的底层结构变化(目的是为了让大家深入理解B+树)1.1查找操作思路:1.从根节点开始查找。2.对于每</div>
                          </li>
                          <li><a href="/article/1884345062280720384.htm"
                                 title="数据库性能优化(sql优化)_SQL执行计划01_yxy" target="_blank">数据库性能优化(sql优化)_SQL执行计划01_yxy</a>
                              <span class="text-muted">yxy___</span>
      <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a>
                              <div>数据库性能优化_SQL执行计划详解011执行计划简介1.1什么是sql执行计划?1.2执行计划解决了什么问题?1.3总结2执行计划的查看方式3执行计划完整示例4执行计划组成部份1执行计划简介1.1什么是sql执行计划?执行计划(ExecutionPlan),也称为查询计划或解释计划,是数据库在执行一个查询语句(如SQL查询)之前制定的详细步骤指南,包括使用哪些索引、连接顺序、操作顺序等信息。是一条</div>
                          </li>
                          <li><a href="/article/1884339887843373056.htm"
                                 title="【elasticsearch】reindex 操作将索引的数据复制到另一个索引" target="_blank">【elasticsearch】reindex 操作将索引的数据复制到另一个索引</a>
                              <span class="text-muted">infiniteWei</span>
      <a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a>
                              <div>在Elasticsearch中,reindex操作用于将一个索引的数据复制到另一个索引。常用的reindex命令有很多细节,下面是一些常见用法和命令详解:基本命令基础Reindex命令POST/_reindex{"source":{"index":"source_index"},"dest":{"index":"destination_index"}}source:需要复制数据的源索引。dest:</div>
                          </li>
                          <li><a href="/article/1884331314811826176.htm"
                                 title="微服务网关springcloud gateway整合nacos实现动态路由" target="_blank">微服务网关springcloud gateway整合nacos实现动态路由</a>
                              <span class="text-muted">程序猿20</span>
      <a class="tag" taget="_blank" href="/search/nacos/1.htm">nacos</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/springcloud/1.htm">springcloud</a><a class="tag" taget="_blank" href="/search/gateway/1.htm">gateway</a><a class="tag" taget="_blank" href="/search/nacos/1.htm">nacos</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a>
                              <div>1.添加依赖com.alibaba.cloudspring-cloud-starter-alibaba-nacos-config2.添加配置spring:cloud:nacos:config:#配置中心地址server-addr:127.0.0.1:8848#配置文件格式file-extension:ymlusername:password:3.定义读取配置和监听类packagecom.demo.</div>
                          </li>
                          <li><a href="/article/1884329791428030464.htm"
                                 title="ESP32内存管理详解:从基础到进阶" target="_blank">ESP32内存管理详解:从基础到进阶</a>
                              <span class="text-muted">又吹风_Bassy</span>
      <a class="tag" taget="_blank" href="/search/ESP32/1.htm">ESP32</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/1.htm">内存管理</a><a class="tag" taget="_blank" href="/search/PSRAM/1.htm">PSRAM</a><a class="tag" taget="_blank" href="/search/DRAM/1.htm">DRAM</a><a class="tag" taget="_blank" href="/search/FLASH/1.htm">FLASH</a>
                              <div>最近在学习ESP32,下面整理了一些存储和内存相关知识点。ESP32作为一款功能强大的物联网芯片,广泛应用于各种嵌入式开发场景。有效管理ESP32的内存资源,对于提升应用性能和系统稳定性至关重要。本文将系统性地介绍ESP32的内存架构、存储硬件知识、内存分配机制、常见内存问题及解决方案,帮助新手开发者全面掌握ESP32的内存管理。一、内存系统概览1.1ESP32内存架构ESP32的内存架构复杂而灵</div>
                          </li>
                          <li><a href="/article/1884329665041068032.htm"
                                 title="色度采样(4:4:4、4:2:2、4:2:0、4:1:1)详解" target="_blank">色度采样(4:4:4、4:2:2、4:2:0、4:1:1)详解</a>
                              <span class="text-muted">又吹风_Bassy</span>
      <a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%8E%8B%E7%BC%A9%E6%8A%80%E6%9C%AF/1.htm">视频压缩技术</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/1.htm">图像处理</a><a class="tag" taget="_blank" href="/search/%E8%89%B2%E5%BA%A6%E9%87%87%E6%A0%B7/1.htm">色度采样</a><a class="tag" taget="_blank" href="/search/YUV%E9%A2%9C%E8%89%B2%E7%A9%BA%E9%97%B4/1.htm">YUV颜色空间</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81%E6%A0%87%E5%87%86/1.htm">视频编码标准</a>
                              <div>色度采样(4:4:4、4:2:2、4:2:0、4:1:1)详解色度采样概述色度采样(ChromaSubsampling)是一种在图像和视频处理中,通过减少色度分量(U、V)的采样量来压缩数据的技术。它利用了人眼对亮度(Luma,Y)比色度(Chroma,U/V)更加敏感的特性,从而在不明显影响视觉效果的前提下,显著降低数据量。在YUV颜色空间中,Y表示亮度,U和V表示色度分量。通过减少U和V的采样</div>
                          </li>
                          <li><a href="/article/1884325125130612736.htm"
                                 title="MyBatis技术详解与实战" target="_blank">MyBatis技术详解与实战</a>
                              <span class="text-muted">小码快撩</span>
      <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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                              <div>引言MyBatis是一款优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作,使开发者能更专注于对业务逻辑的实现。本文将详细介绍MyBatis的核心概念,并通过示例代码进行深入讲解。一、配置文件MyBatis配置文件(通常命名为mybatis-config.xml)是MyBatis框架的核心配置文件,它定义</div>
                          </li>
                          <li><a href="/article/1884308864292155392.htm"
                                 title="滚雪球学Oracle[1.2讲]:Oracle数据库架构基础" target="_blank">滚雪球学Oracle[1.2讲]:Oracle数据库架构基础</a>
                              <span class="text-muted">bug菌¹</span>
      <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%BB%9A%E9%9B%AA%E7%90%83%E5%AD%A6Oracle/1.htm">滚雪球学Oracle</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9E%B6%E6%9E%84/1.htm">数据库架构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                              <div>全文目录:前言一、Oracle数据库的物理存储结构详解1.1数据文件的组成与管理数据文件的主要特点:实际操作案例:添加数据文件数据文件管理的优化策略:1.2控制文件的作用与保护策略控制文件的主要作用:控制文件的保护策略:1.3重做日志文件的配置与优化重做日志文件的主要作用:重做日志文件的配置:实际操作案例:查看当前的重做日志组状态二、Oracle数据库的逻辑存储结构详解2.1表空间的类型与管理表空</div>
                          </li>
                          <li><a href="/article/1884305200118820864.htm"
                                 title="python中全局变量和局部变量详解_Python局部变量与全局变量区别原理解析" target="_blank">python中全局变量和局部变量详解_Python局部变量与全局变量区别原理解析</a>
                              <span class="text-muted">weixin_39998795</span>
      
                              <div>1、局部变量name="YangLi"defchange_name(name):print("beforechange:",name)name="你好"print("afterchange",name)change_name(name)print("在外面看看name改了么?",name)输出:beforechange:YangLiafterchange你好在外面看看name改了么?YangLi2</div>
                          </li>
                          <li><a href="/article/1884304438600986624.htm"
                                 title="C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库" target="_blank">C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库</a>
                              <span class="text-muted">weixin_30777913</span>
      <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</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%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/1.htm">数据仓库</a><a class="tag" taget="_blank" href="/search/sqlserver/1.htm">sqlserver</a>
                              <div>用C++实现高性能数据处理,Python实现操作Redshift导入数据文件。在VisualStudio2022中用C++和ODBCAPI导出SQLServer数据库中张表中的所有表的数据为CSV文件格式的数据流,用逗号作为分隔符,用双引号包裹每个数据,字符串类型的数据去掉前后的空格,数据中如果包含双引号,则将一个双引号替换为两个双引号,创建gzip压缩文件,输出数据流写入到gzip压缩文件包中的</div>
                          </li>
                          <li><a href="/article/1884304312272744448.htm"
                                 title="Windows平台下使用DirectX实现的飞行射击游戏详解" target="_blank">Windows平台下使用DirectX实现的飞行射击游戏详解</a>
                              <span class="text-muted">不胖的羊</span>
      
                              <div>本文还有配套的精品资源,点击获取简介:本文深入解析了一款在Windows平台上利用DirectX技术实现的飞行射击游戏“打飞机大战”。文章涵盖了Windows编程基础、DirectX技术的应用,以及游戏开发中使用的各种技术细节,如实时3D渲染、事件驱动编程、动画和物理模拟、声音处理以及性能优化等。通过这个项目,展示了Windows编程结合DirectX创造游戏的无限可能。1.Windows编程基础</div>
                          </li>
                          <li><a href="/article/1884293213301305344.htm"
                                 title="(基础)Python实现定时任务的八种方案详解" target="_blank">(基础)Python实现定时任务的八种方案详解</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                              <div>在日常工作中,我们常常会用到需要周期性执行的任务,我们可以用Python直接实现这一功能。今天我们来学习一下这些基本的操作,有需要了解更多关于python相关知识的,免费领取资源的,请点击这个链接。目录利用whileTrue:+sleep()实现定时任务使用Timeloop库运行定时任务利用threading.Timer实现定时任务利用内置模块sched实现定时任务利用调度模块schedule实现</div>
                          </li>
                          <li><a href="/article/1884285394560806912.htm"
                                 title="区别Mp3、AAC、WAV 、MWA这些音频文件" target="_blank">区别Mp3、AAC、WAV 、MWA这些音频文件</a>
                              <span class="text-muted">晓北斗NorSnow</span>
      <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E5%AA%92%E4%BD%93%E8%80%83%E8%AF%95/1.htm">多媒体考试</a><a class="tag" taget="_blank" href="/search/aac/1.htm">aac</a>
                              <div>同学,MP3、AAC、WAV、WMA这些音频文件格式各有其特点和适用场景,下面我来为你详细解释一下它们的区别:MP3特点:MP3是一种广泛使用的音频压缩技术,它能够在音质丢失很小的情况下将音频文件压缩到更小的程度。MP3格式具有广泛的兼容性、网络传输便利性以及多样化的应用场景等特点,是全球范围内最受欢迎和应用最广的音频文件格式之一。音质与文件大小:MP3格式通过压缩音频数据来减小文件大小,同时保持</div>
                          </li>
                          <li><a href="/article/1884268492153221120.htm"
                                 title="【大模型应用开发 动手做AI Agent】LlamaIndex和基于RAG的AI开发" target="_blank">【大模型应用开发 动手做AI Agent】LlamaIndex和基于RAG的AI开发</a>
                              <span class="text-muted">AI天才研究院</span>
      <a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/1.htm">AI大模型企业级应用开发实战</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AEAI%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">大数据AI人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E7%A7%91%E5%AD%A6/1.htm">计算科学</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E8%AE%A1%E7%AE%97/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/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/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/%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%E5%9E%8B%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">大型语言模型</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/AGI/1.htm">AGI</a><a class="tag" taget="_blank" href="/search/LLM/1.htm">LLM</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">架构设计</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/RPA/1.htm">RPA</a>
                              <div>文章目录【大模型应用开发动手做AIAgent】LlamaIndex和基于RAG的AI开发1.背景介绍1.1问题的由来1.2研究现状1.3研究意义1.4本文结构2.核心概念与联系LlamaIndexRAG联系3.核心算法原理&具体操作步骤3.1算法原理概述LlamaIndexRAG3.2算法步骤详解LlamaIndexRAG3.3算法优缺点LlamaIndexRAG3.4算法应用领域4.数学模型和公</div>
                          </li>
                          <li><a href="/article/1884252863190855680.htm"
                                 title="Java基础入门3《IDEA使用与数据类型详解》" target="_blank">Java基础入门3《IDEA使用与数据类型详解》</a>
                              <span class="text-muted">圆圆Alice</span>
      <a class="tag" taget="_blank" href="/search/Alice%E7%9A%84Java%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Alice的Java学习笔记</a><a class="tag" taget="_blank" href="/search/intellij/1.htm">intellij</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                              <div>Hi,我又出现了,是Alice,今天我学习的是,刚刚入门,肯定是先搞定各种开发工具,还一些理解性的内容,视频来源于‘蓝桥研究院’.....本节笔记重点提要:本节笔记重点提要:1.IntellijIdea下载与安装2.IntellijIdea使用3.使用IntellijIdea打印一个界面(案列)4.变量5.Java的数据类型、数据范围、符号的意义——————————————————————————</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>