HLS直播协议详解

文章目录

  • 前言
  • 一、HLS 协议简介
  • 二、HLS 总体框架
  • 三、HLS 优势及劣势
  • 四、HLS 主要的应用场景
  • 五、M3U8 详解
    • 1、简介
    • 2、一级 m3u8
    • 3、二级 m3u8
    • 4、tag 说明
      • ①、名词说明
      • ②、tag 分类
        • 1)Basic Tags
        • 2)Media Segment Tags
        • 3)Media Playlist Tags
        • 4)Master Playlist Tags
        • 5)Media or Master Playlist Tags
  • 六、HLS 协议详解
    • 1、HLS 协议规定
    • 2、HLS 协议说明
    • 3、播放模式
    • 4、TS 文件


前言

本文对 HLS 协议进行了详细的讲解,由浅入深,一点儿点儿揭开其神秘面纱。

首先我们先使用 ffmepg 对一段视频文件进行切片,视频所在路径:D:\Work\test
HLS直播协议详解_第1张图片
切片命令行如下:

ffmpeg -i SampleVideo_1280x720_20mb.mp4 -fflags flush_packets -max_delay 2 -flags -global_header -hls_time 5 -hls_list_size 0 -vcodec libx264 -acodec aac -r 30 -g 60 -y index.m3u8

这个命令是使用FFmpeg工具进行视频转码和分段处理的操作。下面是对每个参数的详细解释:

  • ffmpeg: FFmpeg命令行工具的名称,用于处理音视频文件。
  • -i SampleVideo_1280x720_20mb.mp4: 指定输入文件的路径和文件名。这里的输入文件是名为 “SampleVideo_1280x720_20mb.mp4” 的视频文件。
  • -fflags flush_packets: 强制立即刷新输出文件的数据包。
  • -max_delay 2: 设置最大延迟时间为2秒,以确保尽可能快地输出数据。
  • -flags -global_header: 禁用全局文件头,不将文件头写入每个分段文件。
  • -hls_time 5: 设置HLS(HTTP Live Streaming)分段的时长为5秒。这将影响生成的.m3u8文件中每个.ts分段文件的时长。
  • -hls_list_size 0: 设置.m3u8文件中包含的分段列表大小为0,表示将所有分段都包含在.m3u8文件中,而不生成分段列表文件。
  • -vcodec libx264: 指定使用libx264编码器进行视频编码。
  • -acodec aac: 指定使用AAC编码器进行音频编码。
  • -r 30: 设置输出视频的帧率为30帧/秒。
  • -g 60: 设置关键帧(I帧)之间的间隔为60帧。关键帧是视频编码中的重要帧,可以独立解码,而其他帧则依赖于关键帧进行解码。
  • -y index.m3u8: 将输出保存为名为"index.m3u8"的文件。这是HLS流的主索引文件,包含了指向各个分段文件的链接。

通过执行这个命令,FFmpeg将会对输入的视频文件进行转码和分段处理,并生成一个HLS流的主索引文件(index.m3u8)和一系列分段文件(.ts文件),用于实现视频的流式传输和播放。

在切片过程中,CPU 利用率飙升,这属于正常现象
HLS直播协议详解_第2张图片
切片后,可以在目录下看到下面的文件,ffmpeg 将源视频文件切成了 23 个子文件和一个 index.m3u8 文件
HLS直播协议详解_第3张图片
上面先有个基本的概念,下面开始我们的主题:HLS


一、HLS 协议简介

HLS 全称为 HTTP Live Streaming,是苹果公司提出的基于 HTTP 的流媒体网络传输协议。它的工作原理是把整个媒体流分成一个个小的基于 HTTP 的媒体分片来下载,每次只下载一些分片。在开始一个流媒体会话时,客户端会下载一个包含媒体分片的索引文件,即 extended M3U playlist 文件(m3u8),用于寻找可用的媒体分片。

HLS 中,索引文件可以嵌套,一般只有一级索引二级索引; 媒体流封分片装格式只支持 MPEG-2 传输流(ts)、WebVTT[WebVTT]文件或 Packed Audio 文件。

下图为索引文件(m3u8)和媒体分片(ts)之间的关系图:一级 m3u8 套二级 m3u8,二级 m3u8 描述 ts 分片。
HLS直播协议详解_第4张图片

二、HLS 总体框架

先看下图:
HLS直播协议详解_第5张图片

  • 服务器将媒体文件转换为 m3u8 及 ts 分片; 对于直播源,服务器需要实时动态更新。
  • 客户端请求 m3u8 文件,根据索引获取 ts 分片;点播与直播服务器不同的地方是,直播的 m3u8 文件会不断更新, 而点播的 m3u8 文件是不会变的,只需要客户端在开始时请求一次即可。

客户端与服务器通过 HTTP 协议进行交互,以两级 m3u8 嵌套为例,客户端先 GET 请求到一级 m3u8,一级 m3u8 里面包含了服务器端可以用于传播的一个或多个不同带宽的 URL,这 URL 可以获取到二级 m3u8;二级 m3u8 包含了多个 ts 分片的 duration 及其 URL, 最后通过这个 URL 下载 ts 分片。

交互的方式如下:
HLS直播协议详解_第6张图片

三、HLS 优势及劣势

优势:

  • 客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可。
  • 使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器。
  • 当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源(多码流自适应) ,允许流媒体会话适应不同的数据速率。

劣势:

  • 因其自身的实现方式, HLS 存在延迟(最少有一个分片),对于直播等实时敏感的场景,体验不好。

四、HLS 主要的应用场景

  • 跨平台PC 主要的直播方案是 RTMP,也有一些库能播放 HLS,譬如 jwplayer,基于 osmf 的 hls 插件也一大堆。所以实际上如果选一种协议能跨 PC/Android/IOS,那就是 HLS。
  • IOS 上苛刻的稳定性要求:IOS 上最稳定的当然是 HLS, 稳定性不差于 RTMP 在 PC-flash
    上的表现。
  • 友好的 CDN 分发方式:目前 CDN 对于 RTMP 也是基本协议,但是 HLS 分发的基础是 HTTP,所以 CDN 的接入和分发会比 RTMP 更加完善。能在各种 CDN 之间切换,RTMP 也能,只是可能需要对接测试。
  • 简单:HLS 作为流媒体协议非常简单,apple 支持得也很完善。Android 对 HLS 的支持也
    会越来越完善。至于 DASH/HDS,好像没有什么特别的理由,就像 linux 已经大行其道而且开放,其他的系统很难再广泛应用。

总之,SRS 支持 HLS 主要是作为输出的分发协议,直播以 RTMP+HLS 分发,满总各种应用场景。点播以 HLS 为主。

五、M3U8 详解

HLS 协议很大一部分内容即是对 M3U8 文本协议的描述。

1、简介

M3U8 即播放索引文件,也称为 Playlist,是由多个独立行组成的文本文件,必须通过 URI(.m3u8 或 .m3u)或者 HTTP Content-Type 来识别(application/vnd.apple.mpegurl 或 audio/mpegurl)。

每行由用 \n 或者 \r\n 来标识换行。每一行可以是一个 URI、空白行或是一个 以 # 号开头的字符串。

以 # 开头的是 tag 或者注释,以 #EXT 开头的是 tag, 其余的为注释, 在解析时应该忽略。URI 表示一个 ts 分片地址或是 Playlist 地址。 URI 可以用绝对地址或者相对地址,如果使用相对地址,那么是相对于当前 Playlist 的地址。有些 tag 带有属性值,多个属性用逗号分隔。

常见的 m3u8 文件如下所示:

2、一级 m3u8

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700,000
http://xxx.itv.cmvideo.cn/low.m3u8?channel-id=bstvod&Contentid=4007432528
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1300,000
http://xxx.itv.cmvideo.cn/mid.m3u8?channel-id=bstvod&Contentid=4007432527
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2300,000
http://xxx.itv.cmvideo.cn/high.m3u8?channel-id=bstvod&Contentid=4007432526

bandwidth 指 定 视 频 流 的 比 特 率 , PROGRAM-ID 无 用 无 需 关 注 , 每 一 个 #EXT-X-STREAM-INF 的下一行是二级 index 文件的路径, 可以用相对路径也可以用绝对路径。

例子中用的是相对路径。这个文件中记录了不同比特率视频流的二级 index 文件路径,客户端可以自己判断自己的现行网络带宽,来决定播放哪一个视频流。

也可以在网络带宽变化的时候平滑切换到和带宽匹配的视频流。

3、二级 m3u8

#EXTM3U
#EXT-X-VERSION:1
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:19674922
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:40Z
#EXTINF:10,
19674922.ts?
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:50Z
#EXTINF:10,
19674923.ts?
#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:34:00Z
#EXTINF:10,
19674924.ts?

4、tag 说明

①、名词说明

  • Media Playlist:二级 m3u8,携带 ts 分片 url 的 m3u8;
  • Master Playlist:一级 m3u8;
  • Media Segment:ts 分片;
  • Attribute Lists:属性列表

Attribute Lists :

  • 有的 tags 的值带有 Attribute Lists。
  • 一个 Attribute List 是一个用逗号分隔的 attribute/value 对列表
  • 格式为:AttributeName=AttributeValue。

②、tag 分类

tag 以 #EXT 开头,主要分为以下几类:

1)Basic Tags

Basic Tags 可以用在 Media Playlist 和 Master Playlist 里面。

  • EXTM3U:必须在文件的第一行,标识是一个 Extended M3U Playlist 文件。
  • EXT-X-VERSION:表示 Playlist 兼容的版本。
2)Media Segment Tags

每一个 Media Segment 通过一系列的 Media Segment tags 跟一个 URI 来指定。有的 Media Segment tags 只应用于下一个 segment,有的则是应用所有下面的 segments。一个 Media Segment tag 只能出现在 Media Playlist 里面。

  • EXTINF:用于指定 Media Segment 的 duration。
  • EXT-X-BYTERANGE:用于指定 URI 的 sub-range。
  • EXT-X-DISCONTINUITY:表示后续分片属性发生变化,如文件格式/编码/序号。
  • EXT-X-KEY:表示 Media Segment 已加密,该值用于解密。
  • EXT-X-MAP:表示 Media Segment 的头部信息,比如 PAT/PMT 或者 WebVTT 头。
  • EXT-X-PROGRAM-DATE-TIME:和 Media Segment 的第一个 sample 一起来确定时间戳。
3)Media Playlist Tags

Media Playlist tags 描述 Media Playlist 的全局参数。同样地,Media Playlist tags 只能出现在 Media Playlist 里面。

  • EXT-X-TARGETDURATION:用于指定最大的 Media Segment duration。
  • EXT-X-MEDIA-SEQUENCE:用于指定第一个 Media Segment 的序号。
  • EXT-X-DISCONTINUITY-SEQUENCE:用于不同 Variant Stream 之间同步。
  • EXT-X-ENDLIST:表示 Media Playlist 结束。
  • EXT-X-PLAYLIST-TYPE:可选,指定整个 Playlist 的类型。
  • EXT-X-I-FRAMES-ONLY:表示每个 Media Segment 均为 I-frame。
4)Master Playlist Tags

Master Playlist tags 定义 Variant Streams,Renditions 和其他显示的全局参数。Master Playlist tags 只能出现在 Master Playlist 中。

  • EXT-X-MEDIA:用于关联同一个内容的多个 Media Playlist 的多种翻译。
  • EXT-X-STREAM-INF:用于指定下级 Media Playlist 相关属性。
  • EXT-X-I-FRAME-STREAM-INF:与 EXT-X-STREAM-INF 类似,但指向的下级 Media Playlist 包含 Media Segment 均为 I-frame。
  • EXT-X-SESSION-DATA:可以随意存放一些 session 数据。
5)Media or Master Playlist Tags

这里的 tags 可以出现在 Media Playlist 或者 Master Playlist 中。但是如果同时出现在同一个 Master Playlist 和 Media Playlist 中时,必须为相同值。

  • EXT-X-INDEPENDENT-SEGMENTS:表示每个 Media Segment 可以独立解码。
  • EXT-X-START:标识一个优选的点来播放这个 Playlist。

六、HLS 协议详解

HLS 是提供一个 m3u8 地址:
Apple 的 Safari 浏览器直接就能打开 m3u8 地址, 譬如:http://demo.srs.com/live/livestream.m3u8

Android 不能直接打开, 需要使用 html5 的 video 标签, 然后在浏览器中打开这个页面即可,
譬如:


<video width="640" height="360"
autoplay controls autobuffer
src="http://demo.srs.com/live/livestream.m3u8"
type="application/vnd.apple.mpegurl">
video>

PC:video.js

1、HLS 协议规定

视频的封装格式TS

视频的编码格式为 H264,音频编码格式为 MP3、 AAC 或者 AC-3。

除了 TS 视频文件本身, 还定义了用来控制播放的 m3u8 文件(文本文件)

2、HLS 协议说明

HLS 的 m3u8,是一个 ts 的列表,也就是告诉客户端或浏览器可以播放这些 ts 文件, 譬如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:430
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:11.800
news-430.ts
#EXTINF:10.120
news-431.ts
#EXT-X-DISCONTINUITY
#EXTINF:11.952
news-430.ts
#EXTINF:12.640
news-431.ts
#EXTINF:11.160
news-432.ts
#EXT-X-DISCONTINUITY
#EXTINF:11.751
news-430.ts
#EXTINF:2.040
news-431.ts
#EXT-X-ENDLIST
  • EXTM3U
    • 每个 M3U 文件第一行必须是这个 tag,提供标示作用
  • EXT-X-VERSION
    • 用以标示协议版本。这里是 3,那么这里用的就是 HLS 协议第三个版本,此标签只能有 0 或 1 个, 不写代表使用版本 1
  • EXT-X-TARGETDURATION
    • 所有切片的最大时长,有些 Apple 设备这个参数不正确会无法播放。
  • EXT-X-MEDIA-SEQUENCE
    • 切片的开始序号。每一个切片都有唯一的序号,相邻之间序号+1。这个编号会继续增长,保证流的连续性。
  • EXTINF
    • ts 切片的实际时长。duration:媒体持续时间
    • #EXTINF ,</li> </ul> </li> <li><strong><font color="red">EXT-X-PLAYLIST-TYPE</font></strong> <ul> <li>类型,vod 表示点播,live 表示直播。</li> </ul> </li> <li><strong><font color="red">EXT-X-ENDLIST</font></strong> <ul> <li>文件结束符号,表示不再向播放列表文件添加媒体文件。</li> </ul> </li> </ul> <p>#EXT-X-PLAYLIST-TYPE:VOD 的意思是当前的视频流并不是一个直播流,而是点播流,换句话说就是该视频的全部的 ts 文件已经被生成好了,#EXT-X-ENDLIST 这个表示视频结束,有这个标志同时也说明当前的流是一个非直播流。</p> <h3>3、播放模式</h3> <p><font color="red">点播 VOD</font> 的特点就是当前时间点可以获取到所有 index 文件和 ts 文件,二级 index 文件中记录了所有 ts 文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的 m3u8 的结构。</p> <p><font color="red">Live 模式</font>就是实时生成 M3u8 和 ts 文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级 index 文件,以获得最新生成的 ts 文件播放视频。如果一个二级 index文件的末尾没有#EXT-X-ENDLIST 标志, 说明它是一个 Live 视频流。</p> <blockquote> <ul> <li>客户端在播放 VOD 模式的视频时其实只需要下载一次一级 index 文件和二级 index 文件就可以得到所有 ts 文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何 index文件,只需顺序下载 ts 文件并播放就可以了。</li> <li>但是 Live 模式下略有不同,因为播放的同时,新 ts 文件也在被生成中,所以客户端实际上是下载一次二级 index 文件,然后下载 ts 文件,再下载二级 index 文件(这个时候这个二级 index 文件已经被重写,记录了新生成的 ts 文件的下载地址),再下载新 ts 文件,如此反复进行播放。</li> </ul> </blockquote> <h3>4、TS 文件</h3> <p>ts 文件为<font color="red">传输流文件(MPEG2 - tranport stream),</font>视频编码主要格式 h264/mpeg4,音频为 acc/MP3。</p> <p><strong>ts 文件分为三层:</strong> ts 层(Transport Stream)、 pes 层(Packet Elemental Stream)、 es 层(Elementary Stream)</p> <p>es 层就是音视频压缩数据,pes 层是在音视频数据 es 上加了时间戳(pts,dts)等对数据帧的说明信息,ts 层就是在 pes 层加入数据流的识别和传输必须的信息。<br> <a href="http://img.e-com-net.com/image/info8/154953987e6a4de3967faaeac31c8df1.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/154953987e6a4de3967faaeac31c8df1.jpg" alt="HLS直播协议详解_第7张图片" width="650" height="408" style="border:1px solid black;"></a></p> <ul> <li><strong><font color="red">ts 层</font></strong> <ul> <li>ts 包大小固定为 188 字节,ts 层分为三个部分:ts header、adaptation field、payload。ts header 固定 4 个字节;adaptation field 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充;payload 是 pes 数据。</li> </ul> </li> <li><strong><font color="red">pes 层</font></strong> <ul> <li>pes 层是在每一个视频/音频帧上加入了时间戳等信息,pes 包内容很多,我们只留下最常用的。</li> </ul> </li> <li><strong><font color="red">es 层</font></strong> <ul> <li>es 层指的就是音视频数据, 我们只介绍 h.264 视频。</li> </ul> </li> </ul> <p>h.264 视频:打包 h.264 数据我们必须给视频数据加上一个 nalu(Network Abstraction Layer unit),nalu 包括 nalu header 和 nalu type,nalu header 固定为 0x00000001(帧开始)或 0x000001(帧中)。</p> <p>h.264 的数据是由 slice 组成的, slice 的内容包括:视频、sps、pps 等。</p> <p>nalu type 决定了后面的 h.264 数据内容。<br> <a href="http://img.e-com-net.com/image/info8/a020ee7e08c844f3b61f48a69b66a20b.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/a020ee7e08c844f3b61f48a69b66a20b.jpg" alt="HLS直播协议详解_第8张图片" width="650" height="755" style="border:1px solid black;"></a></p> <hr> <p><mark>我的qq:2442391036,欢迎交流!</mark></p> <hr> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1719025902391734272"></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">你可能感兴趣的:(音视频开发,HLS,M3U8)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835319487742701568.htm" title="音视频知识图谱 2022.04" target="_blank">音视频知识图谱 2022.04</a> <span class="text-muted">关键帧Keyframe</span> <div>前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看《音视频面试题集锦2022.04》。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱。下面是2022.04月知识图谱新增的内容节选:1)图谱路径:**采集/音频采集/声音三要素/响度******主观计量响</div> </li> <li><a href="/article/1835210310995243008.htm" title="FPGA器件在线配置方法概述" target="_blank">FPGA器件在线配置方法概述</a> <span class="text-muted">fpga和matlab</span> <a class="tag" taget="_blank" href="/search/FPGA/1.htm">FPGA</a><a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/FPGA/1.htm">FPGA</a><a class="tag" taget="_blank" href="/search/%E5%9C%A8%E7%BA%BF%E9%85%8D%E7%BD%AE/1.htm">在线配置</a> <div>目录1.配置电路结构和原理2.ICR控制电路软件3.几种常见的FPGA在线配置方法3.1动态部分重配置(PartialReconfiguration,PR)3.2在系统编程(In-SystemProgramming,ISP)3.3多比特流配置(Multi-BitstreamConfiguration)3.4远程更新与配置3.5使用OpenCL或HLS工具FPGA(Field-Programmabl</div> </li> <li><a href="/article/1833703073768370176.htm" title="下载并解密的ts文件,发现一部分ts文件能播放,一部分不能播放" target="_blank">下载并解密的ts文件,发现一部分ts文件能播放,一部分不能播放</a> <span class="text-muted">weixin_41956627</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>问题说明按参考资料中两个链接,获取网站上的m3u8视频,下载并解密了ts文件,发现一部分ts文件能播放,一部分不能播放(解密失败)。解决经过反复尝试,发现疑似是多线程下载ts文件时,解密函数cryptor=AES.new(key,AES.MODE_CBC,key)的问题。当解密函数在线程函数外面(即所有线程每次运行都是用同一个cryptor)发现均有一定概率导致ts文件无法播放。当解密函数在线程函</div> </li> <li><a href="/article/1833390525701517312.htm" title="使用flv.js + websokect播放rtsp格式视频流" target="_blank">使用flv.js + websokect播放rtsp格式视频流</a> <span class="text-muted">音视频开发老马</span> <a class="tag" taget="_blank" href="/search/%E6%B5%81%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">流媒体服务器</a><a class="tag" taget="_blank" href="/search/Android%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91/1.htm">Android音视频开发</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91/1.htm">音视频开发</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</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/flv/1.htm">flv</a><a class="tag" taget="_blank" href="/search/%E6%B5%81%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">流媒体服务器</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91/1.htm">音视频开发</a> <div>1.问题背景在最近的项目中,涉及到海康接入的视频播放的问题,海康这边获取到的视频流是rtsp格式,web端目前没有直接可以播放的组件,于是最开始是后端处理了视频流,返回hls格式的m3u8地址,这样用videojs插件就可以播放了,但是问题就是处理了的m3u8地址播放效果非常差,第一次加载时间较长,且播放过程中很卡,尤其是项目的界面做的是视频监控墙,不止一个视频,导致没办法看了。想着最好的方式还是</div> </li> <li><a href="/article/1833215304533110784.htm" title="which Linux" target="_blank">which Linux</a> <span class="text-muted">Caspian Wren</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>在Linux系统中,which命令用于定位并显示指定命令的完整路径。它会搜索系统的PATH变量中指定的目录,找到并输出第一个匹配的命令的完整路径。这对于确定在系统中执行哪个特定的命令很有用。例如,如果您想知道ls命令的完整路径,可以在终端中输入:whichls它将输出类似于/bin/ls的路径。which命令通常用于验证系统中是否安装了某个特定的命令,并且在脚本中查找命令的位置。</div> </li> <li><a href="/article/1832875630803382272.htm" title="ios流媒体直播整个框架介绍(HLS、RTSP)" target="_blank">ios流媒体直播整个框架介绍(HLS、RTSP)</a> <span class="text-muted">少一些浮躁__</span> <a class="tag" taget="_blank" href="/search/IOS/1.htm">IOS</a> <div>一、HTTP(WebService)基于HTTP的渐进下载ProgressiveDownload流媒体播放仅是在完全下载后再播放模式基础上做了一些小的改进。与下载播放模式中必须等待整个文件下载完毕后才能开始播放不同,渐进下载客户端在开始播放之前仅需等待一段较短的时间用于下载和缓冲该媒体文件最前面的一部分数据,之后便可以一边下载一边播放。在正式开始播放之前的这一小段缓冲应使得后续即使在网络较为拥塞的</div> </li> <li><a href="/article/1832593615667425280.htm" title="第11周作业---HLS编程环境入门" target="_blank">第11周作业---HLS编程环境入门</a> <span class="text-muted">pss_runner</span> <div>目录HLS概念HLS是什么HLS与VHDL/Verilog有什么关系?HLS技术问题HLS开发步骤环境搭建编写test.cpp文件预编译cpp文件HLS概念HLS是什么高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++、SystemC等,通常有着较高的抽象度,并且往往不具有时</div> </li> <li><a href="/article/1832302253193654272.htm" title="2024年Python最新Python爬虫入门教程30:爬取拉勾网招聘数据信息(1)" target="_blank">2024年Python最新Python爬虫入门教程30:爬取拉勾网招聘数据信息(1)</a> <span class="text-muted">2401_84584609</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a> <div>Python爬虫入门教程23:A站视频的爬取,解密m3u8视频格式Python爬虫入门教程24:下载某网站付费文档保存PDFPython爬虫入门教程25:绕过JS加密参数,实现批量下载抖某音无水印视频内容Python爬虫入门教程26:快手视频网站数据内容下载Python爬虫入门教程27:爬取某电商平台数据内容并做数据可视化Python爬虫入门教程28:爬取微博热搜榜并做动态数据展示Python爬虫</div> </li> <li><a href="/article/1832070066338885632.htm" title="FFmpeg任意文件读取漏洞分析" target="_blank">FFmpeg任意文件读取漏洞分析</a> <span class="text-muted">音视频开发老马</span> <a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a> <div>背景介绍FFmpeg是一套目前非常流行的可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。目前有非常多的视音频软件或是视频网站、手机APP都采用了这个库,但是这个库历史上曝出的漏洞也非常之多。这次的漏洞是利用了ffmpeg可以处理HLS播放列表的功能,在AVI文件中的GAB2字幕块中嵌入了一个HLS文件,然后提供给ffmpeg进行转</div> </li> <li><a href="/article/1831735356047847424.htm" title="OpenglEs之EGL环境搭建" target="_blank">OpenglEs之EGL环境搭建</a> <span class="text-muted">FlyerGo</span> <a class="tag" taget="_blank" href="/search/Opengl/1.htm">Opengl</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/opengl/1.htm">opengl</a> <div>前言前面我们发布了一系列的入门教程,例如C++系列的指针扫盲、多线程的使用等,JNI入门系列,ffmpeg入门系列等,有感兴趣的童鞋们可以关注往回自行查阅。今天我们的主题依然是音视频开发的范畴,做过音视频开发的都知道Opengl也是音视频开发中的一项重要技能,特别是涉及到视频录制、特效处理、画质渲染细分功能。因此后续笔者打算再出一系列的OpenglES的学习笔记,希望能与大家共同温故知新。因为前面</div> </li> <li><a href="/article/1831389313313632256.htm" title="Android 音视频开发:详讲 AudioTrack 播放PCM音频【附源码】" target="_blank">Android 音视频开发:详讲 AudioTrack 播放PCM音频【附源码】</a> <span class="text-muted">小驰行动派</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/pcm/1.htm">pcm</a> <div>一、AudioTrack基本使用AudioTrack类可以完成Android平台上音频数据的输出任务。AudioTrack有两种数据加载模式(MODE_STREAM和MODE_STATIC),对应的是数据加载模式和音频流类型,对应着两种完全不同的使用场景。MODE_STREAM:在这种模式下,通过write一次次把音频数据写到AudioTrack中。这和平时通过write系统调用往文件中写数据类似</div> </li> <li><a href="/article/1831226727108538368.htm" title="音视频开发—FFmpeg打开麦克风,采集音频数据" target="_blank">音视频开发—FFmpeg打开麦克风,采集音频数据</a> <span class="text-muted">Trump. yang</span> <a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91/1.htm">音视频开发</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a> <div>文章目录1.使用命令行实现采集PCM数据2.使用代码实现3.播放PCM4.PCM转换为WAV1.使用命令行实现采集PCM数据确保你的系统有FFmpeg安装。你可以通过在终端运行ffmpeg-version来检查是否已安装。找出你的麦克风设备名。在Linux中,你可以使用arecord-l命令列出所有的音频录制设备。使用FFmpeg录制音频。下面是一个基本的命令示例,它使用FFmpeg从麦克风捕获音</div> </li> <li><a href="/article/1831167474188513280.htm" title="Qt/C++ 音视频开发 - FFmpeg保存裸流" target="_blank">Qt/C++ 音视频开发 - FFmpeg保存裸流</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%E6%97%B6%E4%BB%A3/1.htm">人工智能时代</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a> <div>Qt/C++音视频开发-FFmpeg保存裸流介绍FFmpeg是一个开源的多媒体框架,能够处理音频、视频及其他多媒体文件和流。裸流指的是未经封装处理的原始音视频数据。使用FFmpeg保存裸流,可以通过高效的方式处理并存储音视频数据。应用使用场景实时流媒体传输:在没有时间进行复杂封装的情况下,将音视频数据直接传输。低延迟应用:减少因为封装产生的冗余数据和延迟。数据分析:对原始音视频数据进行深入分析时,</div> </li> <li><a href="/article/1830445099503415296.htm" title="HLS点播实现(H.264和AAC码流)" target="_blank">HLS点播实现(H.264和AAC码流)</a> <span class="text-muted">辉辉岁月</span> <div>前言VideoToolbox硬编码H.264使用AudioToolbox编码AAC使用AudioToolbox播放AAC在前面我们介绍了从麦克风采集声音并用AudioToolbox编码成AAC码流和从摄像头采集图像并用VideoToolbox编码成H.264码流,这次我们不使用VideoToolbox和AudioToolbox播放音视频,而是把这两个格式的文件打包成TS流,并用通过HLS协议在浏览</div> </li> <li><a href="/article/1829918470926594048.htm" title="直播源格式转换教程——rtmp/rtsp/http/m3u8!!" target="_blank">直播源格式转换教程——rtmp/rtsp/http/m3u8!!</a> <span class="text-muted">weixin_30418341</span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>之前寻找直播源,发现好多rtmp开头的,或者是rtsp开头的,但是ATV里面的个人链接是支持m3u8格式的。怎么办?小编发现了几个规律,网友可作参考。现在流行的直播地址差不多就这几种需要说明的是并不是所有的地址改成这样都能播需要自己测试。测试的,可用软件,具体参考:</div> </li> <li><a href="/article/1829496042077384704.htm" title="前端vue播放m3u8、flv、mp4视频的方法_vue mp4(1)" target="_blank">前端vue播放m3u8、flv、mp4视频的方法_vue mp4(1)</a> <span class="text-muted">2401_84437982</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a> <div>//this.db.src([//{//src:“https://e-sign.dms.t.cn-np.com/files/m3u8_file/c4b94118-3c8d-4410-9987-985c2b44c278/c4b94118-3c8d-4410-9987-985c2b44c278.m3u8”,//地址//type:“application/x-mpegURL”,//告诉videojs,这</div> </li> <li><a href="/article/1829097559956746240.htm" title="【Qt | 音视频学习路线(高薪路线 AI)】" target="_blank">【Qt | 音视频学习路线(高薪路线 AI)】</a> <span class="text-muted">Qt历险记</span> <a class="tag" taget="_blank" href="/search/Qt/1.htm">Qt</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E7%BA%A7%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">高级开发工程师</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>Answer学习Qt音视频开发的学习路线可以分为以下几个阶段:1.基础知识准备C++编程基础:Qt主要使用C++,因此需要有扎实的C++编程基础。计算机图形学基础:了解基本的图形学概念,如图像处理、渲染等。音视频基础:了解音视频的基本概念,如编码、解码、格式等。2.学习Qt框架Qt基础:学习Qt的基本概念,如信号与槽、事件处理、界面布局等。QtWidgets:掌握QtWidgets模块,用于创建传</div> </li> <li><a href="/article/1829077014238294016.htm" title="Qt/C++ 音视频开发 - VLC 回调处理" target="_blank">Qt/C++ 音视频开发 - VLC 回调处理</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%E6%97%B6%E4%BB%A3/1.htm">人工智能时代</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a> <div>Qt/C++音视频开发-VLC回调处理介绍Qt是一个跨平台的C++应用程序开发框架,VLC则是一个广泛使用的多媒体播放器和框架。通过结合这两者,我们可以构建一个功能强大的音视频应用。在这个过程中,VLC提供了丰富的API和回调机制,让我们能够方便地处理音视频流。应用使用场景实时视频流处理:用于监控系统,直播平台等。多媒体播放器:构建一个自定义的音视频播放器。视频分析与处理:如视频剪辑、特效添加等。</div> </li> <li><a href="/article/1828760076794556416.htm" title="Qt/C++ 音视频开发 - VLC 解码播放(代码+部署测试)" target="_blank">Qt/C++ 音视频开发 - VLC 解码播放(代码+部署测试)</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%E6%97%B6%E4%BB%A3/1.htm">人工智能时代</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a> <div>Qt/C++音视频开发-VLC解码播放介绍Qt是一个跨平台的C++应用程序框架,广泛用于GUI程序和跨平台应用。VLC是一个开源的跨平台多媒体播放器及框架,可以播放大多数多媒体文件及流媒体协议。结合两者可以实现强大的音视频处理功能。在Qt/C++项目中集成VLC可以实现高效的音视频解码和播放功能,从而增强了应用的多媒体处理能力。应用使用场景多媒体播放器:开发支持多种格式的音视频播放器。实时流媒体播</div> </li> <li><a href="/article/1828557754290237440.htm" title="【React】react实现前端播放m3u8格式视频" target="_blank">【React】react实现前端播放m3u8格式视频</a> <span class="text-muted">ah_biao</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86/1.htm">视频处理</a><a class="tag" taget="_blank" href="/search/hls/1.htm">hls</a> <div>DPlayer文档:http://dplayer.js.org导入依赖yarnadddplayerhls.js在头部引入依赖importDPlayerfrom'dplayer'constHls=require('hls.js')新建一个div初始化播放器componentDidMount(){video=newDPlayer({container:document.getElementById('</div> </li> <li><a href="/article/1826948837231652864.htm" title="音视频常见问题(七):首开慢" target="_blank">音视频常见问题(七):首开慢</a> <span class="text-muted">即构开发者</span> <div>本文主要讨论音视频应用中的首开慢问题,文章介绍了首开慢的产生原因:DNS解析耗时、网络传输协议耗时、传输网络调度耗时,并提供了排查方式和解决方案。即构科技的ExpressSDK和MSDN网络可以有效的解决首开慢问题,且节省开发成本。一、前言对于音视频开发者来说,掌握排查问题的技术技巧方法是非常必要的,排查问题的技术方法也能够帮助开发者更好地了解音视频技术的原理和工作机制,从而更加深入地理解音视频开</div> </li> <li><a href="/article/1826690432671772672.htm" title="Vitis/Vivado HLS 流水线中的存储依赖——解决方法之二" target="_blank">Vitis/Vivado HLS 流水线中的存储依赖——解决方法之二</a> <span class="text-muted">优质蛋白 - 芯片打工人</span> <a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B1%82%E6%AC%A1%E7%BB%BC%E5%90%88HLS/1.htm">高层次综合HLS</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/fpga/1.htm">fpga</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a> <div>和上一篇内容Vitis/VivadoHLS流水线中的存储依赖——解决方法之一中一样,考虑以下函数模块,voidExampleModule(hls::streamstrm_in,hls::streamstrm_out){#pragmaHLSINTERFACEmode=ap_ctrl_noneport=returnt_datamem[2*N];#pragmaHLSBIND_STORAGEvariabl</div> </li> <li><a href="/article/1772624844177866752.htm" title="【Python】 Python脚本实现某平台视频流下载" target="_blank">【Python】 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/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>亲爱的玛丽我会想念着你我是多么的讨厌分离加油站旁的海鸥机场路上的松柏挥挥手眼泪就落下来我多想和那些光阴永远住下来我不能我不能赵雷《玛丽》在视频内容的分发上,m3u8格式的视频流越来越常见。它将视频切分成多个小片段(TS文件),然后通过索引文件(m3u8文件)来组织播放顺序,有效地支持了视频的流式传输。这篇博客将引导您使用Python脚本来下载m3u8格式的视频流,并将其合并成一个单一的视频文件。准</div> </li> <li><a href="/article/1772492045785563136.htm" title="总结近一年折腾的那些事情-致敬Frp神器" target="_blank">总结近一年折腾的那些事情-致敬Frp神器</a> <span class="text-muted">WarmSword</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%85%B7/1.htm">工具</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/p2p/1.htm">p2p</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a> <div>蓦然回首,发现中年的自己,假期的日常主要就是休息遛娃游玩,好久没有写一写博客了。自己近1年有一些自己闲暇的时间的时候,其实也在折腾一些事情。gohls折腾的事情,主要是娱乐好玩工具性的一些东西,比如抄了一下gohls这个项目GitHub-shimberger/gohls:Aserverthatexposesadirectoryforvideostreamingviawebinterface,在家里</div> </li> <li><a href="/article/1767733955911548928.htm" title="C#/.Net 多线程下载m3u8视频" target="_blank">C#/.Net 多线程下载m3u8视频</a> <span class="text-muted">weixin_42199478</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/.netcore/1.htm">.netcore</a> <div>C#/.Net多线程下载m3u8视频下载网络文件方法下载m3u8.HttpGet()是我自己封装的HTTP请求方法下载网络文件方法//////下载网络文件//////文件地址///保存路径publicstaticvoidDownloadFile(thisstringurl,stringsavePath){WebClientwc=newWebClient();//从路径中取得文件名称varname=</div> </li> <li><a href="/article/1761471008155459584.htm" title="又拍云传输协议对比及指标" target="_blank">又拍云传输协议对比及指标</a> <span class="text-muted">Allan_Zeng</span> <div>又拍云一站式直播解决方案基于又拍云CDN,支持RTMP、HTTP-FLV和HLS三大直播协议,并且通过智能调度、链路保障、追帧处理、丢帧处理以及业界首创的HLS+技术,将RTMP、HTTP-FLV直播延迟控制在1秒内,将HLS直播延时控制在4秒左右。</div> </li> <li><a href="/article/1760570006069891072.htm" title="Mysql常用命令" target="_blank">Mysql常用命令</a> <span class="text-muted">有条理hac</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>Mysql常用命令下载远程的查询到的数据到本地(在哪个文件夹下执行就保存到哪个文件夹下):mysql-h10.172.*-uroot-pxxx-Alittlec_*-e"select*fromt_m3u8_*;">test.csv</div> </li> <li><a href="/article/1759948306491994112.htm" title="带tkinter界面的m3u8单程下载" target="_blank">带tkinter界面的m3u8单程下载</a> <span class="text-muted">卡卡啦啦_</span> <div>采用tkinter模块搭建GUI界面image代码如下:importrequestsfromtkinterimport*header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.132Safari/537.36'}defts_url():</div> </li> <li><a href="/article/1759936693386964992.htm" title="除法器 c语言 模拟,用Vivado-HLS实现低latency除法器" target="_blank">除法器 c语言 模拟,用Vivado-HLS实现低latency除法器</a> <span class="text-muted">小小羊羊羊</span> <a class="tag" taget="_blank" href="/search/%E9%99%A4%E6%B3%95%E5%99%A8/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/%E6%A8%A1%E6%8B%9F/1.htm">模拟</a> <div>GeorgeWang–XilinxDSPSpecialist1VivadoHLS简介XilinxVivadoHigh-LevelSynthesis(HLS)工具将C,C++,或者SystemC设计规范,算法转成RegisterTransferLevel(RTL)实现,可综合到XilinxFPGA。将DSP算法快速转到RTLFPGA实现将C至RTL时间缩短4倍基于C语言的验证时间缩短100倍RTL仿</div> </li> <li><a href="/article/1759932106663882752.htm" title="【从Python基础到深度学习】 8. VIM两种状态" target="_blank">【从Python基础到深度学习】 8. VIM两种状态</a> <span class="text-muted">风筝超冷</span> <a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E8%BE%91%E5%99%A8/1.htm">编辑器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>一、安装sudoaptinstallvim二、VIM两种模式-命令状态/编辑状态1.1进入/退出VIM进入VIMvim退出vim:q2.2根目录下添加配置文件window下创建vimrc类型文件内容如下:setnusetcursorlinesethlsearchsettabstop=4使用Winscp将vimrc文件拖入根目录下(Winscp使用见【从Python基础到深度学习】3.Winscp与</div> </li> <li><a href="/article/9.htm" title="apache ftpserver-CentOS config" target="_blank">apache ftpserver-CentOS config</a> <span class="text-muted">gengzg</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div><server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://mina.apache.o</div> </li> <li><a href="/article/136.htm" title="优化MySQL数据库性能的八种方法" target="_blank">优化MySQL数据库性能的八种方法</a> <span class="text-muted">AILIKES</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、选取最适用的字段属性   MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很</div> </li> <li><a href="/article/263.htm" title="JeeSite 企业信息化快速开发平台" target="_blank">JeeSite 企业信息化快速开发平台</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/JeeSite/1.htm">JeeSite</a> <div>JeeSite 企业信息化快速开发平台 平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台。 JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流</div> </li> <li><a href="/article/390.htm" title="通过Spring Mail Api发送邮件" target="_blank">通过Spring Mail Api发送邮件</a> <span class="text-muted">120153216</span> <a class="tag" taget="_blank" href="/search/%E9%82%AE%E4%BB%B6/1.htm">邮件</a><a class="tag" taget="_blank" href="/search/main/1.htm">main</a> <div>原文地址:http://www.open-open.com/lib/view/open1346857871615.html 使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章。 【Spring Mail API】 Spring Mail API都在org.spri</div> </li> <li><a href="/article/517.htm" title="Pysvn 程序员使用指南" target="_blank">Pysvn 程序员使用指南</a> <span class="text-muted">2002wmj</span> <a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a> <div>源文件:http://ju.outofmemory.cn/entry/35762 这是一篇关于pysvn模块的指南. 完整和详细的API请参考 http://pysvn.tigris.org/docs/pysvn_prog_ref.html. pysvn是操作Subversion版本控制的Python接口模块. 这个API接口可以管理一个工作副本, 查询档案库, 和同步两个. 该</div> </li> <li><a href="/article/644.htm" title="在SQLSERVER中查找被阻塞和正在被阻塞的SQL" target="_blank">在SQLSERVER中查找被阻塞和正在被阻塞的SQL</a> <span class="text-muted">357029540</span> <a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a> <div>SELECT  R.session_id AS BlockedSessionID ,          S.session_id AS BlockingSessionID ,          Q1.text AS Block</div> </li> <li><a href="/article/771.htm" title="Intent 常用的用法备忘" target="_blank">Intent 常用的用法备忘</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/Blog/1.htm">Blog</a><a class="tag" taget="_blank" href="/search/F%23/1.htm">F#</a> <div>Intent     应该算是Android中特有的东西。你可以在Intent中指定程序 要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料 。都指定好后,只要调用startActivity(),Android系统 会自动寻找最符合你指定要求的应用 程序,并执行该程序。 下面列出几种Intent 的用法 显示网页: </div> </li> <li><a href="/article/898.htm" title="Spring定时器时间配置" target="_blank">Spring定时器时间配置</a> <span class="text-muted">adminjun</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E9%85%8D%E7%BD%AE/1.htm">时间配置</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a> <div>红圈中的值由6个数字组成,中间用空格分隔。第一个数字表示定时任务执行时间的秒,第二个数字表示分钟,第三个数字表示小时,后面三个数字表示日,月,年,< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 测试的时候,由于是每天定时执行,所以后面三个数</div> </li> <li><a href="/article/1025.htm" title="POJ 2421 Constructing Roads 最小生成树" target="_blank">POJ 2421 Constructing Roads 最小生成树</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/1.htm">最小生成树</a> <div>来源:http://poj.org/problem?id=2421 题意:还是给你n个点,然后求最小生成树。特殊之处在于有一些点之间已经连上了边。 思路:对于已经有边的点,特殊标记一下,加边的时候把这些边的权值赋值为0即可。这样就可以既保证这些边一定存在,又保证了所求的结果正确。 代码: #include <iostream> #include <cstdio></div> </li> <li><a href="/article/1152.htm" title="重构笔记——提取方法(Extract Method)" target="_blank">重构笔记——提取方法(Extract Method)</a> <span class="text-muted">ayaoxinchao</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E7%82%BC%E5%87%BD%E6%95%B0/1.htm">提炼函数</a><a class="tag" taget="_blank" href="/search/%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F/1.htm">局部变量</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E5%8F%96%E6%96%B9%E6%B3%95/1.htm">提取方法</a> <div>提取方法(Extract Method)是最常用的重构手法之一。当看到一个方法过长或者方法很难让人理解其意图的时候,这时候就可以用提取方法这种重构手法。   下面是我学习这个重构手法的笔记:   提取方法看起来好像仅仅是将被提取方法中的一段代码,放到目标方法中。其实,当方法足够复杂的时候,提取方法也会变得复杂。当然,如果提取方法这种重构手法无法进行时,就可能需要选择其他</div> </li> <li><a href="/article/1279.htm" title="为UILabel添加点击事件" target="_blank">为UILabel添加点击事件</a> <span class="text-muted">bewithme</span> <a class="tag" taget="_blank" href="/search/UILabel/1.htm">UILabel</a> <div>    默认情况下UILabel是不支持点击事件的,网上查了查居然没有一个是完整的答案,现在我提供一个完整的代码。   UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, listV.frame.size.width - 60, listV.frame.size.height)]</div> </li> <li><a href="/article/1406.htm" title="NoSQL数据库之Redis数据库管理(PHP-REDIS实例)" target="_blank">NoSQL数据库之Redis数据库管理(PHP-REDIS实例)</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.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost"); //授权 $redis->auth("lamplijie"); //相关操</div> </li> <li><a href="/article/1533.htm" title="SecureCRT使用备注" target="_blank">SecureCRT使用备注</a> <span class="text-muted">bingyingao</span> <a class="tag" taget="_blank" href="/search/secureCRT/1.htm">secureCRT</a><a class="tag" taget="_blank" href="/search/%E6%AF%8F%E9%A1%B5/1.htm">每页</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E6%95%B0/1.htm">行数</a> <div>SecureCRT日志和卷屏行数设置 一、使用securecrt时,设置自动日志记录功能。 1、在C:\Program Files\SecureCRT\下新建一个文件夹(也就是你的CRT可执行文件的路径),命名为Logs; 2、点击Options -> Global Options -> Default Session -> Edite Default Sett</div> </li> <li><a href="/article/1660.htm" title="【Scala九】Scala核心三:泛型" target="_blank">【Scala九】Scala核心三:泛型</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>泛型类 package spark.examples.scala.generics class GenericClass[K, V](val k: K, val v: V) { def print() { println(k + "," + v) } } object GenericClass { def main(args: Arr</div> </li> <li><a href="/article/1787.htm" title="素数与音乐" target="_blank">素数与音乐</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/%E7%B4%A0%E6%95%B0/1.htm">素数</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%A6/1.htm">数学</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a> <div>    由于一直在看haskell,不可避免的接触到了很多数学知识,其中数论最多,如素数,斐波那契数列等,很多在学生时代无法理解的数学现在似乎也能领悟到那么一点。     闲暇之余,从图书馆找了<<The music of primes>>和<<世界数学通史>>读了几遍。其中素数的音乐这本书与软件界熟知的&l</div> </li> <li><a href="/article/1914.htm" title="Java-Collections Framework学习与总结-IdentityHashMap" target="_blank">Java-Collections Framework学习与总结-IdentityHashMap</a> <span class="text-muted">BrokenDreams</span> <a class="tag" taget="_blank" href="/search/Collections/1.htm">Collections</a> <div>        这篇总结一下java.util.IdentityHashMap。从类名上可以猜到,这个类本质应该还是一个散列表,只是前面有Identity修饰,是一种特殊的HashMap。         简单的说,IdentityHashMap和HashM</div> </li> <li><a href="/article/2041.htm" title="读《研磨设计模式》-代码笔记-享元模式-Flyweight" target="_blank">读《研磨设计模式》-代码笔记-享元模式-Flyweight</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/ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java</div> </li> <li><a href="/article/2168.htm" title="PS人像润饰&调色教程集锦" target="_blank">PS人像润饰&调色教程集锦</a> <span class="text-muted">cherishLC</span> <a class="tag" taget="_blank" href="/search/PS/1.htm">PS</a> <div>  1、仿制图章沿轮廓润饰——柔化图像,凸显轮廓 http://www.howzhi.com/course/retouching/   新建一个透明图层,使用仿制图章不断Alt+鼠标左键选点,设置透明度为21%,大小为修饰区域的1/3左右(比如胳膊宽度的1/3),再沿纹理方向(比如胳膊方向)进行修饰。   所有修饰完成后,对该润饰图层添加噪声,噪声大小应该和</div> </li> <li><a href="/article/2295.htm" title="更新多个字段的UPDATE语句" target="_blank">更新多个字段的UPDATE语句</a> <span class="text-muted">crabdave</span> <a class="tag" taget="_blank" href="/search/update/1.htm">update</a> <div>更新多个字段的UPDATE语句                    update tableA a set (a.v1, a.v2, a.v3, a.v4) = --使用括号确定更新的字段范围 </div> </li> <li><a href="/article/2422.htm" title="hive实例讲解实现in和not in子句" target="_blank">hive实例讲解实现in和not in子句</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/not+in/1.htm">not in</a><a class="tag" taget="_blank" href="/search/in/1.htm">in</a> <div>本文转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html 当前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含</div> </li> <li><a href="/article/2549.htm" title="一道24点的10+种非人类解法(2,3,10,10)" target="_blank">一道24点的10+种非人类解法(2,3,10,10)</a> <span class="text-muted">dsjt</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>这是人类算24点的方法?!!! 事件缘由:今天晚上突然看到一条24点状态,当时惊为天人,这NM叫人啊?以下是那条状态 朱明西 : 24点,算2 3 10 10,我LX炮狗等面对四张牌痛不欲生,结果跑跑同学扫了一眼说,算出来了,2的10次方减10的3次方。。我草这是人类的算24点啊。。 然后么。。。我就在深夜很得瑟的问室友求室友算 刚出完题,文哥的暴走之旅开始了 5秒后</div> </li> <li><a href="/article/2676.htm" title="关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题" target="_blank">关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a><a class="tag" taget="_blank" href="/search/framework/1.htm">framework</a> <div>在使用 YIi的路径管理工具时,发现了一个问题。                    <?php         </div> </li> <li><a href="/article/2803.htm" title="对象与关系之间的矛盾:“阻抗失配”效应[转]" target="_blank">对象与关系之间的矛盾:“阻抗失配”效应[转]</a> <span class="text-muted">come_for_dream</span> <a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1/1.htm">对象</a> <div>概述   “阻抗失配”这一词组通常用来描述面向对象应用向传统的关系数据库(RDBMS)存放数据时所遇到的数据表述不一致问题。C++程序员已经被这个问题困扰了好多年,而现在的Java程序员和其它面向对象开发人员也对这个问题深感头痛。   “阻抗失配”产生的原因是因为对象模型与关系模型之间缺乏固有的亲合力。“阻抗失配”所带来的问题包括:类的层次关系必须绑定为关系模式(将对象</div> </li> <li><a href="/article/2930.htm" title="学习编程那点事" target="_blank">学习编程那点事</a> <span class="text-muted">gcq511120594</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a> <div>一年前的夏天,我还在纠结要不要改行,要不要去学php?能学到真本事吗?改行能成功吗?太多的问题,我终于不顾一切,下定决心,辞去了工作,来到传说中的帝都。老师给的乘车方式还算有效,很顺利的就到了学校,赶巧了,正好学校搬到了新校区。先安顿了下来,过了个轻松的周末,第一次到帝都,逛逛吧! 接下来的周一,是我噩梦的开始,学习内容对我这个零基础的人来说,除了勉强完成老师布置的作业外,我已经没有时间和精力去</div> </li> <li><a href="/article/3057.htm" title="Reverse Linked List II" target="_blank">Reverse Linked List II</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/list/1.htm">list</a> <div>Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return </div> </li> <li><a href="/article/3184.htm" title="Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介" target="_blank">Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a> <div>目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异常处理 Spring4.1新特性——数据库集成测试脚本初始化 Spring4.1新特性——Spring MVC增强 Spring4.1新特性——页面自动化测试框架Spring MVC T</div> </li> <li><a href="/article/3311.htm" title="Hadoop集群工具distcp" target="_blank">Hadoop集群工具distcp</a> <span class="text-muted">liyonghui160com</span> <div>    1. 环境描述 两个集群:rock 和 stone rock无kerberos权限认证,stone有要求认证。 1. 从rock复制到stone,采用hdfs Hadoop distcp -i hdfs://rock-nn:8020/user/cxz/input hdfs://stone-nn:8020/user/cxz/运行在rock端,即源端问题:报版本</div> </li> <li><a href="/article/3438.htm" title="一个备份MySQL数据库的简单Shell脚本" target="_blank">一个备份MySQL数据库的简单Shell脚本</a> <span class="text-muted">pda158</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a> <div>  主脚本(用于备份mysql数据库):   该Shell脚本可以自动备份 数据库。只要复制粘贴本脚本到文本编辑器中,输入数据库用户名、密码以及数据库名即可。我备份数据库使用的是mysqlump 命令。后面会对每行脚本命令进行说明。    1. 分别建立目录“backup”和“oldbackup”   #mkdir /backup   #mkdir /oldbackup  </div> </li> <li><a href="/article/3565.htm" title="300个涵盖IT各方面的免费资源(中)——设计与编码篇" target="_blank">300个涵盖IT各方面的免费资源(中)——设计与编码篇</a> <span class="text-muted">shoothao</span> <a class="tag" taget="_blank" href="/search/IT%E8%B5%84%E6%BA%90/1.htm">IT资源</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E6%A0%87%E5%BA%93/1.htm">图标库</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E7%89%87%E5%BA%93/1.htm">图片库</a><a class="tag" taget="_blank" href="/search/%E8%89%B2%E5%BD%A9%E6%9D%BF/1.htm">色彩板</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E4%BD%93/1.htm">字体</a> <div> A. 免费的设计资源 Freebbble:来自于Dribbble的免费的高质量作品。 Dribbble:Dribbble上“免费”的搜索结果——这是巨大的宝藏。 Graphic Burger:每个像素点都做得很细的绝佳的设计资源。 Pixel Buddha:免费和优质资源的专业社区。 Premium Pixels:为那些有创意的人提供免费的素材。 </div> </li> <li><a href="/article/3692.htm" title="thrift总结 - 跨语言服务开发" target="_blank">thrift总结 - 跨语言服务开发</a> <span class="text-muted">uule</span> <a class="tag" taget="_blank" href="/search/thrift/1.htm">thrift</a> <div>官网 官网JAVA例子 thrift入门介绍 IBM-Apache Thrift - 可伸缩的跨语言服务开发框架 Thrift入门及Java实例演示 thrift的使用介绍   RPC    POM: <dependency> <groupId>org.apache.thrift</groupId> </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>