【Java应用】Java提取B站视频教程详情(完整代码|下载可直接运行|自带页面|可直接复制)

提取B站视频教程详情

背景

B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章

image-20240312161436488

效果图

在这里插入图片描述

根据关键字获取视频id

public Result videoList(@RequestBody VideoDto videoDto) {
        String keyword = videoDto.getKeyword();
        if (!StringUtils.hasText(keyword)) {
            return R.error(500,"keyword 不能为空");
        }
        String cookie = videoDto.getCookie();
        if (!StringUtils.hasText(cookie)) {
            cookie = this.cookie;
        }
        String url = "https://api.bilibili.com/x/web-interface/wbi/search/all/v2?__refresh__=true&_extra=&context=&page=1&page_size=42&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&qv_id=f2n7O2fSac731PnjjNFHUAGTYrY8wN84&ad_resource=5646&source_tag=3&web_location=1430654&w_rid=8b093eac9dbe20f09fb6b7bf3a51a743&wts=1710225740&keyword=" + keyword;
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cookie", cookie);
        headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36");
        HttpEntity<Object> entity = new HttpEntity<>(null, headers);
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        String body = exchange.getBody();
        JSONArray results = JSON.parseObject(body).getJSONObject("data").getJSONArray("result");
        List<VideoVo> list = new ArrayList<>();
        for (int i = 0; i < results.size(); i++) {
            JSONObject result = results.getJSONObject(i);
            if ("video".equals(result.getString("result_type"))) {
                JSONArray array = result.getJSONArray("data");
                for (int j = 0; j < array.size(); j++) {
                    JSONObject object = array.getJSONObject(j);
                    String id = object.getString("id");
                    String title = object.getString("title").replace("<em class=\"keyword\">", "").replace("</em>", "");
                    System.out.println(id + "\t" + title);
                    VideoVo videoVo = new VideoVo();
                    videoVo.setId(id);
                    videoVo.setTitle(title);
                    list.add(videoVo);
                }
            }
        }
        return R.ok(list);
    }
418313932	【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)图像处理|深度学习人工智能计算机视觉python+AI
314395310	太厉害了 已跪!终于有人能把OpenCV图像处理讲的这么通俗易懂了,现在计算机视觉opencv全套分享给大家。
1615	OpenCV轻松入门(李立宗)
1201468793	太详细了!从OpenCV安装到图像处理操作实战,张老师是真的把计算机视觉给讲透了!整整一百集,拿走不谢!——人工智能/机器学习/深度学习/神经网络/目标检测
839144359	OpenCV4 C++ 快速入门视频30讲 - 系列合集
382304059	【不要再看那些过时的OpenCV老教程了】2022巨献,OpenCV零基础小白最新版全套教程(人工智能机器视觉教程)
373921350	黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程
815748375	计算机视觉入门到精通!公认讲的最好的【OpenCV计算机视觉教程】同济大佬12小时带你从入门到精通!图像处理|深度学习人工智能计算机视觉Python+AI
...

获取视频详情

@Test
public Result<String> videoDetails(@PathVariable String id) {
        String url = "https://api.bilibili.com/x/web-interface/wbi/view/detail?aid=" + id;
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cookie", cookie);
        headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36");
        HttpEntity<Object> entity = new HttpEntity<>(null, headers);
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        String body = exchange.getBody();
        System.out.println("body = " + body);
        JSONArray jsonArray = JSON.parseObject(body).getJSONObject("data").getJSONObject("View").getJSONArray("pages");
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < jsonArray.size(); i++) {
            String title = jsonArray.getJSONObject(i).getString("part");
            System.out.println(title);
            builder.append(title).append("\n");
        }
        return R.ok(builder.toString());
    }

传入上一步获取到的视频id=314395310即可得到对应的视频详情

1-2 OpenCV导学
1-3 计算机视觉到底是什么
2-1 Mac下命令方式搭建OpenCV开发环境(加片头)
2-2 Windows下搭建OpenCV开发环境
2-3 Ubuntu下搭建OpenCV开发环境
2-4 Windows下源码方式编译OpenCV
2-5 Windows下C++使用OpenCV库
2-6 如何利用工具高效开发OpenCV
3-1 明晰课程项目
3-2 如何通过OpenCV创建显示窗口
3-3 如何通过OpenCV加载显示图片
3-4 两招解决OpenCV加载图片问题
3-5 如何通过OpenCV保存文件
3-6 如何利用OpenCV从摄像头采集视频
3-7 如何从多媒体文件中读取视频帧
3-8 如何将视频数据录制成多媒体文件
3-9 代码优化
3-10 OpenCV控制鼠标
3-11 OpenCV中的TrackBar控件
3-12 实战TrackBar的使用
4-1 RGB与BGR【OpenCV的色彩空间】
4-2 HSV与HSL【OpenCV的色彩空间】
4-3 实战OpenCV色彩空间转换
4-4 图像操作的基石Numpy【基础操作】
4-5 Numpy基本操作之矩阵的检索与赋值
4-6 Numpy基本操作三-ROI
4-8 OpenCV的重要结构体Mat
4-9 Mat的深拷贝与浅拷贝
4-11 图像的多种属性
4-12 通道的分割与合并
5-1 OpenCV绘制直线
5-2 OpenCV椭圆的绘制
5-3 OpenCV椭圆的绘制
5-4 OpenCV绘制多边形
5-5 OpenCV绘制文本
5-6 OpenCV大作业-实现鼠标绘制基本图形
5-7 OpenCV基本图形绘制小结
6-1 图像的加法运算
6-2 图像的减法运算
6-3 图像的溶合
6-4 OpenCV位运算-非操作
6-5 OpenCV位操作-与运算
6-6 OpenCV位操作-或与异或
6-7 大作业-为图像添加水印
7-1 图像的放大与缩小
7-2 图像的翻转
7-3 图像的旋转
7-4 仿射变换之图像平移
7-5 仿射变换之获取变换矩阵
7-6 仿射变换之变换矩阵之二
7-7 OpenCV透视变换
8-1 图像滤波
8-2 卷积相关概念
8-3 实战图像卷积
8-4 方盒滤波与均值滤波
8-5 高斯滤波
8-6 中值滤波
8-7 双边滤波
8-8 高通滤波-索贝尔算子
8-9 高通滤波-沙尔算子
8-10 高通滤波-拉普拉斯算子
8-11 边缘检测Canny
9-1 形态学概述
9-2 图像全局二值化
9-3 阈值类型
9-4 自适应阈值二值化
9-5 OpenCV腐蚀
9-6 获取形态学卷积核
9-7 OpenCV膨胀
9-8 开运算
9-9 闭运算
9-10 形态学梯度
9-11 顶帽运算
9-12 黑帽操作
10-1 什么是图像轮廓
10-2 查找轮廓
10-3 绘制轮廓
10-4 轮廓的面积与周长
10-5 多边形逼近与凸包
10-6 外接矩形
10-7 项目总览【车辆统计】
10-8 视频加载【车辆统计】
10-9 形态学处理【车辆统计】
10-10 去背景【车辆统计】
10-11 逻辑处理【车辆统计】
10-12 显示信息【车辆统计】
11-1 特征检测的基本概念
11-2 Harris角点检测
11-3 Shi-Tomasi角点检测
11-4 SIFT关键点检测
11-5 SIFT计算描述子
11-6 SURF特征检测
11-7 OBR特征检测
11-8 暴力特征匹配
11-9 FLANN特征匹配
11-10 实战flann特征匹配
11-11 图像查找
11-12 大作业-图像拼接基础知识
11-13 大作业-图像拼接(一)

完整Controller代码

package com.lxw.station.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lxw.station.core.R;
import com.lxw.station.core.Result;
import com.lxw.station.entity.VideoDto;
import com.lxw.station.entity.VideoVo;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

@RestController
public class VideoController {
    private String cookie = "_uuid=9DF4F2F2-47B9-22B6-F59A-A8C10C658393265297infoc; enable_web_push=undefined; header_theme_version=undefined; buvid_fp=0f14aff6726a04789db0ba942ba1317c; buvid3=C4518348-C136-256A-F660-38EA96D4971D49657infoc; b_nut=1708214666; buvid4=1010A954-10E9-D08B-82EF-1278035AD2E749657-024021800-Da1Cmh2s4TKHhBvxWnSrMg%3D%3D; CURRENT_FNVAL=4048; rpdid=|(kYl|~u)R)J0J'u~|)kuRY~Y; PVID=1; DedeUserID=702211544; DedeUserID__ckMd5=165187cda1b9f075; CURRENT_QUALITY=80; FEED_LIVE_VERSION=undefined; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTAzNzQxMjcsImlhdCI6MTcxMDExNDg2NywicGx0IjotMX0.YzPhgcDhiKBMZCQmvf9r_6shc7teaF2F6r4ZFgk4g9w; bili_ticket_expires=1710374067; SESSDATA=bc98694a%2C1725666928%2Cce14a%2A31CjCxI-6GYnUODm_8y4XiweKv272zq5odBHxEmsuMnRW9nTgEThHMdZmEZM-mZvcQowoSVlE2ZWItWmROUGtVcXFTZkVlYmhmdDdnbTktZF9scVZpb3c1UzNJNXlsZGZvN3U0cWtGYS1FSXU4N0VZN041UkJYWEhJNDJKQktFTzVBZTBXSEw0WERRIIEC; bili_jct=a23627e4e9d952ba26cfcc0209ce39e0; sid=7yv3ysp0; bp_video_offset_702211544=907118997271478357; home_feed_column=4; b_lsid=BF6A57A2_18E312A1978; browser_resolution=1275-1279";
    private RestTemplate restTemplate = new RestTemplate();
    @PostMapping("/videoList")
    public Result videoList(@RequestBody VideoDto videoDto) {
        String keyword = videoDto.getKeyword();
        if (!StringUtils.hasText(keyword)) {
            return R.error(500,"keyword 不能为空");
        }
        String cookie = videoDto.getCookie();
        if (!StringUtils.hasText(cookie)) {
            cookie = this.cookie;
        }
        String url = "https://api.bilibili.com/x/web-interface/wbi/search/all/v2?__refresh__=true&_extra=&context=&page=1&page_size=42&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&qv_id=f2n7O2fSac731PnjjNFHUAGTYrY8wN84&ad_resource=5646&source_tag=3&web_location=1430654&w_rid=8b093eac9dbe20f09fb6b7bf3a51a743&wts=1710225740&keyword=" + keyword;
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cookie", cookie);
        headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36");
        HttpEntity<Object> entity = new HttpEntity<>(null, headers);
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        String body = exchange.getBody();
        JSONArray results = JSON.parseObject(body).getJSONObject("data").getJSONArray("result");
        List<VideoVo> list = new ArrayList<>();
        for (int i = 0; i < results.size(); i++) {
            JSONObject result = results.getJSONObject(i);
            if ("video".equals(result.getString("result_type"))) {
                JSONArray array = result.getJSONArray("data");
                for (int j = 0; j < array.size(); j++) {
                    JSONObject object = array.getJSONObject(j);
                    String id = object.getString("id");
                    String title = object.getString("title").replace("<em class=\"keyword\">", "").replace("</em>", "");
                    System.out.println(id + "\t" + title);
                    VideoVo videoVo = new VideoVo();
                    videoVo.setId(id);
                    videoVo.setTitle(title);
                    list.add(videoVo);
                }
            }
        }
        return R.ok(list);
    }
    @GetMapping("/videoDetails/{id}")
    public Result<String> videoDetails(@PathVariable String id) {
        String url = "https://api.bilibili.com/x/web-interface/wbi/view/detail?aid=" + id;
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cookie", cookie);
        headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36");
        HttpEntity<Object> entity = new HttpEntity<>(null, headers);
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        String body = exchange.getBody();
        System.out.println("body = " + body);
        JSONArray jsonArray = JSON.parseObject(body).getJSONObject("data").getJSONObject("View").getJSONArray("pages");
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < jsonArray.size(); i++) {
            String title = jsonArray.getJSONObject(i).getString("part");
            System.out.println(title);
            builder.append(title).append("\n");
        }
        return R.ok(builder.toString());
    }
}

前端核心代码

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <style>
        /*找到html标签、body标签,和挂载的标签 都给他们统一设置样式*/
        html, body, #app, .el-container {
            /*设置内部填充为0,几个布局元素之间没有间距*/
            padding: 0px;
            /*外部间距也是如此设置*/
            margin: 0px;
            /*统一设置高度为100%*/
            height: 100%;
        }
        .el-header {
            background-color: #B3C0D1;
            line-height: 25px;
        }
        el-aside {
            background-color: #D3DCE6;
            color: #333;
        }

        .el-main {
            background-color: #E9EEF3;
            color: #333;
        }
        .code-container {
            position: relative;
        }
        .code {
            background-color: #f4f4f4;
            font-family: 'Microsoft YaHei', sans-serif;;
            padding: 10px;
            border-radius: 5px;
            overflow-x: auto;
        }
        .copy-button {
            position: absolute;
            top: 5px;
            right: 5px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 3px;
            padding: 5px 10px;
            cursor: pointer;
        }


    </style>
    <script src="/js/vue.js"></script>
    <script src="/js/vue-router.js"></script>
    <link rel="stylesheet" href="/css/el/index.css">
    <script src="/js/el/index.js"></script>
    <script type="text/javascript" src="/js/axios/index.js"></script>
    <script type="text/javascript" src="/api/ajax.js"></script>
    <script src="js/marked/marked.js"></script>

</head>
<body>
<div id="app">
    <el-container height>
        <el-header>
            <el-row style="margin-top: 10px">
                <el-col :span="3"><el-input v-model="params.keyword"><template slot="prepend">关键词</template></el-input></el-col>
                <el-col :span="18"><el-input v-model="params.cookie"><template slot="prepend">Cookie</template></el-input></el-col>
                <el-col :span="3"></el-col><el-button @click="videoList" :loading="generateLoading">获取视频列表</el-button></el-input></el-col>
            </el-row>
        </el-header>
        <el-container>
            <el-main>
                <el-table :data="list" highlight-current-row @current-change="videoDetails" empty-text="暂无数据" style="width: 100%">
                    <el-table-column type="index" width="50"></el-table-column>
                    <el-table-column property="id" label="id" width="120"></el-table-column>
                    <el-table-column property="title" label="title"></el-table-column>
                </el-table>
            </el-main>
            <el-aside width="600px">
                <div class="code-container" v-show="details != null && details != ''">
                    <pre class="code" id="codeSnippet">
                        <code style="font-family: 'Microsoft YaHei', sans-serif">
                            {{details}}
                        </code>
                    </pre>
                    <button class="copy-button" @click="copyCode()">{{copyButtonText}}</button>
                </div>
            </el-aside>
        </el-container>
    </el-container>


</div>

</body>
</html>
<script>
    new Vue({
        el: '#app',
        data: function () {
            return {
                generateLoading: false,
                params: {
                    cookie: '',
                    keyword: 'opencv'
                },
                list: [],
                details: "",
                copyButtonText:"复制"
            }
        },
        methods: {
            videoList() {
                this.generateLoading = true;
                axios.post('/videoList', this.params).then(res => {
                    if(res.data.success){
                        this.list = res.data.data
                    }else {
                        this.$message.error(res.data.msg)
                    }
                }).finally(() => {
                    this.generateLoading = false;
                })
            },
            videoDetails(row) {
                this.generateLoading = true;
                axios.get('/videoDetails/'+row.id).then(res => {
                this.details = res.data.data
                }).cache(()=>{
                    this.$message.error("获取视频详情失败")
                }).finally(() => {
                    this.generateLoading = false;
                })
            },
            copyCode() {
                var codeElement = document.getElementById('codeSnippet');
                var range = document.createRange();
                range.selectNode(codeElement);
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(range);
                document.execCommand('copy');
                window.getSelection().removeAllRanges();
                this.copyButtonText = "已复制";
                setTimeout(() =>{
                    console.log("定时任务开始执行")
                    this.copyButtonText = "复制";
                }, 2000);
            }
        },
    })
</script>

完整代码码云地址

https://gitee.com/LessAndfaster/bstation.git
运行后访问http://localhost:8088/即可

获取cookie的方法

打开B站,F12调出开发者工具,随便找个请求都可以

image-20240312161948184

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整下载http://vdisk.weibo.com/s/nfF_Q ===================================================================2013-1-1 自动对输出的EXE动画文件进行加密处理,这是一个重要升级,意味着只有自己 的加密狗才可以打开/编辑自己设计的EXE,而别人只能播放EXE而不能打开EXE, 杜绝了骗图、偷图等盗版行为,并切底阻止他人非法提取自己的TOL、图片及动画效果. ===================================================================2012-09-01 1、AVI动画加入MP3音乐功能 2、增加1024X16编译系统 3、NeonPlay 中的程序编辑中块操作中增加直接删除节拍功能 4、NeonPlay 图元移动中增加图元再制次数选项 5、NeonEdit 增加单线芯片的1024X16控制器的输出修改 6、NeonPlay 中修改属性设置过行列数后,再次显示属性时显示行列数都是1的错误 7、NeonPlay 修改图元分割时默认是图元分割 8、NeonPlay 修改花样编辑自动花样V型花样的V型移动和V型翻转的从下到上,从右到左的错误 9、NeonEdit 修改自动花样下V型花样V型移动和V型翻转中从右到左,从下到下在空节 拍生成第一节拍出错的错误 ===================================================================2012-07-03 增加功能 1、NeonPlay支持AVI动画文件输出,播放更通用,同时最大限度保护了设计者的版权 2、修改NeonPlay中动画大高度遮罩时播放演示错误 3、修改NeonEdit编译中单线芯片中2048点控制器线路定义的错误 4、修正编译系统的加密功能 5、升级DMX512的编译系统 6、输出bin文件功能普通用户受限制 ===================================================================2012-05-13 增加功能 1、Neonplay 网格设计区工具菜单下增加Flash/SWF转网格[TOL]功能 2、NeonEdit节拍编辑菜单下增加Flash/SWF转网格[TOL/COT]功能 ===================================================================2012-04-06 1、升级软件保护机制 2、增加编译系统:2048x16 3、修改 NeonPlay 菜单下打开不起作用的错误 4、修正 NeonEdit 修改调色板后面有空白的错误 5、修正工具栏里的节点编辑不起作用---注意:只能编辑贝兹曲线和折 线,每次只能编辑一个图元:一个贝兹曲线或者一个折线 ===================================================================2012-03-10 1、采集器2012增加了保存256等级的cot文件功能,单次最大采集5万帧. 采集器2012需要加密狗才能运行 2、修正NeonEdit另存cot文件的错误 3、NeonPlay 修改了删除遮罩时撤销和返回的错误 4、Neonplay 修改自由变换删除后,再撤销的错误 5、NeonPlay 修改了png遮罩变反 6、点击版本号或者点击NeonPlay的<>菜单可显示最近更新历史 ===================================================================2012-02-28 该版本为重要升级,新版本支持256等级的网格文件和色盘文件, 新256等级网格文件采用.COT扩展名保存,原有的128等级网格 文件.TOL继续保持兼容. 1,增加.COT的256等级网格文件 2,色盘增加256等级颜色 3,色盘增加全选和七种颜色的自定义 4,修正自由变换出错、遮罩删除、图片遮罩反 5,修正与杀毒软件的兼容性 ===================================================================2011-12-08 1,增加导入大图片文件功能,在<>菜单里的最下面 2,增加了 png 图片转成遮罩层 3,平铺后任意变形能否增加弧度调整功能。 如果建筑有弧度需要分解后分跟调整很麻烦!解决方法是 用分割成线段组,不要把它们打断 ===================================================================2011-10-31 增加单线1024X8的编译 ===================================================================2011-10-18 增加DMX512系列控制器的编译 1, 170点X8通道 2, 512点X8通道 3,1024点X8通道 ===================================================================2011-07-22 1,解决输出的EXE被当病毒杀 2,升级单线芯片的编译系统 ===================================================================2011-07-07 1.动画像素提升到:1024*768 2.可以支持输出静态图片功能,客户可以打印静态的效果。 3.解决问题: 输出动画后,画面和制作界面大小不一致,自动裁切下面的,动画图像很靠下。 4.解决问题: 画图界面按空格画图的时候拖动画面的时候是反方向,和ps也是相反的。 5.升级了 PLAY2006 播放器 升级到 PLAY2011
Boilsoft Video Splitter 是一款优秀且快速的专业无损视频分割软件,支持大于2GB以上的视频分割和直接拖放功能,无需重新编码就能帮助大家直接将完整的AVI、MPEG、RM、ASF、WMV、3GP、MKV、FLV 或 MP4等主流视频文件按时间、大小或关键帧等条件拆分、剪切或修剪成较小的视频片段,此外该视频分割器件具有提取视频帧并保存到图像以及视频播放器功能,大家可以根据需要轻松地按时间或选择分割/剪切 AVI、MPEG、RM、ASF、WMV、3GP 或 MP4视频文件,Boilsoft Video Splitter的编码拆分模式支持将任何格式的视频拆分为用户指定的任何主流格式 Boilsoft Video Splitter(无损视频分割软件)特色功能简介: 功能强大且易于使用:无损视频分割软件Boilsoft Video Splitter可以拆分大于2GB的视频文件,所有编码器/编解码器都是内置的,支持预览视频结果。 按帧剪切/拆分视频:无损视频分割软件Boilsoft Video Splitter可以每帧选择切割区域,允许用户精确选择起点/终点,将完整的大型视频文件拆分为较小的相等文件或自定义时长视频。 自由分割视频或分割成多个大小相等的片段:通过使用无损视频分割软件Boilsoft Video Splitter的内置播放器设置开始和结束时间来提取视频的任何部分,或将文件拆分为多个相同大小的片段。 无需重新编码直接分割:无损视频分割软件Boilsoft Video Splitter可以非常快速地将视频文件拆分为源文件格式,并且不需要重新编码。支持的格式包括 AVI、MPEG、VOB、MP4、3GP、RM、ASF/WMV/WMA、MKV MP3 和 FLV。在保持原始音频/视频质量的同时拆分视频。分裂速度极高。拆分速度比编码模式快 10 倍。
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。   Bootcfg   bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。   含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。   用法:   bootcfg /default  设置默认引导项。   bootcfg /add    向引导列表中添加 Windows 安装。   bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。   注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。   bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。   注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。   bootcfg /list   列出引导列表中已有的条目。   bootcfg /disableredirect 在启动引导程序中禁用重定向。   bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]   在启动引导程序中通过指定配置启用重定向。   范例: bootcfg /redirect com1 115200 bootcfg /redirect useBiosSettings   hkdsk   创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。   含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。   vol [drive:] [ chkdsk [drive:] [/p] [/r]   参数  无   如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。   注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart   创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。   diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]   参数 无   如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。   /add   创建新的分区。   /delete   删除现有分区。   device_name   要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:   DeviceHardDisk0   drive_name   以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:   D:   partition_name   以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:   DeviceHardDisk0Partition1    大小   要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。   范例   下例将删除分区: diskpart /delete Device HardDisk0 Partition3 diskpart /delete F:   下例将在硬盘上添加一个 20 MB 的分区:   diskpart /add Device HardDisk0 20   Fixboot
【资源说明】 1、基于Python+yolo的机器学习应用,针对监控视频完成行人轨迹搜索项目源码+说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于Python+yolo的机器学习应用,针对监控视频完成行人轨迹搜索项目源码+说明.zip 基于Python的机器学习应用,针对监控视频完成行人轨迹搜索。通过一张目标图像,能自动从大量视频中搜索出包含目标的视频片段,并标记目标。 ## 运行环境 ``` Python 3.6.2 TensorFlow-GPU 1.6.0 opencv-python numpy 1.18.1 keras 2.2.0 scikit-learn pillow ``` 额外依赖项下载(模型文件上传到百度云,读者也可根据后续教程自己获得): ``` 文件名:yolo.h5 目标文件夹:search_from_videos\edg_code\model_data\ 链接:https://pan.baidu.com/s/1_oCYDz3Gpcn-WEr6qcqtsA 提取码:yimi 文件名:yolov3.weights 目标文件夹:search_from_videos\edg_code\ 链接:https://pan.baidu.com/s/1mNMwqp_R2-0G586hG9nmSA 提取码:zkvu ``` ## 适用平台 笔者在Windows 10上基于Visual Stdio Code开发,但并不代表此项目存在平台限制 ## 项目算法简述 预处理过程(edg_code),图见edg_algorithm_structure.png ``` 1. 基于三帧差分法,结合阈值法,对数据量庞大的监控视频文件进行预处理,去除其中的无意义部分(无行人出现),分割视频得到大量的视频片段。 2. 对每个视频片段基于YOLO算法,进行行人识别 [此处算法以及模型来源详见引用] 3. 结合YOLO和Deep Sort进行行人轨迹追踪 [此处算法以及模型来源详见引用] 4. 基于Caffe算法对行人人脸进行识别并评分,缓存评分较高的人脸(存在最大数量限制) 5. 基于EigenFace/LBPHFace, 对前面缓存的人脸建立模型文件 6. 将行人轨迹缓存结果与人脸模型文件关联,即预处理结果 ``` 搜索过程(client),图见client_algorithm_structure.png ``` 1. 对输入图片基于caffe算法截取人脸部分 2. 基于EigenFace/LBPHFace, 将目标人脸与预处理得到的人脸模型比对,得到置信度 3. 通过对置信度排序,并截取适当比例的结果,作为搜索结果输出 ``` ## 运行说明 #### code for edg(执行过程耗时) 下面的main.py统一指代为 search_from_videos/edg_code/main.py ``` # 将待处理的单个/多个视频文件(支持mp4)放入main.py中row_path指定的目录中 python main.py # 根据环境自动修正设置 # 程序将自动在main.py中video_path和save_path指定路径生成处理参数 ``` #### code for client(运行过程快速) 下面的main.py统一指代为 search_from_videos/client/main.py ``` # 在main.py中image_path指定待搜索的目标人物的照片 # main.py中的pre_dict和result_dict指向为edg_code生成的对应目录video_path和save_path python main.py # 根据环境自动修正设置 # 程序会自动在main.py中search_result_path指定路径生成搜索结果 ``` ## 修改方向 本项目仅为原型机,尚未提供可视化调用接口。可以考虑采用B/S架构,将其升级为真实可用的saas应用 ## 引用 ``` YOLO算法: Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real Time Object Detection[C].The IEEE Conference on Computer Vision and Pattern Recognition (CVPR).2016 ,01.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值