FFmpeg入门详解之105: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 的文件格式主要包含三方面内容:

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

m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。

m3u8 文件的每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素。

m3u8 文件中以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。

属性列表(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进行隔离的两个十进制整型数。第一个整型表示水平宽度大小,第二个整型数表示垂直方向高度大小(单位:像素)。

标签:标签用于指定 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:,[]</p> <p>其中:</p> <p></p> <p>duration:可以为十进制的整型或者浮点型,其值必须小于或等于 EXT-X-TARGETDURATION 指定的值。</p> <p>注:建议始终使用浮点型指定时长,这可以让客户端在定位流时,减少四舍五入错误。但是如果兼容版本号 EXT-X-VERSION 小于 3,那么必须使用整型。</p> <p>EXT-X-BYTERANGE:该标签表示接下来的切片资源是其后 URI 指定的媒体片段资源的局部范围(即截取 URI 媒体资源部分内容作为下一个切片)。该标签只对其后一个 URI 起作用。其格式为:</p> <p></p> <p>#EXT-X-BYTERANGE:<n>[@<o>]</p> <p>其中:</p> <p></p> <p>n是一个十进制整型,表示截取片段大小(单位:字节)。</p> <p>可选参数o也是一个十进制整型,指示截取起始位置(以字节表示,在 URI 指定的资源开头移动该字节位置后进行截取)。</p> <p>如果o未指定,则截取起始位置从上一个该标签截取完成的下一个字节(即上一个n+o+1)开始截取。</p> <p>如果没有指定该标签,则表明的切分范围为整个 URI 资源片段。</p> <p>注:使用 EXT-X-BYTERANGE 标签要求兼容版本号 EXT-X-VERSION 大于等于 4。</p> <p>EXT-X-DISCONTINUITY:该标签表明其前一个切片与下一个切片之间存在中断。其格式为:</p> <p></p> <p>#EXT-X-DISCONTINUITY</p> <p>当以下任一情况变化时,必须使用该标签:</p> <p></p> <h3>文件格式(file format)</h3> <p>数字(number),类型(type),媒体标识符(identifiers of tracks)</p> <p>时间戳序列(timestamp sequence)</p> <p>当以下任一情况变化时,应当使用该标签:</p> <p></p> <h3>编码参数(encoding parameters)</h3> <p>编码序列(encoding sequence)</p> <p>注:EXT-X-DISCONTINUITY 的一个经典使用场景就是在视屏流中插入广告,由于视屏流与广告视屏流不是同一份资源,因此在这两种流切换时使用 EXT-X-DISCONTINUITY 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。</p> <p>更多详细内容,请查看:Incorporating Ads into a Playlist</p> <p></p> <p><strong>EXT-X-KEY:媒体片段可以进行加密,</strong>而该标签可以指定解密方法。</p> <p>该标签对所有 媒体片段 和 由标签 EXT-X-MAP 声明的围绕其间的所有 媒体初始化块(Meida Initialization Section) 都起作用,直到遇到下一个 EXT-X-KEY(若 m3u8 文件只有一个 EXT-X-KEY 标签,则其作用于所有媒体片段)。</p> <p>多个 EXT-X-KEY 标签如果最终生成的是同样的秘钥,则他们都可作用于同一个媒体片段。</p> <p>该标签使用格式为:</p> <p></p> <p>#EXT-X-KEY:<attribute-list></p> <p>属性列表可以包含如下几个键:</p> <p></p> <p>METHOD:该值是一个可枚举的字符串,指定了加密方法。</p> <p>该键是必须参数。其值可为NONE,AES-128,SAMPLE-AES当中的一个。</p> <p>其中:</p> <p>NONE:表示切片未进行加密(此时其他属性不能出现);</p> <p>AES-128:表示表示使用 AES-128 进行加密。</p> <p>SAMPLE-AES:意味着媒体片段当中包含样本媒体,比如音频或视频,它们使用 AES-128 进行加密。这种情况下 IV 属性可以出现也可以不出现。</p> <p></p> <p>URI:指定密钥路径。</p> <p>该密钥是一个 16 字节的数据。</p> <p>该键是必须参数,除非 METHOD 为NONE。</p> <p></p> <p>IV:该值是一个 128 位的十六进制数值。</p> <p>AES-128 要求使用相同的 16字节 IV 值进行加密和解密。使用不同的 IV 值可以增强密码强度。</p> <p>如果属性列表出现 IV,则使用该值;如果未出现,则默认使用媒体片段序列号(即 EXT-X-MEDIA-SEQUENCE)作为其 IV 值,使用大端字节序,往左填充 0 直到序列号满足 16 字节(128 位)。</p> <p></p> <p>KEYFORMAT:由双引号包裹的字符串,标识密钥在密钥文件中的存储方式(密钥文件中的 AES-128 密钥是以二进制方式存储的16个字节的密钥)。</p> <p>该属性为可选参数,其默认值为"identity"。</p> <p>使用该属性要求兼容版本号 EXT-X-VERSION 大于等于 5。</p> <p></p> <p>KEYFORMATVERSIONS:由一个或多个被/分割的正整型数值构成的带引号的字符串(比如:"1","1/2","1/2/5")。</p> <p>如果有一个或多特定的 KEYFORMT 版本被定义了,则可使用该属性指示具体版本进行编译。</p> <p>该属性为可选参数,其默认值为"1"。</p> <p>使用该属性要求兼容版本号 EXT-X-VERSION 大于等于 5。</p> <p></p> <p>EXT-X-MAP:该标签指明了获取媒体初始化块(Meida Initialization Section)的方法。</p> <p>该标签对其后所有媒体片段生效,直至遇到另一个 EXT-X-MAP 标签。</p> <p>其格式为:</p> <p></p> <h3>#EXT-X-MAP:<attribute-list></h3> <p>其属性列表取值范围如下:</p> <p></p> <p>URI:由引号包裹的字符串,指定了包含媒体初始化块的资源的路径。该属性为必选参数。</p> <p></p> <p>BYTERANGE:由引号包裹的字符串,指定了媒体初始化块在 URI 指定的资源的位置(片段)。</p> <p>该属性指定的范围应当只包含媒体初始化块。</p> <p>该属性为可选参数,如果未指定,则表示 URI 指定的资源就是全部的媒体初始化块。</p> <p></p> <p>EXT-X-PROGRAM-DATE-TIME:该标签使用一个绝对日期/时间表明第一个样本片段的取样时间。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-PROGRAM-DATE-TIME:<date-time-msec></p> <p>其中,date-time-msec是一个 ISO/IEC 8601:2004 规定的日期格式,形如:YYYY-MM-DDThh:mm:ss.SSSZ。</p> <p></p> <p>EXT-X-DATERANGE:该标签定义了一系列由属性/值对组成的日期范围。</p> <p>其格式为:</p> <p></p> <h3>#EXT-X-DATERANGE:<attribute-list></h3> <p>其属性列表取值如下:</p> <p></p> <p>ID:双引号包裹的唯一指明日期范围的标识。</p> <p>该属性为必选参数。</p> <p></p> <p>CLASS:双引号包裹的由客户定义的一系列属性与与之对应的语意值。</p> <p>所有拥有同一 CLASS 属性的日期范围必须遵守对应的语意。</p> <p>该属性为可选参数。</p> <p></p> <p>START-DATE:双引号包裹的日期范围起始值。</p> <p>该属性为必选参数。</p> <p></p> <p>END-DATE:双引号包裹的日期范围结束值。</p> <p>该属性值必须大于或等于 START-DATE。</p> <p>该属性为可选参数。</p> <p></p> <p>DURATION:日期范围的持续时间是一个十进制浮点型数值类型(单位:秒)。</p> <p>该属性值不能为负数。</p> <p>当表达立即时间时,将该属性值设为 0 即可。</p> <p>该属性为可选参数。</p> <p></p> <p>PLANNED-DURATION:该属性为日期范围的期望持续时长。</p> <p>其值为一个十进制浮点数值类型(单位:秒)。</p> <p>该属性值不能为负数。</p> <p>在预先无法得知真实持续时长的情况下,可使用该属性作为日期范围的期望预估时长。</p> <p>该属性为可选参数。</p> <p></p> <p>X-<client-attribute>:X-前缀是预留给客户端自定义属性的命名空间。</p> <p>客户端自定义属性名时,应当使用反向 DNS(reverse-DNS)语法来避免冲突。</p> <p>自定义属性值必须是使用双引号包裹的字符串,或者是十六进制序列,或者是十进制浮点数,比如:X-COM-EXAMPLE-AD-ID="XYZ123"。</p> <p>该属性为可选参数。</p> <p></p> <p>SCTE35-CMD, SCTE35-OUT, SCTE35-IN:用于携带 SCET-35 数据。</p> <p>该属性为可选参数。</p> <p></p> <p>END-ON-NEXT:该属性值为一个可枚举字符串,其值必须为YES。</p> <p>该属性表明达到该范围末尾,也即等于后续范围的起始位置 START-DATE。后续范围是指具有相同 CLASS 的,在该标签 START-DATE 之后的具有最早 START-DATE 值的日期范围。</p> <p>该属性时可选参数。</p> <p></p> <p>媒体播放列表类型标签:媒体播放列表标签为 m3u8 文件的全局参数信息。</p> <p>这些标签只能在 m3u8 文件中至多出现一次。</p> <p>媒体播放列表(Media Playlist)标签不能出现在主播放列表(Master Playlist)中。</p> <p>媒体播放列表具体标签如下所示:</p> <p></p> <p>EXT-X-TARGETDURATION:表示每个视频分段最大的时长(单位秒)。</p> <p>该标签为必选标签。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-TARGETDURATION:<s></p> <p>其中:参数s表示目标时长(单位:秒)。</p> <p></p> <p>EXT-X-MEDIA-SEQUENCE:表示播放列表第一个 URL 片段文件的序列号。</p> <p>每个媒体片段 URL 都拥有一个唯一的整型序列号。</p> <p>每个媒体片段序列号按出现顺序依次加 1。</p> <p>如果该标签未指定,则默认序列号从 0 开始。</p> <p>媒体片段序列号与片段文件名无关。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-MEDIA-SEQUENCE:<number></p> <p>其中:参数number即为切片序列号。</p> <p></p> <p>EXT-X-DISCONTINUITY-SEQUENCE:该标签使能同步相同流的不同 Rendition 和 具备 EXT-X-DISCONTINUITY 标签的不同备份流。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-DISCONTINUITY-SEQUENCE:<number></p> <p>其中:参数number为一个十进制整型数值。</p> <p>如果播放列表未设置 EXT-X-DISCONTINUITY-SEQUENCE 标签,那么对于第一个切片的中断序列号应当为 0。</p> <p></p> <p>EXT-X-ENDLIST:表明 m3u8 文件的结束。</p> <p>该标签可出现在 m3u8 文件任意位置,一般是结尾。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-ENDLIST</p> <p>EXT-X-PLAYLIST-TYPE:表明流媒体类型。全局生效。</p> <p>该标签为可选标签。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-PLAYLIST-TYPE:<type-enum></p> <p>其中:type-enum可选值如下:</p> <p></p> <p><strong>VOD:即 Video on Demand,表示该视屏流为点播源,因</strong>此服务器不能更改该 m3u8 文件;</p> <p></p> <p><strong>EVENT:表示该视频流为直播源</strong>,因此服务器不能更改或删除该文件任意部分内容(但是可以在文件末尾添加新内容)。</p> <p>注:VOD 文件通常带有 EXT-X-ENDLIST 标签,因为其为点播源,不会改变;而 EVEVT 文件初始化时一般不会有 EXT-X-ENDLIST 标签,暗示有新的文件会添加到播放列表末尾,因此也需要客户端定时获取该 m3u8 文件,以获取新的媒体片段资源,直到访问到 EXT-X-ENDLIST 标签才停止)。</p> <p></p> <p>EXT-X-I-FRAMES-ONLY:该标签表示每个媒体片段都是一个 I-frame。I-frames 帧视屏编码不依赖于其他帧数,因此可以通过 I-frame 进行快速播放,急速翻转等操作。</p> <p>该标签全局生效。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-I-FRAMES-ONLY</p> <p>如果播放列表设置了 EXT-X-I-FRAMES-ONLY,那么切片的时长(EXTINF 标签的值)即为当前切片 I-frame 帧开始到下一个 I-frame 帧出现的时长。</p> <p>媒体资源如果包含 I-frame 切片,那么必须提供媒体初始化块或者通过 EXT-X-MAP 标签提供媒体初始化块的获取途径,这样客户端就能通过这些 I-frame 切片以任意顺序进行加载和解码。</p> <p>如果 I-frame 切片设置了 EXT-BYTERANGE,那么就绝对不能提供媒体初始化块。</p> <p>使用 EXT-X-I-FRAMES-ONLY 要求的兼容版本号 EXT-X-VERSION 大于等于 4。</p> <p></p> <p>主播放列表类型标签:主播放列表(Master Playlist)定义了备份流,多语言翻译流和其他全局参数。</p> <p>主播放列表标签绝不能出现在媒体播放列表(Media Playlist)中。</p> <p>其具体标签如下:</p> <p></p> <p>EXT-X-MEDIA:用于指定相同内容的可替换的多语言翻译播放媒体列表资源。</p> <p>比如,通过三个 EXT-X-MEIDA 标签,可以提供包含英文,法语和西班牙语版本的相同内容的音频资源,或者通过两个 EXT-X-MEDIA 提供两个不同拍摄角度的视屏资源。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-MEDIA:<attribute-list></p> <p>其中,属性列表取值范围如下:</p> <p></p> <p>TYPE:该属性值为一个可枚举字符串。</p> <p>其值有如下四种:AUDIO,VIDEO,SUBTITLES,CLOSED-CAPTIONS。</p> <p>通常使用的都是CLOSED-CAPTIONS。</p> <p>该属性为必选参数。</p> <p></p> <p>URI:双引号包裹的媒体资源播放列表路径。</p> <p>如果 TYPE 属性值为 CLOSED-CAPTIONS,那么则不能提供 URI。</p> <p>该属性为可选参数。</p> <p></p> <p>GROUP-ID:双引号包裹的字符串,表示多语言翻译流所属组。</p> <p>该属性为必选参数。</p> <p></p> <p>LANGUAGE:双引号包裹的字符串,用于指定流主要使用的语言。</p> <p>该属性为可选参数。</p> <p></p> <p>ASSOC-LANGUAGE:双引号包裹的字符串,其内包含一个语言标签,用于提供多语言流的其中一种语言版本。</p> <p>该参数为可选参数。</p> <p></p> <p>NAME:双引号包裹的字符串,用于为翻译流提供可读的描述信息。</p> <p>如果设置了 LANGUAGE 属性,那么也应当设置 NAME 属性。</p> <p>该属性为必选参数。</p> <p></p> <p>DEFAULT:该属性值为一个可枚举字符串。</p> <p>可选值为YES和NO。</p> <p>该属性未指定时默认值为NO。</p> <p>如果该属性设为YES,那么客户端在缺乏其他可选信息时应当播放该翻译流。</p> <p>该属性为可选参数。</p> <p></p> <p>AUTOSELECT:该属性值为一个可枚举字符串。</p> <p>其有效值为YES或NO。</p> <p>未指定时,默认设为NO。</p> <p>如果该属性设置YES,那么客户端在用户没有显示进行设置时,可以选择播放该翻译流,因为其能配置当前播放环境,比如系统语言选择。</p> <p>如果设置了该属性,那么当 DEFAULT 设置YES时,该属性也必须设置为YES。</p> <p>该属性为可选参数。</p> <p></p> <p>FORCED:该属性值为一个可枚举字符串。</p> <p>其有效值为YES或NO。</p> <p>未指定时,默认设为NO。</p> <p>只有在设置了 TYPE 为 SUBTITLES 时,才可以设置该属性。</p> <p>当该属性设为YES时,则暗示该翻译流包含重要内容。当设置了该属性,客户端应当选择播放匹配当前播放环境最佳的翻译流。</p> <p>当该属性设为NO时,则表示该翻译流内容意图用于回复用户显示进行请求。</p> <p>该属性为可选参数。</p> <p></p> <p>INSTREAM-ID:由双引号包裹的字符串,用于指示切片的语言(Rendition)版本。</p> <p>当 TYPE 设为 CLOSED-CAPTIONS 时,必须设置该属性。</p> <p>其可选值为:"CC1", "CC2", "CC3", "CC4" 和 "SERVICEn"(n的值为 1~63)。</p> <p>对于其他 TYPE 值,该属性绝不能进行设置。</p> <p></p> <p>CHARACTERISTICS:由双引号包裹的由一个或多个由逗号分隔的 UTI 构成的字符串。</p> <p>每个 UTI 表示一种翻译流的特征。</p> <p>该属性可包含私有 UTI。</p> <p>该属性为可选参数。</p> <p></p> <p>CHANNELS:由双引号包裹的有序,由反斜杠/分隔的参数列表组成的字符串。</p> <p>所有音频 EXT-X-MEDIA 标签应当都设置 CHANNELS 属性。</p> <p>如果主播放列表包含两个相同编码但是具有不同数目 channed 的翻译流,则必须设置 CHANNELS 属性;否则,CHANNELS 属性为可选参数。</p> <p></p> <p>EXT-X-STREAM-INF:该属性指定了一个备份源。该属性值提供了该备份源的相关信息。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-STREAM-INF:<attribute-list></p> <p><URI></p> <p>其中:</p> <p></p> <p>URI 指定的媒体播放列表携带了该标签指定的翻译备份源。</p> <p>URI 为必选参数。</p> <p></p> <p>EXT-X-STREAM-INF 标签的参数属性列表有如下选项:</p> <p></p> <p>BANDWIDTH:该属性为每秒传输的比特数,也即带宽。代表该备份流的巅峰速率。</p> <p>该属性为必选参数。</p> <p></p> <p>AVERAGE-BANDWIDTH:该属性为备份流的平均切片传输速率。</p> <p>该属性为可选参数。</p> <p></p> <p>CODECS:双引号包裹的包含由逗号分隔的格式列表组成的字符串。</p> <p>每个 EXT-X-STREAM-INF 标签都应当携带 CODECS 属性。</p> <p></p> <p>RESOLUTION:该属性描述备份流视屏源的最佳像素方案。</p> <p>该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</p> <p></p> <p>FRAME-RATE:该属性用一个十进制浮点型数值作为描述备份流所有视屏最大帧率。</p> <p>对于备份流中任意视屏源帧数超过每秒 30 帧的,应当增加该属性设置。</p> <p>该属性为可选参数,但对于包含视屏源的备份流建议增加该属性设置。</p> <p></p> <p>HDCP-LEVEL:该属性值为一个可枚举字符串。</p> <p>其有效值为TYPE-0或NONE。</p> <p>值为TYPE-0表示该备份流可能会播放失败,除非输出被高带宽数字内容保护(HDCP)。</p> <p>值为NONE表示流内容无需输出拷贝保护。</p> <p>使用不同程度的 HDCP 加密备份流应当使用不同的媒体加密密钥。</p> <p>该属性为可选参数。在缺乏 HDCP 可能存在播放失败的情况下,应当提供该属性。</p> <p></p> <p>AUDIO:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 TYPE 属性值为 AUDIO 的 EXT-X-MEDIA 标签的 GROUP-ID 属性值相匹配。</p> <p>该属性为可选参数。</p> <p></p> <p>VIDEO:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 TYPE 属性值为 VIDEO 的 EXT-X-MEDIA 标签的 GROUP-ID 属性值相匹配。</p> <p>该属性为可选参数。</p> <p></p> <p>SUBTITLES:属性值由双引号包裹,其值必须与定义在主播放列表某处的设置了 TYPE 属性值为 SUBTITLES 的 EXT-X-MEDIA 标签的 GROUP-ID 属性值相匹配。</p> <p>该属性为可选参数。</p> <p></p> <p>CLOSED-CAPTIONS:该属性值可以是一个双引号包裹的字符串或NONE。</p> <p>如果其值为一个字符串,则必须与定义在主播放列表某处的设置了 TYPE 属性值为 CLOSED-CAPTIONS 的 EXT-X-MEDIA 标签的 GROUP-ID 属性值相匹配。</p> <p>如果其值为NONE,则所有的 ext-x-stream-inf 标签必须同样将该属性设置NONE,表示主播放列表备份流均没有关闭的标题。对于某个备份流具备关闭标题,另一个备份流不具备关闭标题可能会触发播放中断。</p> <p>该属性为可选参数。</p> <p></p> <p>EXT-X-I-FRAME-STREAM-INF:该标签表明媒体播放列表文件包含多种媒体资源的 I-frame 帧。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-I-FRAME-STREAM-INF:<attribute-list></p> <p>该标签的属性列表包含了 EXT-X-I-FRAME-STREAM-INF 标签同样的属性列表选项,除了 FRAME-RATE,AUDIO,SUBTITLES 和 CLOSED-CAPTIONS。除此之外,其他的属性还有:</p> <p></p> <p>URI:该属性值由双引号包裹的字符串,指示了 I-frame 媒体播放列表文件的路径,该媒体播放列表文件必须包含 EXT-X-I-FRAMES-ONLY 标签。</p> <p>EXT-X-SESSION-DATA:该标签允许主播放列表携带任意 session 数据。</p> <p>该标签为可选参数。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-SESSION-DATA:<attribute-list></p> <p>其中,其参数属性列表值如下可选项:</p> <p></p> <p>DATA-ID:由双引号包裹的字符串,代表一个特定的数据值。</p> <p>该属性应当使用反向 DNS 进行命名,如"com.example.movie.title"。然而,由于没有中央注册机构,所以可能出现冲突情况。</p> <p>该属性为必选参数。</p> <p></p> <p>VALUE:该属性值为一个双引号包裹的字符串,其包含 DATA-ID 指定的值。</p> <p>如果设置了 LANGUAGE,则 VALUE 应当包含一个用该语言书写的可读字符串。</p> <p></p> <p>URI:由双引号包裹的 URI 字符串。由该 URI 指示的资源必选使用 JSON 格式,否则,客户端可能会解析失败。</p> <p></p> <p>LANGUAGE:由双引号包裹的,包含一个语言标签的字符串。指示了 VALUE 所使用的语言。</p> <p></p> <p>EXT-X-SESSION-KEY:该标签允许主播放列表(Master Playlist)指定媒体播放列表(Meida Playlist)的加密密钥。这使得客户端可以预先加载这些密钥,而无需从媒体播放列表中获取。</p> <p>该标签为可选参数。</p> <p>其格式为:</p> <p>#EXT-X-SESSION-KEY:<attribute-list></p> <p>其属性列表与 EXT-X-KEY 相同,除了 METHOD 属性的值必须不为NONE。</p> <p>播放列表类型标签:以下标签可同时设置于主播放列表(Master Playlist)和媒体播放列表(Media Playlist)中。</p> <p>但是对于在主播放列表中设置了的标签,不应当再次设置在主播放列表指向的媒体播放列表中。</p> <p>同时出现在两者播放列表的相同标签必须具备相同的值。这些标签在播放列表中不能出现多次(只能使用一次)。具体标签如下所示:</p> <p></p> <p>EXT-X-INDEPENDENT-SEGMENTS:该标签表明对于一个媒体片段中的所有媒体样本均可独立进行解码,而无须依赖其他媒体片段信息。</p> <p>该标签对列表内所有媒体片段均有效。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-INDEPENDENT-SEGMENTS</p> <p>如果该标签出现在主播放列表中,则其对所有媒体播放列表的所有媒体片段都生效。</p> <p></p> <p>EXT-X-START:该标签表示播放列表播放起始位置。</p> <p>默认情况下,客户端开启一个播放会话时,应当使用该标签指定的位置进行播放。</p> <p>该标签为可选标签。</p> <p>其格式为:</p> <p></p> <p>#EXT-X-START:<attribute-list></p> <p>其参数属性列表的取值范围如下:</p> <p></p> <p>TIME-OFFSET:该属性值为一个带符号十进制浮点数(单位:秒)。</p> <p>一个正数表示以播放列表起始位置开始的时间偏移量。</p> <p>一个负数表示播放列表上一个媒体片段最后位置往前的时间偏移量。</p> <p>该属性的绝对值应当不超过播放列表的时长。如果超过,则表示到达文件结尾(数值为正数),或者达到文件起始(数值为负数)。</p> <p>如果播放列表不包含 EXT-X-ENDLIST 标签,那么 TIME-OFFSET 属性值不应当在播放文件末尾三个切片时长之内。</p> <p></p> <p>PRECISE:该值为一个可枚举字符串。</p> <p>有效的取值为YES 或 NO。</p> <p>如果值为YES,客户端应当播放包含 TIME-OFFSET 的媒体片段,但不要渲染该块内优先于 TIME-OFFSET 的样本块。</p> <p>如果值为NO,客户端应当尝试渲染在媒体片段内的所有样本块。</p> <p>该属性为可选参数,未指定则认为NO。</p> <p></p> <p>到此,m3u8 相关的标签我们已经完全介绍完毕。</p> <p></p> <p>下面我们再简单介绍下资源文件的获取具体操作。</p> <p></p> <p>上文提到,m3u8 文件要么是媒体播放列表(Meida Playlist),要么是主播放列表(Master Playlist)。但无论是哪种列表,其有效内容均由两部分结构组成:</p> <p></p> <p>以 #EXT 开头的为标签信息,作为对媒体资源的进一步描述;</p> <p>剩余的为资源信息,要么是片段资源(Media Playlist)路径,要么是 m3u8 资源(Master Playlist)路径;</p> <p>我们先简单介绍下 m3u8 文件媒体片段的表示方法:</p> <p></p> <p>m3u8 文件中,媒体片段可以采用全路径表示。如下所示:</p> <p>#EXTINF:10.0,</p> <p>http://example.com/movie1/fileSequenceA.ts</p> <p>这样,获取资源片段的路径就是 m3u8 文件内指定的路径,即:http://example.com/movie1/fileSequenceA.ts</p> <p></p> <p>m3u8 文件中,媒体片段还可以使用相对路径表示。如下所示:</p> <p>#EXTINF:10.0,</p> <p>fileSequenceA.ts</p> <p>这表示片段文件的路径是相对于 m3u8 文件路径的,即假设当前 m3u8 的路径为:https://127.0.0.1/hls/m3u8,那么,片段文件 fileSequenceA.ts 的路径即为:https://127.0.0.1/hls/fileSequenceA.ts</p> <p></p> <p>尽管可以在 m3u8 文件中使用绝对路径指定媒体片段资源路径,但是更好的选择是使用相对路径。相对路径相较于绝对路径更轻便,同时是相对于 m3u8 文件的 URL。相比之下,绝对路径增加了 m3u8 文件内容(更多字符),增大了文件内容,同时也增大了网络传输量。</p> <p></p> <p>其余一些注意事项</p> <p>有两种请求 m3u8 播放列表的方法:一是通过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8 或 .m3u 结尾;</p> <p>二是通过 HTTP 进行请求,则请求头Content-Type必须设置为 application/vnd.apple.mpegurl或者audio/mpegurl。</p> <p></p> <p>空行和注释行在解析时都忽略。</p> <p></p> <p>媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。</p> <p></p> <p>每个切片的码率(bit rate)就是切片的大小除以它对应的时长(EXTINF 指定的时长)。</p> <p></p> <p>一个标签的属性列表的同一个属性AttributeName只能出现一次。</p> <p></p> <p>EXT-X-TARGETDURATION 指定的时长绝对不能进行更改。通常该值指定的时长为 10 秒。</p> <p></p> <p>对于指定了 EXT-X-I-FRAMES-ONLY 且 第一个媒体片段(或者第一个尾随 EXT-X-DISCONTINUITY 的片段)其资源没有立即携带媒体初始化块的切片,应当增加使用标签 EXT-X-MAP 指定媒体初始化块获取途径。</p> <p></p> <p>使用 EXT-X-MAP 标签内含标签 EXT-X-I-FRAMES-ONLY 要求的兼容版本号 EXT-X-VERSION 要大于等于 5;只使用 EXT-X-MAP 要求的兼容版本号要大于等于 6。</p> <p></p> <p>由标签 EXT-X-MAP 声明的媒体初始化块可使用 AES-128 方法进行加密,此时,作用于 EXT-X-MAP 标签的 EXT-X-KEY 标签必须设置 IV 属性。</p> <p></p> <p>带有属性 END-ON-NEXT=YES 的标签 EXT-X-DATERANGE 必须携带 CLASS 属性,但不能携带 DURATION 和 END-DATE 属性。其余带有相同 CLASS 的标签 EXT-X-DATERANGE 不能指定重叠的日期范围。</p> <p></p> <p>日期范围如果未指明 DURATION,END_DATE,END-ON-NEXT=YES 属性时,则其时长(duration)未知,即使其设置了 PLANNED-DURATION 属性。</p> <p></p> <p>如果播放列表设置了 EXT-X-DATERANGE 标签,则必须同时设置 EXT-X-PROGRAM-DATE-TIME 标签。</p> <p></p> <p>如果播放列表设置了拥有相同 ID 属性值的两个 EXT-X-DATERANGE 标签,则对于相同的属性名,在这两个 EXT-X-DATERANGE 中对应的值必须一致。</p> <p></p> <p>如果 EXT-X-DATERANGE 同时设置了 DURATION 和 END-DATE 属性,则 END-DATE 属性值必须等于 START-DATE 属性值加上 DURATION 属性值。</p> <p></p> <p>EXT-X-MEDIA-SEQUENCE 标签必须出现在播放列表第一个切片之前。</p> <p></p> <p>EXT-X-DISCONTINUITY-DEQUENCE 标签必须出现在播放列表第一个切片之前。</p> <p></p> <p>EXT-X-DISCONTINUITY-DEQUENCE 标签必须出现在任意 EXT-X-DISCONTINUITY 标签之前。</p> <p></p> <p>m3u8 文件如果没有设置 EXT-X-PLAYLIST-TYPE 标签,那么播放列表可以随时进行更改。比如,可以更新或删除播放列表中的媒体片段。</p> <p></p> <p>每个 EXT-X-I-FRAME-STREAM-INF 标签必须包含一个 BANDWIDTH 和 URI 属性。</p> <p></p> <p>每个 EXT-X-SESSION-DATA 标签都必须包含一个 VALUE 或 URI 属性,但不能同时包含两者。</p> <p></p> <p>一个播放列表可以包含多个携带相同 DATA-ID 属性的 EXT-X-SESSION-DATA 标签。但是不能包含多个携带相同 DATA-ID 和相同 LANGUAGE 属性的 EXT-X-SESSION-DATA 标签。</p> <p></p> <p>如果设置了 EXT-X-SESSION-KEY,那么其 METHOD,KEYFORMAT 和 KEYFORMATVERSIONS 属性值必须与任意相同 URI 的 EXT-X-KEY 标签值相同。</p> <p></p> <p>如果多份备用流或者多语言流使用相同的加密密钥和格式,则应当设置 EXT-X-SESSION-KEY 标签。</p> <p></p> <p>主播放列表必须不能设置多个具有相同 METHOD,URI,IV,KEYFORMAT 和 KEYFORMATVERSIONS 属性值得 EXT-X-SESSION-KEY 标签。</p> <p></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1587768127490371584"></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">你可能感兴趣的:(音视频/流媒体,ffmpeg,java,流媒体,音视频,m3u8)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1884101041855721472.htm" title="渗透测试 - webshell jsp一句话大马 && 蚁剑连接" target="_blank">渗透测试 - webshell jsp一句话大马 && 蚁剑连接</a> <span class="text-muted">浩浩测试一下</span> <a class="tag" taget="_blank" href="/search/OWASP/1.htm">OWASP</a><a class="tag" taget="_blank" href="/search/Top/1.htm">Top</a><a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E/1.htm">漏洞</a><a class="tag" taget="_blank" href="/search/web%E6%B8%97%E9%80%8F/1.htm">web渗透</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><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%AE%89%E5%85%A8/1.htm">系统安全</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a> <div>目录大木马webshell大马连接大木马<%@pageimport="javax.imageio.*"%&g</div> </li> <li><a href="/article/1884098265478131712.htm" title="Java虚拟机组成" target="_blank">Java虚拟机组成</a> <span class="text-muted">全干攻城狮12138</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</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><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>1.组成部分字节码文件类加载器ClassLoader运行时数据区域(JVM管理的内存)执行引擎(即时编译器、解释器、垃圾回收器等)本地接口(调用本地已经编译的方法,比如虚拟机中提供的c/c++方法)2.字节码文件组成基础信息:魔数、字节码文件对应的Java版本号、访问标识(publicfinal等)、父类和接口魔数:由于文件后缀名可以改,因此无法通过后缀名判断文件类型,所以通过文件头(前几个字节)</div> </li> <li><a href="/article/1884087417921662976.htm" title="由于直接提供完整的游戏商城代码超出了简单回答的范围,并且游戏商城的实现可以相当复杂,涉及前端展示、后端逻辑、数据库设计等多个方面,我会分别用几种流行的编程语言和技术栈概述如何开始搭建一个基本的游戏商城" target="_blank">由于直接提供完整的游戏商城代码超出了简单回答的范围,并且游戏商城的实现可以相当复杂,涉及前端展示、后端逻辑、数据库设计等多个方面,我会分别用几种流行的编程语言和技术栈概述如何开始搭建一个基本的游戏商城</a> <span class="text-muted">编程小飞侠a</span> <a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%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/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>前端(HTML/CSS/JavaScript+React)React示例:fengbaoshun.com首先,你需要安装Node.js和npm(Node包管理器),然后使用CreateReactApp来快速启动你的前端项目。bashnpxcreate-react-appgame-store-frontendcdgame-store-frontendnpmstart接下来,你可以使用React组件来</div> </li> <li><a href="/article/1884087165697191936.htm" title="由于直接提供完整的大型项目代码(如购物商城)在单一回答中是不切实际的,我将为你概述如何在几种流行的编程语言中设置购物商城的基本框架和思路。这包括前端(如HTML/CSS/JavaScript)和后端(" target="_blank">由于直接提供完整的大型项目代码(如购物商城)在单一回答中是不切实际的,我将为你概述如何在几种流行的编程语言中设置购物商城的基本框架和思路。这包括前端(如HTML/CSS/JavaScript)和后端(</a> <span class="text-muted">SigridFelix</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>前端(HTML/CSS/JavaScript)dz61.comHTML:创建基础的页面结构,如主页、商品列表页、购物车页和结账页。html我的购物商城欢迎来到我的购物商城商品列表购物车CSS:简单的样式表,用于美化页面。css/*styles.css*/body{font-family:Arial,sans-serif;}h1{color:#333;}ul{list-style-type:none</div> </li> <li><a href="/article/1884081994237800448.htm" title="从零开始构建一个JAVA项目" target="_blank">从零开始构建一个JAVA项目</a> <span class="text-muted">SUGERBOOM</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>本篇文章将从结构框架入手,系统介绍一个完整Java程序的结构步骤,不涉及JAVA基础代码学习。在本文章中先简单介绍Maven、Spring、MyBatis三种Java类型。一、分类介绍首先我们先来了解Java程序的类型,不同类型结构略有区别。Java程序的类型可以根据多个分类方式进行划分,以下是一些常见的分类和简要解释:构建工具类型:Maven:用于管理项目的构建、报告和文档的生成。它提供了一种标</div> </li> <li><a href="/article/1884078845431181312.htm" title="计算机毕业设计ssm基于Web的医院陪诊系统的设计与实现go8299(附源码)新手必备" target="_blank">计算机毕业设计ssm基于Web的医院陪诊系统的设计与实现go8299(附源码)新手必备</a> <span class="text-muted">一念 计算机毕设源码程序</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。系统的选题背景和意义选题背景:随着社会的发展和人们生活水平的提高,医疗服务的需求也越来越多样化。在传统的医院就诊过程中,患者通常需要自行前往医院,并且由于医生工作繁忙,陪诊时间有限,导致患者在就诊过程中感到孤独和不安。而基于Web的医院陪诊系统的设计与实现,可以为患者提供更加便捷和贴心的就医体验。意义</div> </li> <li><a href="/article/1884076702993281024.htm" title="Spring Boot 整合 MySQL 和 Druid 连接池" target="_blank">Spring Boot 整合 MySQL 和 Druid 连接池</a> <span class="text-muted">疯狂的键盘侠</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a> <div>SpringBoot整合MySQL和Druid连接池一、引言在JavaWeb开发中,SpringBoot凭借其简洁的配置和强大的功能成为主流框架,而MySQL作为常用的关系型数据库,与SpringBoot的结合十分紧密。Druid是阿里巴巴开源的一款高性能数据库连接池,它提供了丰富的监控和扩展功能,能有效提升应用程序与数据库交互的性能和稳定性。本文将详细介绍如何在SpringBoot2和Sprin</div> </li> <li><a href="/article/1884070908465836032.htm" title="【前沿聚焦】机器学习的未来版图:从自动化到隐私保护的技术突破" target="_blank">【前沿聚焦】机器学习的未来版图:从自动化到隐私保护的技术突破</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/AI/1.htm">AI</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/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。图书作者:《ESP32-C3物联网工程开发实战》图书作者:《SwiftUI入门,进阶与实战》超级个体:CO</div> </li> <li><a href="/article/1884063349189177344.htm" title="Spring Boot 高级开发指南:全面掌握微服务架构的关键技术" target="_blank">Spring Boot 高级开发指南:全面掌握微服务架构的关键技术</a> <span class="text-muted">IT古董</span> <a class="tag" taget="_blank" href="/search/JAVA/1.htm">JAVA</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a> <div>SpringBoot是现代Java开发的主流框架,尤其在构建微服务架构时,它提供了丰富的工具与功能,帮助开发者快速构建高效、健壮的系统。本文将围绕13个关键的高级概念展开,逐一分析SpringBoot在微服务开发中的核心技术,包括配置与属性管理、Bean生命周期与作用域、国际化、缓存、部署运维、弹性微服务、分布式事务等,配合实际代码与案例,帮助开发者深入理解和应用SpringBoot。1.配置与属</div> </li> <li><a href="/article/1884063096977289216.htm" title="【华为OD-E卷 - 字符串解密 100分(python、java、c++、js、c)】" target="_blank">【华为OD-E卷 - 字符串解密 100分(python、java、c++、js、c)】</a> <span class="text-muted">CodeClimb</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E9%A2%98/1.htm">算法题</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BAod/1.htm">华为od</a><a class="tag" taget="_blank" href="/search/%EF%BC%88A%2BB%2BC%2BD%2BE/1.htm">(A+B+C+D+E</a><a class="tag" taget="_blank" href="/search/%E5%8D%B7%EF%BC%89%E6%94%B6%E5%BD%95%E5%88%86%E4%BA%AB/1.htm">卷)收录分享</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BAod/1.htm">华为od</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/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>【华为OD-E卷-字符串解密100分(python、java、c++、js、c)】题目给定两个字符串string1和string2。string1是一个被加扰的字符串。string1由小写英文字母(’a’~’z’)和数字字符(’0’~’9’)组成,而加扰字符串由’0’~’9’、’a’~’f’组成。string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有效子串被加扰子串隔开</div> </li> <li><a href="/article/1884062088763076608.htm" title="【Java】--方法的使用" target="_blank">【Java】--方法的使用</a> <span class="text-muted">雨雨雨点子</span> <a class="tag" taget="_blank" href="/search/JavaSE/1.htm">JavaSE</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录1.方法概念及使用1.1什么是方法1.2方法定义1.3方法调用的执行过程1.4实参和形参的关系(重要)1.5没有返回值的方法2.方法重载2.1方法重载概念2.2方法签名3.递归3.1递归的概念3.2递归执行过程分析3.3递归练习1.方法概念及使用1.1什么是方法方法就是一个代码片段.类似于C语言中的“函数”。方法存在的意义(不要背,重在体会):是能够模块化的组织代码(当代码规模比较复杂的时</div> </li> <li><a href="/article/1884059820387004416.htm" title="LeetCode - #195 Swift 实现打印文件中的第十行" target="_blank">LeetCode - #195 Swift 实现打印文件中的第十行</a> <span class="text-muted">网罗开发</span> <a class="tag" taget="_blank" href="/search/Swift/1.htm">Swift</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a> <div>网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。图书作者:《ESP32-C3物联网工程开发实战》图书作者:《SwiftUI入门,进阶与实战》超级个体:CO</div> </li> <li><a href="/article/1884051128434356224.htm" title="GPT4All:免费使用本地运行无需GPU的基于C++的GPT模型和UI: A free-to-use, locally running, privacy-aware chatbot. No GPU" target="_blank">GPT4All:免费使用本地运行无需GPU的基于C++的GPT模型和UI: A free-to-use, locally running, privacy-aware chatbot. No GPU</a> <span class="text-muted">AI天才研究院</span> <a class="tag" taget="_blank" href="/search/ChatGPT/1.htm">ChatGPT</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/LLM%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%90%BD%E5%9C%B0%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97/1.htm">LLM大模型落地实战指南</a><a class="tag" taget="_blank" href="/search/gpt/1.htm">gpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5/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/c%2B%2B/1.htm">c++</a> <div>目录GPT4All:https://github.co:m/nomic-ai/gpt4allGPT4AllChatUIGPT4All聊天用户界面效果测试问题:HowtowriteamultipleThreadcodeInJava?输出:GPT4All如何运作RunningLLMsonCPU在CPU上运行LLMSideloadinganyggMLmodel加载任何ggML模型GPT4ALL:目前已经</div> </li> <li><a href="/article/1884044064895070208.htm" title="【MQ】如何保证消息队列的高性能?" target="_blank">【MQ】如何保证消息队列的高性能?</a> <span class="text-muted">Forest 森林</span> <a class="tag" taget="_blank" href="/search/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/1.htm">消息队列</a><a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a> <div>零拷贝Kafka使用到了mmap和sendfile的方式来实现零拷贝。分别对应Java的MappedByteBuffer和FileChannel.transferTo顺序写磁盘Kafka采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数完成一次磁盘IO,需要经过寻道、旋转和数据传输三个步骤,如果在写磁盘的时候省去寻道、旋转可以极大地提高磁盘读写的性能。Kafka中每</div> </li> <li><a href="/article/1884044066287579136.htm" title="Junit和Eclemma介绍--java白盒测试工具" target="_blank">Junit和Eclemma介绍--java白盒测试工具</a> <span class="text-muted">myy_2018</span> <a class="tag" taget="_blank" href="/search/JAVA/1.htm">JAVA</a> <div>Junit一般进行单元测试时候使用,以前写好了模块,然后写一个main函数,写几个通用的测试用例去测试代码的逻辑结果是否正确,现在Eclipse中Junit插件使得不必须手动编写main函数,可以借助Junit编写测试函数,自动生成与模块相匹配的测试模块。我们只需要添加测试用例即可,并且结果显示是否与预期符合。Eclemma是Junit配合使用的插件,是测试覆盖率的工具,对于含有条件判断的代码,对</div> </li> <li><a href="/article/1884037382525743104.htm" title="【用Java学习数据结构系列】初识泛型" target="_blank">【用Java学习数据结构系列】初识泛型</a> <span class="text-muted">Gu Gu Study</span> <a class="tag" taget="_blank" href="/search/%E3%80%90%E7%94%A8Java%E5%AD%A6%E4%B9%A0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B3%BB%E5%88%97%E3%80%91/1.htm">【用Java学习数据结构系列】</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>看到这句话的时候证明:此刻你我都在努力加油陌生人br/>个人主页:GuGuStudy专栏:用Java学习数据结构系列喜欢的一句话:常常会回顾努力的自己,所以要为自己的努力留下足迹喜欢的话可以点个赞谢谢了。作者:小闭前言好久没有更新文章了,大概断更了20天,想着今天就写一下文章吧!最近也是又温习了一下数据结构,其实之前我写过关于数据结构的一个专栏那个专栏是写了顺序表,链表,栈和队列,但是那时是用C语</div> </li> <li><a href="/article/1884028180201795584.htm" title="日志收集Day008" target="_blank">日志收集Day008</a> <span class="text-muted">ccnnlxc</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> <div>1.zk集群优化修改zookeeper的堆内存大小,一般情况下,生产环境给到2G足以,如果规模较大可以适当调大到4G。(1)配置ZK的堆内存vim/app/softwares/zk/conf/java.envexportJAVA_HOME=/sortwares/jdk1.8.0_291exportJVMFLAGS="-Xms256m-Xmx256m$JVMFLAGS"EOF(2)同步文件到其他节点</div> </li> <li><a href="/article/1884025912182239232.htm" title="Java实现在线聊天_java实现聊天功能" target="_blank">Java实现在线聊天_java实现聊天功能</a> <span class="text-muted">简介_vN</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/cocoa/1.htm">cocoa</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>资源绑定是指把业务相关的数据和Tcp连接(即ChannelContext)关联起来,譬如ChannelContext-A代表了用户张三,张三的userid是333Tio.bindUser(ChannelContext-A,"333")t-io目前内置了4种资源绑定,譬如给group加前缀"ios-",从而标记这个用户使用的是iosTio.bindGroup(ChannelContext-A,"33</div> </li> <li><a href="/article/1884025155815010304.htm" title="【前端】--- ES6上篇(带你深入了解ES6语法)" target="_blank">【前端】--- ES6上篇(带你深入了解ES6语法)</a> <span class="text-muted">心.c</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</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/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a> <div>前言:ECMAScript是JavaScript的标准化版本,由ECMA国际组织制定。ECMAScript定义了JavaScript的语法、类型、语句、关键字、保留字等。ES6是ECMAScript的第六个版本,于2015年发布,引入了许多重要的新特性,使JavaScript更加现代化。目录变量声明:let声明:var声明:const声明:解构(数组,对象,字符串):数组解构:对象解构:字符串解构</div> </li> <li><a href="/article/1884021371411951616.htm" title="cv python_python里面cv是什么意思" target="_blank">cv python_python里面cv是什么意思</a> <span class="text-muted">weixin_40004659</span> <a class="tag" taget="_blank" href="/search/cv/1.htm">cv</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>OpenCV(OpenSourceComputerVisionLibrary)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV其实就是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。OpenCV由一系列C函数和C++类构成,它有C,C++,Python和java接口,当前SDK(SoftwareDevelopmentKit软件</div> </li> <li><a href="/article/1884020361436131328.htm" title="【如何获取股票数据05】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股最新分时MA数据获取实例演示及接口API说明文档" target="_blank">【如何获取股票数据05】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股最新分时MA数据获取实例演示及接口API说明文档</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/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/%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AEAPI/1.htm">股票数据API</a><a class="tag" taget="_blank" href="/search/%E8%82%A1%E7%A5%A8%E6%95%B0%E6%8D%AE%E6%8E%A5%E5%8F%A3/1.htm">股票数据接口</a> <div>最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任务是从这些数据中提炼出有价值的信息,为我们的投资策略提供有力的指导。在数据探索的旅途中,我尝试了多种方法,包括自编网易股票页面爬虫、申万行业数据爬虫,以及同花顺问财的爬虫,甚</div> </li> <li><a href="/article/1884012542875987968.htm" title="访问DOM元素(节点)" target="_blank">访问DOM元素(节点)</a> <span class="text-muted">froginwe11</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>DOM(文档对象模型)是Web开发中用于处理HTML和XML文档的标准接口,它允许开发者通过脚本语言(如JavaScript)动态地访问和修改文档的结构、内容和样式。在DOM中,文档的每个部分都被视为一个节点,包括元素、文本、属性等。访问DOM元素(节点)DOM提供了一系列方法来访问和操作元素(节点):getElementById():通过元素的ID获取元素节点。例如,document.getEl</div> </li> <li><a href="/article/1884011279979442176.htm" title="Java web 富文本内容生成转为word格式并导出下载" target="_blank">Java web 富文本内容生成转为word格式并导出下载</a> <span class="text-muted">摘星喵Pro</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/1.htm">编程技巧</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a> <div>Javaweb富文本内容生成转为word格式并导出下载最近思路,按标签逐一解析,实现复杂一点但是完美解决问题:https://blog.csdn.net/a2272062968/article/details/126227076思路:Word是完全支持html标签的,但是富文本内容并不是完整的html代码,需要先补全html标签,然后转码输出问题:虽然导出worddoc但是事件内容流还是htm,只</div> </li> <li><a href="/article/1884011281019629568.htm" title="Word、PDF转换为图片Java" target="_blank">Word、PDF转换为图片Java</a> <span class="text-muted">摘星喵Pro</span> <a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/poi/1.htm">poi</a> <div>Word、PDF转换为图片Java需求要在小程序端展示文档内容,所以将文档每页转换为图片后显示参考和其他等方案:https://blog.csdn.net/strggle_bin/article/details/140599514https://www.modb.pro/db/566986https://blog.csdn.net/spring_is_coming/article/details/</div> </li> <li><a href="/article/1884008632790609920.htm" title="【如何获取股票数据01】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股实时交易数据获取实例演示及接口API说明文档" target="_blank">【如何获取股票数据01】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股实时交易数据获取实例演示及接口API说明文档</a> <span class="text-muted">Eumenides_max</span> <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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任务是从这些数据中提炼出有价值的信息,为我们的投资策略提供有力的指导。在数据探索的旅途中,我尝试了多种方法,包括自编网易股票页面爬虫、申万行业数据爬虫,以及同花顺问财的爬虫,甚</div> </li> <li><a href="/article/1884008127997734912.htm" title="股票实时行情数据API接口分享" target="_blank">股票实时行情数据API接口分享</a> <span class="text-muted">2301_78150700</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>JAVA版本API接口分享:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;publicclassTestMain{publicstaticvoidmain(String</div> </li> <li><a href="/article/1884006488784039936.htm" title="股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档" target="_blank">股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档</a> <span class="text-muted">Eumenides_max</span> <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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>本文中所有接口均可直接在浏览器打开获取数据,为了便于大家验证有效性,已经做好了超链接,直接点击即可!沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/b997d4403688d5e66a【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):https://api.mairui.club/hsrl/ssjy/000001</div> </li> <li><a href="/article/1884002962058047488.htm" title="Thymeleaf基础知识语法" target="_blank">Thymeleaf基础知识语法</a> <span class="text-muted">沐暖沐</span> <a class="tag" taget="_blank" href="/search/thymeleaf/1.htm">thymeleaf</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1、简介Thymeleaf是⾯向Web和独⽴环境的现代服务器端Java模板引擎,能够处理HTML、XML、JavaScript、CSS、TEXT、RAW这六种模板。这六种模版模式包含两种标记模板模式(HTML和XML),三种⽂本模板模式(TEXT,JAVASCRIPT和CSS)和⼀个⽆操作模板模式(RAW)。①简单表达式变量表达式:${…}选择变量表达式:*{…}消息表达:#{…}链接URL表达式</div> </li> <li><a href="/article/1884002458267611136.htm" title="华为机试HJ16:购物单 系统的动态规划设计思路 剖析Java最优解代码" target="_blank">华为机试HJ16:购物单 系统的动态规划设计思路 剖析Java最优解代码</a> <span class="text-muted">_JC_Chris</span> <a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/1.htm">动态规划</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>0.写在前面“华为机试HJ16:购物单”是一道“物品间有依赖关系”的【01背包问题】,属于经典dp问题的变形。对于基础薄弱的同学来说,本题的思维难度不低,建议先了解“普通01背包问题”的基本求解思路——bilibili辅助学习视频(预计学习时间15min)1.题目描述王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件附件电脑打印</div> </li> <li><a href="/article/1883999810390913024.htm" title="JVM --- 类的生命周期" target="_blank">JVM --- 类的生命周期</a> <span class="text-muted">Wangwq.</span> <a class="tag" taget="_blank" href="/search/%E5%85%AB%E8%82%A1%E6%96%87/1.htm">八股文</a><a class="tag" taget="_blank" href="/search/JVM/1.htm">JVM</a> <div>一、类的生命周期加载-----》校验-----》准备-----》解析-----》初始化-----》使用-----》卸载二、类加载过程1、加载(1)主要工作:通过类的全限定名来获取定义此类的二进制字节流。将这个类字节流代表的静态存储结构转换为方法区的运行时数据结构。在堆中生成了一个代表此类的java.lang.Class对象,作为访问这些方法区的数据入口。(2)支持的两种类加载器:引导类加载器用户(</div> </li> <li><a href="/article/2.htm" title="Java序列化进阶篇" target="_blank">Java序列化进阶篇</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">java序列化</a> <div>        1.transient         类一旦实现了Serializable 接口即被声明为可序列化,然而某些情况下并不是所有的属性都需要序列化,想要人为的去阻止这些属性被序列化,就需要用到transient 关键字。 </div> </li> <li><a href="/article/129.htm" title="escape()、encodeURI()、encodeURIComponent()区别详解 " target="_blank">escape()、encodeURI()、encodeURIComponent()区别详解 </a> <span class="text-muted">aigo</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>原文:http://blog.sina.com.cn/s/blog_4586764e0101khi0.html   JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:,decodeURI,decodeURIComponent 。 下面简单介绍一下它们的区别 1 escape()函</div> </li> <li><a href="/article/256.htm" title="ArcgisEngine实现对地图的放大、缩小和平移" target="_blank">ArcgisEngine实现对地图的放大、缩小和平移</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E6%B7%BB%E5%8A%A0%E7%9F%A2%E9%87%8F%E6%95%B0%E6%8D%AE/1.htm">添加矢量数据</a><a class="tag" taget="_blank" href="/search/%E5%AF%B9%E5%9C%B0%E5%9B%BE%E7%9A%84%E6%94%BE%E5%A4%A7%E3%80%81%E7%BC%A9%E5%B0%8F%E5%92%8C%E5%B9%B3%E7%A7%BB/1.htm">对地图的放大、缩小和平移</a><a class="tag" taget="_blank" href="/search/Engine/1.htm">Engine</a> <div>ArcgisEngine实现对地图的放大、缩小和平移:  个人觉得是平移,不过网上的都是漫游,通俗的说就是把一个地图对象从一边拉到另一边而已。就看人说话吧.  具体实现: 一、引入命名空间    using ESRI.ArcGIS.Geometry;    using ESRI.ArcGIS.Controls; 二、代码实现.</div> </li> <li><a href="/article/383.htm" title="Java集合框架概述" target="_blank">Java集合框架概述</a> <span class="text-muted">天子之骄</span> <a class="tag" taget="_blank" href="/search/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E6%A6%82%E8%BF%B0/1.htm">Java集合框架概述</a> <div>   集合框架 集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。 从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。   简单介绍:   Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi</div> </li> <li><a href="/article/510.htm" title="旗正4.0页面跳转传值问题" target="_blank">旗正4.0页面跳转传值问题</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/jsp/1.htm">jsp</a> <div>跳转和成功提示 a)        成功字段非空forward 成功字段非空forward,不会弹出成功字段,为jsp转发,页面能超链接传值,传输变量时需要拼接。接拼接方式list.jsp?test="+strweightUnit+"或list.jsp?test="+weightUnit+&qu</div> </li> <li><a href="/article/637.htm" title="全网唯一:移动互联网服务器端开发课程" target="_blank">全网唯一:移动互联网服务器端开发课程</a> <span class="text-muted">cocos2d-x小菜</span> <a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91/1.htm">web开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">移动端开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94/1.htm">移动互联</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a> <div>    移动互联网时代来了!     App市场爆发式增长为Web开发程序员带来新一轮机遇,近两年新增创业者,几乎全部选择了移动互联网项目!传统互联网企业中超过98%的门户网站已经或者正在从单一的网站入口转向PC、手机、Pad、智能电视等多端全平台兼容体系。据统计,AppStore中超过85%的App项目都选择了PHP作为后端程</div> </li> <li><a href="/article/764.htm" title="Log4J通用配置|注意问题 笔记" target="_blank">Log4J通用配置|注意问题 笔记</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>关于日志的等级 那些去 百度就知道了! 这几天 要搭个新框架  配置了 日志 记下来 !做个备忘! #这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~! log4j.rootLogger=INFO,allLog # DAO层 log记录到dao.log 控制台 和 总日志文件 log4j.logger.DAO=INFO,dao,C</div> </li> <li><a href="/article/891.htm" title="SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager" target="_blank">SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager</a> <span class="text-muted">darkranger</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a><a class="tag" taget="_blank" href="/search/XP/1.htm">XP</a> <div>当你安装完之后,连接数据库的时候可能会发现你的TCP/IP 没有启动.. 发现需要启动客户端协议 : TCP/IP  需要打开 SQL Server Configuration Manager... 却发现无法打开 SQL Server Configuration Manager..?? 解决方法:  C:\WINDOWS\system32目录搜索framedyn.</div> </li> <li><a href="/article/1018.htm" title="[置顶] 做有中国特色的程序员" target="_blank">[置顶] 做有中国特色的程序员</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a> <div>从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是因为不喜欢这个类型,而此人也不会全不喜欢这些网络作品。究其原因,是因为网络作品都是让人先白看的,看的好了才出了头。而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾。 许多大牛都是写了博客,后来出了书。这些书也都不次,可能有人让为不好,是因为技术书不像小说,小说在读故事,技术书是在学知识或温习知识,有些技术书读得可</div> </li> <li><a href="/article/1145.htm" title="document.domain 跨域问题" target="_blank">document.domain 跨域问题</a> <span class="text-muted">avords</span> <a class="tag" taget="_blank" href="/search/document/1.htm">document</a> <div>document.domain用来得到当前网页的域名。比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。比如:javascript:alert(document.domain = "315ta.com"); </div> </li> <li><a href="/article/1272.htm" title="关于管理软件的一些思考" target="_blank">关于管理软件的一些思考</a> <span class="text-muted">houxinyou</span> <a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86/1.htm">管理</a> <div> 工作好多看年了,一直在做管理软件,不知道是我最开始做的时候产生了一些惯性的思维,还是现在接触的管理软件水平有所下降.换过好多年公司,越来越感觉现在的管理软件做的越来越乱. 在我看来,管理软件不论是以前的结构化编程,还是现在的面向对象编程,不管是CS模式,还是BS模式.模块的划分是很重要的.当然,模块的划分有很多种方式.我只是以我自己的划分方式来说一下. 做为管理软件,就像现在讲究MVC这</div> </li> <li><a href="/article/1399.htm" title="NoSQL数据库之Redis数据库管理(String类型和hash类型)" target="_blank">NoSQL数据库之Redis数据库管理(String类型和hash类型)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</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/NoSQL/1.htm">NoSQL</a> <div>一.Redis的数据类型 1.String类型及操作         String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。         Set方法:设置key对应的值为string类型的value </div> </li> <li><a href="/article/1526.htm" title="Tomcat 一些技巧" target="_blank">Tomcat 一些技巧</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/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/dos/1.htm">dos</a> <div>以下操作都是在windows 环境下 一、Tomcat 启动时配置 JAVA_HOME 在 tomcat 安装目录,bin 文件夹下的 catalina.bat 或 setclasspath.bat 中添加 set JAVA_HOME=JAVA 安装目录 set JRE_HOME=JAVA 安装目录/jre 即可; 二、查看Tomcat 版本 在 tomcat 安装目</div> </li> <li><a href="/article/1653.htm" title="【Spark七十二】Spark的日志配置" target="_blank">【Spark七十二】Spark的日志配置</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a> <div>在测试Spark Streaming时,大量的日志显示到控制台,影响了Spark Streaming程序代码的输出结果的查看(代码中通过println将输出打印到控制台上),可以通过修改Spark的日志配置的方式,不让Spark Streaming把它的日志显示在console   在Spark的conf目录下,把log4j.properties.template修改为log4j.p</div> </li> <li><a href="/article/1780.htm" title="Haskell版冒泡排序" target="_blank">Haskell版冒泡排序</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a> <div>面试的时候问的比较多的算法题要么是binary search,要么是冒泡排序,真的不想用写C写冒泡排序了,贴上个Haskell版的,思维简单,代码简单,下次谁要是再要我用C写冒泡排序,直接上个haskell版的,让他自己去理解吧。     sort [] = [] sort [x] = [x] sort (x:x1:xs) | x>x1 = x1:so</div> </li> <li><a href="/article/1907.htm" title="java 路径 配置文件读取" target="_blank">java 路径 配置文件读取</a> <span class="text-muted">bro_feng</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>这几天做一个项目,关于路径做如下笔记,有需要供参考。 取工程内的文件,一般都要用相对路径,这个自然不用多说。 在src统计目录建配置文件目录res,在res中放入配置文件。 读取文件使用方式: 1. MyTest.class.getResourceAsStream("/res/xx.properties") 2. properties.load(MyTest.</div> </li> <li><a href="/article/2034.htm" title="读《研磨设计模式》-代码笔记-简单工厂模式" target="_blank">读《研磨设计模式》-代码笔记-简单工厂模式</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ package design.pattern; /* * 个人理解:简单工厂模式就是IOC; * 客户端要用到某一对象,本来是由客户创建的,现在改成由工厂创建,客户直接取就好了 */ interface IProduct { </div> </li> <li><a href="/article/2161.htm" title="SVN与JIRA的关联" target="_blank">SVN与JIRA的关联</a> <span class="text-muted">chenyu19891124</span> <a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a> <div>SVN与JIRA的关联一直都没能装成功,今天凝聚心思花了一天时间整合好了。下面是自己整理的步骤: 一、搭建好SVN环境,尤其是要把SVN的服务注册成系统服务 二、装好JIRA,自己用是jira-4.3.4破解版 三、下载SVN与JIRA的插件并解压,然后拷贝插件包下lib包里的三个jar,放到Atlassian\JIRA 4.3.4\atlassian-jira\WEB-INF\lib下,再</div> </li> <li><a href="/article/2288.htm" title="JWFDv0.96 最新设计思路" target="_blank">JWFDv0.96 最新设计思路</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a><a class="tag" taget="_blank" href="/search/%E5%85%AC%E5%91%8A/1.htm">公告</a> <div>                   随着工作流技术的发展,工作流产品的应用范围也不断的在扩展,开始进入了像金融行业(我已经看到国有四大商业银行的工作流产品招标公告了),实时生产控制和其它比较重要的工程领域,而</div> </li> <li><a href="/article/2415.htm" title="vi 保存复制内容格式粘贴" target="_blank">vi 保存复制内容格式粘贴</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/vi/1.htm">vi</a><a class="tag" taget="_blank" href="/search/%E7%B2%98%E8%B4%B4/1.htm">粘贴</a><a class="tag" taget="_blank" href="/search/%E5%A4%8D%E5%88%B6/1.htm">复制</a><a class="tag" taget="_blank" href="/search/%E4%BF%9D%E5%AD%98%E5%8E%9F%E6%A0%BC%E5%BC%8F/1.htm">保存原格式</a><a class="tag" taget="_blank" href="/search/%E4%B8%8D%E5%8F%98%E5%BD%A2/1.htm">不变形</a> <div>    vi是linux中非常好用的文本编辑工具,功能强大无比,但对于复制带有缩进格式的内容时,粘贴的时候内容错位很严重,不会按照复制时的格式排版,vi能不能在粘贴时,按复制进的格式进行粘贴呢? 答案是肯定的,vi有一个很强大的命令可以实现此功能 。     在命令模式输入:set paste,则进入paste模式,这样再进行粘贴时</div> </li> <li><a href="/article/2542.htm" title="shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法" target="_blank">shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法</a> <span class="text-muted">dongwei_6688</span> <a class="tag" taget="_blank" href="/search/shell%E8%84%9A%E6%9C%AC/1.htm">shell脚本</a> <div>出现原因:windows上写的脚本,直接拷贝到linux系统上运行由于格式不兼容导致 解决办法: 1. 比如文件名为myshell.sh,vim myshell.sh 2. 执行vim中的命令 : set ff?查看文件格式,如果显示fileformat=dos,证明文件格式有问题 3. 执行vim中的命令 :set fileformat=unix 将文件格式改过来就可以了,然后:w</div> </li> <li><a href="/article/2669.htm" title="高一上学期难记忆单词" target="_blank">高一上学期难记忆单词</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/english/1.htm">english</a> <div>honest 诚实的;正直的 argue 争论 classical 古典的 hammer 锤子 share  分享;共有 sorrow 悲哀;悲痛 adventure 冒险 error 错误;差错 closet 壁橱;储藏室 pronounce 发音;宣告 repeat 重做;重复 majority 大多数;大半   native 本国的,本地的,本国</div> </li> <li><a href="/article/2923.htm" title="hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性" target="_blank">hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性</a> <span class="text-muted">frankco</span> <a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/hibernate%E6%9F%A5%E8%AF%A2/1.htm">hibernate查询</a><a class="tag" taget="_blank" href="/search/DTO/1.htm">DTO</a> <div>      DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。       简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。         有时候我们需要查询返回DTO对象,因为DTO</div> </li> <li><a href="/article/3050.htm" title="Partition List" target="_blank">Partition List</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/partition/1.htm">partition</a> <div>Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of th</div> </li> <li><a href="/article/3177.htm" title="Spring MVC测试框架详解——客户端测试" target="_blank">Spring MVC测试框架详解——客户端测试</a> <span class="text-muted">jinnianshilongnian</span> <div>上一篇《Spring MVC测试框架详解——服务端测试》已经介绍了服务端测试,接下来再看看如果测试Rest客户端,对于客户端测试以前经常使用的方法是启动一个内嵌的jetty/tomcat容器,然后发送真实的请求到相应的控制器;这种方式的缺点就是速度慢;自Spring 3.2开始提供了对RestTemplate的模拟服务器测试方式,也就是说使用RestTemplate测试时无须启动服务器,而是模拟一</div> </li> <li><a href="/article/3304.htm" title="关于推荐个人观点" target="_blank">关于推荐个人观点</a> <span class="text-muted">liyonghui160com</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/1.htm">推荐系统</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E4%BA%8E%E6%8E%A8%E8%8D%90%E4%B8%AA%E4%BA%BA%E8%A7%82%E7%82%B9/1.htm">关于推荐个人观点</a> <div>    回想起来,我也做推荐了3年多了,最近公司做了调整招聘了很多算法工程师,以为需要多么高大上的算法才能搭建起来的,从实践中走过来,我只想说【不是这样的】     第一次接触推荐系统是在四年前入职的时候,那时候,机器学习和大数据都是没有的概念,什么大数据处理开源软件根本不存在,我们用多台计算机web程序记录用户行为,用.net的w</div> </li> <li><a href="/article/3431.htm" title="不间断旋转的动画" target="_blank">不间断旋转的动画</a> <span class="text-muted">pangyulei</span> <a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a> <div> CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M</div> </li> <li><a href="/article/3558.htm" title="自定义annotation" target="_blank">自定义annotation</a> <span class="text-muted">sha1064616837</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/annotation/1.htm">annotation</a><a class="tag" taget="_blank" href="/search/reflect/1.htm">reflect</a> <div>对象有的属性在页面上可编辑,有的属性在页面只可读,以前都是我们在页面上写死的,时间一久有时候会混乱,此处通过自定义annotation在类属性中定义。越来越发现Java的Annotation真心很强大,可以帮我们省去很多代码,让代码看上去简洁。 下面这个例子 主要用到了 1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解 2.简单的反射 3.枚举 </div> </li> <li><a href="/article/3685.htm" title="Spring 源码" target="_blank">Spring 源码</a> <span class="text-muted">up2pu</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>1.Spring源代码 https://github.com/SpringSource/spring-framework/branches/3.2.x 注:兼容svn检出 2.运行脚本 import-into-eclipse.bat 注:需要设置JAVA_HOME为jdk 1.7 build.gradle compileJava { sourceCompatibilit</div> </li> <li><a href="/article/3812.htm" title="利用word分词来计算文本相似度" target="_blank">利用word分词来计算文本相似度</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D/1.htm">word分词</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%9C%AC%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">文本相似度</a><a class="tag" taget="_blank" href="/search/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">余弦相似度</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8D%95%E5%85%B1%E6%9C%89%E8%AF%8D/1.htm">简单共有词</a> <div>word分词提供了多种文本相似度计算方式: 方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度 实现类:org.apdplat.word.analysis.CosineTextSimilarity 用法如下: String text1 = "我爱购物"; String text2 = "我爱读书"; String text3 = </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>