Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器

目录

需求背景:

在做之前的项目的时候有一个对接摄像头实时播放的需求,由于我们摄像头的购买量不是很多,海康威视不给我们提供流媒体云服务器,所以需要我们自己去 一个去满足我们能在浏览器看到监控画面。项目源代码在以前公司没有拷贝就不能复习,最近又在准备面试,所以写了这个博客来复盘和扩展一下,由于我现在没有Liunx,我就用Windows来演示,生产环境还是要使用Liunx,下面这些操作在Liunx也是一样的流程,大家自行百度。

一:了解音视频流协议:

媒体流协议对比
协议 HttpFlv RTMP HLS Dash
全称 FLASH VIDEO over HTTP Real Time Message Protocol HTTP Living Streaming
传输方式 HTTP长连接 TCP长连接 HTTP短连接 HTTP短连接
视频封装格式 FLV

FLV TAG

TS文件

Mp4

3gp

webm

原理

RTMP,使用HTTP协议(80端口)

每个时刻的数据收到后立刻转发

集合一段时间的数据,生成TS切片文件(三片),并更新m3u8索引

延时

1~3秒

1~3秒

5~20秒(依切片情况)

数据分段 连续流 连续流 切片文件 切片文件
Html5播放

可通过HTML5解封包播放

(flv.js)

不支持

可通过HTML5解封包播放

(hls.js)

如果dash文件列表是MP4,

webm文件,可直接播放

其它

需要Flash技术支持,不支持多音频流、多视频流,不便于seek(即拖进度条)

跨平台支持较差,需要Flash技术支持

播放时需要多次请求,对于网络质量要求高

二:方案一 rtsp 转rtmp

1、下载nginx + nginx-rtmp-module

nginx:下载地址:http://nginx-win.ecsds.eu/download/

nginx-rtmp-module:nginx 的扩展,安装后支持rtmp协议,下载地址:https://github.com/arut/nginx-rtmp-module

解压nginx-rtmp-module到nginx根目录下,并修改其文件夹名为nginx-rtmp-module(原名为nginx-rtmp-module-master)

2、nginx配置文件

到nginx根目录下的conf目录下复制一份nginx-win.conf 重命名 nginx-win-rtmp.conf

nginx-win-rtmp.conf:

  1. #user nobody;
  2. # multiple workers works !
  3. worker_processes 2;
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7. #pid logs/nginx.pid;
  8. events {
  9. worker_connections 8192;
  10. # max value 32768, nginx recycling connections+registry optimization =
  11. # this.value * 20 = max concurrent connections currently tested with one worker
  12. # C1000K should be possible depending there is enough ram/cpu power
  13. # multi_accept on;
  14. }
  15. rtmp {
  16. server {
  17. listen 1935;
  18. chunk_size 4000;
  19. application live {
  20. live on;
  21. # 播放时进行回调,如果HttpRespone statusCode不等于200会断开
  22. # on_play http://localhost:8081/auth;
  23. }
  24. application hls {
  25. live on;
  26. # 开启hls切片
  27. hls on;
  28. # m3u8地址
  29. hls_path html/hls;
  30. # 一个切片多少秒
  31. hls_fragment 8s;
  32. # on_play http://localhost:8081/auth;
  33. # on_publish http://localhost:8081/auth;
  34. # on_done http://localhost:8081/auth;
  35. }
  36. }
  37. }
  38. http {
  39. #include /nginx/conf/naxsi_core.rules;
  40. include mime.types;
  41. default_type application/octet-stream;
  42. #log_format main '$remote_addr:$remote_port - $remote_user [$time_local] "$request" '
  43. # '$status $body_bytes_sent "$http_referer" '
  44. # '"$http_user_agent" "$http_x_forwarded_for"';
  45. #access_log logs/access.log main;
  46. # # loadbalancing PHP
  47. # upstream myLoadBalancer {
  48. # server 127.0.0.1:9001 weight=1 fail_timeout=5;
  49. # server 127.0.0.1:9002 weight=1 fail_timeout=5;
  50. # server 127.0.0.1:9003 weight=1 fail_timeout=5;
  51. # server 127.0.0.1:9004 weight=1 fail_timeout=5;
  52. # server 127.0.0.1:9005 weight=1 fail_timeout=5;
  53. # server 127.0.0.1:9006 weight=1 fail_timeout=5;
  54. # server 127.0.0.1:9007 weight=1 fail_timeout=5;
  55. # server 127.0.0.1:9008 weight=1 fail_timeout=5;
  56. # server 127.0.0.1:9009 weight=1 fail_timeout=5;
  57. # server 127.0.0.1:9010 weight=1 fail_timeout=5;
  58. # least_conn;
  59. # }
  60. sendfile off;
  61. #tcp_nopush on;
  62. server_names_hash_bucket_size 128;
  63. ## Start: Timeouts ##
  64. client_body_timeout 10;
  65. client_header_timeout 10;
  66. keepalive_timeout 30;
  67. send_timeout 10;
  68. keepalive_requests 10;
  69. ## End: Timeouts ##
  70. #gzip on;
  71. server {
  72. listen 5080;
  73. server_name localhost;
  74. location /stat {
  75. rtmp_stat all;
  76. rtmp_stat_stylesheet stat.xsl;
  77. }
  78. location /stat.xsl {
  79. root nginx-rtmp-module/;
  80. }
  81. location /control {
  82. rtmp_control all;
  83. }
  84. location /hls {
  85. # Serve HLS fragments
  86. types {
  87. application/vnd.apple.mpegurl m3u8;
  88. video/mp2t ts;
  89. }
  90. expires -1;
  91. add_header Access-Control-Allow-Origin *;
  92. }
  93. #charset koi8-r;
  94. #access_log logs/host.access.log main;
  95. ## Caching Static Files, put before first location
  96. #location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
  97. # expires 14d;
  98. # add_header Vary Accept-Encoding;
  99. #}
  100. # For Naxsi remove the single # line for learn mode, or the ## lines for full WAF mode
  101. location / {
  102. #include /nginx/conf/mysite.rules; # see also http block naxsi include line
  103. ##SecRulesEnabled;
  104. ##DeniedUrl "/RequestDenied";
  105. ##CheckRule "$SQL >= 8" BLOCK;
  106. ##CheckRule "$RFI >= 8" BLOCK;
  107. ##CheckRule "$TRAVERSAL >= 4" BLOCK;
  108. ##CheckRule "$XSS >= 8" BLOCK;
  109. root html;
  110. index index.html index.htm;
  111. }
  112. # For Naxsi remove the ## lines for full WAF mode, redirect location block used by naxsi
  113. ##location /RequestDenied {
  114. ## return 412;
  115. ##}
  116. ## Lua examples !
  117. # location /robots.txt {
  118. # rewrite_by_lua '
  119. # if ngx.var.http_host ~= "localhost" then
  120. # return ngx.exec("/robots_disallow.txt");
  121. # end
  122. # ';
  123. # }
  124. #error_page 404 /404.html;
  125. # redirect server error pages to the static page /50x.html
  126. #
  127. error_page 500 502 503 504 /50x.html;
  128. location = /50x.html {
  129. root html;
  130. }
  131. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  132. #
  133. #location ~ \.php$ {
  134. # proxy_pass http://127.0.0.1;
  135. #}
  136. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  137. #
  138. #location ~ \.php$ {
  139. # root html;
  140. # fastcgi_pass 127.0.0.1:9000; # single backend process
  141. # fastcgi_pass myLoadBalancer; # or multiple, see example above
  142. # fastcgi_index index.php;
  143. # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  144. # include fastcgi_params;
  145. #}
  146. # deny access to .htaccess files, if Apache's document root
  147. # concurs with nginx's one
  148. #
  149. #location ~ /\.ht {
  150. # deny all;
  151. #}
  152. }
  153. # another virtual host using mix of IP-, name-, and port-based configuration
  154. #
  155. #server {
  156. # listen 8000;
  157. # listen somename:8080;
  158. # server_name somename alias another.alias;
  159. # location / {
  160. # root html;
  161. # index index.html index.htm;
  162. # }
  163. #}
  164. # HTTPS server
  165. #
  166. #server {
  167. # listen 443 ssl spdy;
  168. # server_name localhost;
  169. # ssl on;
  170. # ssl_certificate cert.pem;
  171. # ssl_certificate_key cert.key;
  172. # ssl_session_timeout 5m;
  173. # ssl_prefer_server_ciphers On;
  174. # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  175. # ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:ECDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!eNULL:!MD5:!DSS:!EXP:!ADH:!LOW:!MEDIUM;
  176. # location / {
  177. # root html;
  178. # index index.html index.htm;
  179. # }
  180. #}
  181. }

3、cmd 到nginx根目录启动nginx

  1. nginx.exe -c conf\nginx-win-rtmp.conf

测试:浏览器输入 http://localhost:5080/stat,看到

代表安装成功

4、下载ffmpeg安装

ffmpeg:一个处理音视频强大的库,我们需要用它来转协议,下载地址:https://www.gyan.dev/ffmpeg/builds/ ,这里可以下载essential和full版本,essential就是简版,只包含ffmpeg.exe、ffplay.exe、

ffprobe.exe, 而full版本就包含了动态库和相关头文件,方便我们在开发中调用。

5、配置ffmpeg环境变量

将ffmpeg解压后里面的bin路径复制到Path里面去

6、测试ffmpeg

cmd ffmpeg -version 命令看到代表成功

7、下载VLC播放器

下载地址:https://www.videolan.org/vlc/

8、查摄像头的rtsp协议格式

我这里截图是海康威视的

现在没有测试的流,我找了个点播的rtsp

rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4,用这个代替是一样的

9、执行ffmpeg命令

ffmpeg强大,命令也是复杂,我们cmd 执行

  1. ffmpeg -re -rtsp_transport tcp -stimeout 20000000 -i "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4" -buffer_size 1024000 -max_delay 500000 -codec:v libx264 -r 25 -rtbufsize 10M -s 1280x720 -map:v 0 -an -f flv rtmp://127.0.0.1:1935/live/test

rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4,是输入源头

rtmp://127.0.0.1:1935/live/test 是输出地址

如果没有报错的话,到现在rtsp就已经转换好了

ffmpeg命令学习:https://www.jianshu.com/p/df3216a52e59https://blog.csdn.net/fuhanghang/article/details/123565920

10、测试rtmp是否转换成功

我们打开VLC,媒体->打开网络串流->输入 rtmp://127.0.0.1:1935/live/test-> 播放

11、测试是否成功

等待几秒钟看到有视频播放就是成功了

12、为什么放弃了用rtmp

rtmp的优点是延迟低,效率高,但是在浏览器需要安装flash才能放,也就老版本的浏览器在用,rtmp可能会在别的地方支持,所以还是把他方式方法贴出来了。

三:方案二 rtsp转hls

1、nginx配置:

在前面已经贴出来了,其中这几个是针对hls的

2、执行ffmepg命令

  1. ffmpeg -i "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4" -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/hls/test

3、查看nginx根目录 -> hls -> test.m3u8 是否生成

生成了代表一切正常

4、m3u8在网页上播放

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>前端播放m3u8格式视频</title>
  6. <!--https://www.bootcdn.cn/video.js/-->
  7. <link href="https://cdn.bootcss.com/video.js/7.6.5/alt/video-js-cdn.min.css" rel="stylesheet">
  8. <script src="https://cdn.bootcss.com/video.js/6.6.2/video.js"></script>
  9. <!--https://www.bootcdn.cn/videojs-contrib-hls/-->
  10. <script src="https://cdn.bootcss.com/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script>
  11. </head>
  12. <body>
  13. <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="1080" height="708" data-setup='{}'>
  14. <source id="source" src="http://127.0.0.1:5080/hls/test.m3u8" type="application/x-mpegURL">
  15. </video>
  16. </body>
  17. <script>
  18. // videojs 简单使用
  19. var myVideo = videojs('myVideo',{
  20. bigPlayButton : true,
  21. textTrackDisplay : false,
  22. posterImage: false,
  23. errorDisplay : false,
  24. })
  25. myVideo.play() // 视频播放
  26. myVideo.pause() // 视频暂停
  27. </script>
  28. </html>

source标签的src属性:http://你的nginx ip:nginx http端口/hls/test.m3u8

rtsp转HLS成功!

5、认识一下m3u8格式

m3u8文件里面存储了一个索引,以文本格式打开是这样的

  1. #EXTM3U
  2. #EXT-X-VERSION:3
  3. #EXT-X-MEDIA-SEQUENCE:56
  4. #EXT-X-TARGETDURATION:13
  5. #EXTINF:10.381,
  6. test-56.ts
  7. #EXTINF:10.422,
  8. test-57.ts
  9. #EXTINF:13.453,
  10. test-58.ts

m3u8文件它不是视频源,源头是ts后缀文件

6、为什么放弃了用HLS

转HLS协议及网页加载过程:

ffmepg收到rtsp的流时候,会等一个切片的时间,一个切片时间到了,切片ts会放到服务器中,同时m3u8文件中加一个索引,对应着新进入的切片。网页在加载m3u8的时候,就是读取m3u8中的的索引去加载ts文件,所以在不断的请求ts,对ts进行解析,不断的和TCP握手,这就是为什么HLS延迟高和对网速的要求高的原因,我们监控肯定是要延迟低的,HLS兼容性好,适合点播。

四:方案三rtsp 转httpflv(采用)

1、安装nginx-flv-module

这个插件需要编译,教程:https://blog.csdn.net/KayChanGEEK/article/details/105095844

我这里已经编译好了,直接下载启动:

https://gitee.com/isyuesen/nginx-flv-file

2、nginx配置

看我git里面的https://gitee.com/isyuesen/nginx-flv-file/blob/master/conf/nginx.conf,和默认的config差别主要是添加了这几个

  1. rtmp {
  2. server {
  3. listen 1935;
  4. # 流复用的最大块大小
  5. chunk_size 4000;
  6. application liveapp {
  7. live on;
  8. # 推流开始
  9. on_publish http://localhost:8081/auth;
  10. # 推流关闭
  11. on_publish_done http://localhost:8081/auth;
  12. # 客户端开始播放
  13. on_play http://localhost:8081/auth;
  14. # 客户端结束播放
  15. on_play_done http://localhost:8081/auth;
  16. }
  17. }
  18. }
  1. location /live {
  2. flv_live on;
  3. chunked_transfer_encoding on;
  4. add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header
  5. add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header
  6. add_header Access-Control-Allow-Headers X-Requested-With;
  7. add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
  8. add_header 'Cache-Control' 'no-cache';
  9. }

3、做java权限认证

nginx rtmp配置中有配置on_publish钩子接口 http://localhost:8081/auth,这个回调HttpResponse stausCode如果不等于200会拒绝I/O,更多回调钩子看:https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_connect

  1. @PostMapping("/auth")
  2. public void getVideo(String token, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  3. if (token.equals("tokenValue")) {
  4. httpServletResponse.setStatus(200);
  5. } else {
  6. // 拒绝服务
  7. httpServletResponse.setStatus(500);
  8. }
  9. }

4、执行ffmepg命令:

  1. ffmpeg -re -rtsp_transport tcp -i "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4" -f flv -vcodec h264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 640*360 -q 10 "rtmp://127.0.0.1:1935/liveapp/test"

4.1 采用java代码去执行ffmepg命令

依赖 javaCV

  1. <dependency>
  2. <groupId>org.bytedeco</groupId>
  3. <artifactId>javacv-platform</artifactId>
  4. <version>1.5.2</version>
  5. </dependency>
  1. public class App {
  2. public static void main( String[] args ) throws IOException, InterruptedException {
  3. String name = "test";
  4. // rtsp地址
  5. String rtspDir = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4";
  6. // rtmp地址
  7. String rtmpDir = "rtmp://192.168.0.140:1935/liveapp/" + name + "?token=tokenValue";
  8. String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
  9. ProcessBuilder pb = new ProcessBuilder(ffmpeg,
  10. "-re",
  11. "-rtsp_transport",
  12. "tcp",
  13. "-i",
  14. rtspDir,
  15. "-f",
  16. "flv",
  17. "-vcodec",
  18. "h264",
  19. "-vprofile",
  20. "baseline",
  21. "-acodec",
  22. "aac",
  23. "-ar",
  24. "44100",
  25. "-strict",
  26. "-2",
  27. "-ac",
  28. "1",
  29. "-f",
  30. "flv",
  31. "-s",
  32. "640*360",
  33. "-q",
  34. "10",
  35. rtmpDir
  36. );
  37. pb.inheritIO().start().waitFor();
  38. }
  39. }

5、测试http-flv链接

如果你跟着我做的,那链接就是 http://127.0.0.1:18080/live?port=1935&app=liveapp&stream=test&token=tokenValue,在VLC播放器中点击媒体 -> 打开网络串流 -> 输入http://127.0.0.1:18080/live?port=1935&app=liveapp&stream=test&token=tokenValue -> 播放

有视频证明你离成功就差最后一步

6、前端使用flv.js播放:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>播放http-flv</title>
  9. </head>
  10. <body>
  11. <video id="videoElement"></video>
  12. <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
  13. <script>
  14. if (flvjs.isSupported()) {
  15. const videoElement = document.getElementById('videoElement');
  16. const flvPlayer = flvjs.createPlayer({
  17. type: 'flv',
  18. url: 'http://127.0.0.1:18080/live?port=1935&app=liveapp&stream=test&token=tokenValue'
  19. });
  20. flvPlayer.attachMediaElement(videoElement);
  21. flvPlayer.load();
  22. flvPlayer.play();
  23. }
  24. </script>
  25. </body>
  26. </html>

7、大功告成

Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器的更多相关文章

  1. 推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求

    推荐一个比较好用的流媒体服务开源代码: ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/Z ...

  2. EasyDSS流媒体服务器软件(支持RTMP/HLS/HTTP-FLV/视频点播/视频直播)-正式环境安装部署攻略

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像, 直播支持RTMP ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器同步输出http-flv协议流是怎么实现的?

    http-flv是什么 http-flv是以http为传输协议,flv媒体格式为内容的方式实时下载flv音视频帧.为什么选择flv格式而非mp4?原因是mp4必须要有moov box或者moof bo ...

  4. 内网网络摄像机(RTSP/IPC/NVR)如何能在公网进行RTMP/HLS/HTTP-FLV直播

    一.背景需求 传统监控行业里不管是设备端.服务器端亦或是客户端都在一个内网里面.而且现在的大部分监控方案都是这样的格局,小到一个公司范围内的监控,再到一个园区.一个仓库监控.一个农业园林监控.一个养殖 ...

  5. GB28181 To RTMP/HLS/HTTP-FLV/DASH Gateway

    I. Deployment  / Architecture Block Diagram II. Resources Used 1. freeswitch —— sip server https://f ...

  6. EasyNVR互联网监控直播分发出RTMP、HLS、HTTP-FLV视频流说明介绍

    背景需求 需求比视频流协议更重要,你想要什么,什么可以满足你的需求,这个很大程度上是需求在前,选择使用什么视频流是比较靠后的. 目前Easy系列互联网直播服务将全线支持HLS.RTMP.HTP-FLV ...

  7. 普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务

    在之前的一篇博客<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们介绍了很多应用场景里面,RTSP和RTMP直播协议都无法满足应用需求时,国标 ...

  8. 安装并使用 Wowza 发布你的 RTMP 直播流

    转载自:http://blog.csdn.net/defonds/article/details/11979095 I. 下载 Wowza         官方下载地址 http://www.wowz ...

  9. 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现

    上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...

随机推荐

  1. WPF开发随笔收录-心电图曲线绘制

    一.前言 项目中之前涉及到胎儿心率图曲线的绘制,最近项目中还需要添加心电曲线和血样曲线的绘制功能.今天就来分享一下心电曲线的绘制方式: 二.正文 1.胎儿心率曲线的绘制是通过DrawingVisual ...

  2. 如何获取GC(垃圾回收器)的STW(暂停)时间?

    前言 在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各 ...

  3. Excel表函数自动生成SQL

    前言 在平常的工作中,多多掌握一点这样的小技巧,能够帮助我们省去很多时间: 1.数据库对应的表如下: 2.excel中需要导入的数据如下: 3.excel中sql的写法: ="insert ...

  4. nodejs - http.request是否有超时

    默认没有.那么,req.setTimeout(msec, callback)是干什么用的. 它的意思是 socket msec 没有活动后执行callback,不帮你关闭连接. 就像一个秒表,每收到数 ...

  5. protobuf 的交叉编译使用(C++)

    前言 为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率.下面介绍 protobu ...

  6. SVM简要介绍

    SVM 支持向量机(SVM),是一个用于解决二分类问题的有监督机器学习模型. 1.SVM的两个优点 更高的速度 在有一定的样本数量支持下(成千上万张),具有比其他模型有更好的效果 2.SVM的工作过程 ...

  7. C语言项目实现顺序表

    #include <stdio.h> #include <stdlib.h> #include "test_顺序表声明.h" /* run this pro ...

  8. httrack使用cookie克隆站点

    关于cookies使用在这里官方已有说明,意思是将cookies.txt文件放在项目的根目下即可,格式也给了说明.问题是cookie值太多,手动不好整理,所以就需要用到神器editthiscookie ...

  9. docker快速安装openvas

    项目地址 1.更换国内docker源 2.docker run -d -p 443:443 -e PUBLIC_HOSTNAME=此处填你宿主机IP --name openvas mikesplain ...

  10. day03_1_idea教程

    # idea使用教程 # 一.idea相关概念介绍 ## 1.1 IDE概念介绍 集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应 ...