2024年5月9日 新增学生流量监测

This commit is contained in:
bai 2024-05-09 18:56:50 +08:00
parent 21b8d4ea4a
commit aa5d6fc62c
19 changed files with 1187 additions and 13 deletions

View File

@ -0,0 +1,178 @@
package org.jeecg.modules.kc.detection.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.kc.detection.entity.KcDetectionDetailed;
import org.jeecg.modules.kc.detection.service.IKcDetectionDetailedService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 教室人数检测-详细表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Api(tags="教室人数检测-详细表")
@RestController
@RequestMapping("/detection/kcDetectionDetailed")
@Slf4j
public class KcDetectionDetailedController extends JeecgController<KcDetectionDetailed, IKcDetectionDetailedService> {
@Autowired
private IKcDetectionDetailedService kcDetectionDetailedService;
/**
* 分页列表查询
*
* @param kcDetectionDetailed
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "教室人数检测-详细表-分页列表查询")
@ApiOperation(value="教室人数检测-详细表-分页列表查询", notes="教室人数检测-详细表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<KcDetectionDetailed>> queryPageList(KcDetectionDetailed kcDetectionDetailed,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<KcDetectionDetailed> queryWrapper = QueryGenerator.initQueryWrapper(kcDetectionDetailed, req.getParameterMap());
Page<KcDetectionDetailed> page = new Page<KcDetectionDetailed>(pageNo, pageSize);
IPage<KcDetectionDetailed> pageList = kcDetectionDetailedService.page(page, queryWrapper);
return Result.OK(pageList);
}
// /**
// * 添加
// *
// * @param kcDetectionDetailed
// * @return
// */
// @AutoLog(value = "教室人数检测-详细表-添加")
// @ApiOperation(value="教室人数检测-详细表-添加", notes="教室人数检测-详细表-添加")
// @RequiresPermissions("detection:kc_detection_detailed:add")
// @PostMapping(value = "/add")
// public Result<String> add(@RequestBody KcDetectionDetailed kcDetectionDetailed) {
// kcDetectionDetailedService.save(kcDetectionDetailed);
// return Result.OK("添加成功!");
// }
//
// /**
// * 编辑
// *
// * @param kcDetectionDetailed
// * @return
// */
// @AutoLog(value = "教室人数检测-详细表-编辑")
// @ApiOperation(value="教室人数检测-详细表-编辑", notes="教室人数检测-详细表-编辑")
// @RequiresPermissions("detection:kc_detection_detailed:edit")
// @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
// public Result<String> edit(@RequestBody KcDetectionDetailed kcDetectionDetailed) {
// kcDetectionDetailedService.updateById(kcDetectionDetailed);
// return Result.OK("编辑成功!");
// }
//
// /**
// * 通过id删除
// *
// * @param id
// * @return
// */
// @AutoLog(value = "教室人数检测-详细表-通过id删除")
// @ApiOperation(value="教室人数检测-详细表-通过id删除", notes="教室人数检测-详细表-通过id删除")
// @RequiresPermissions("detection:kc_detection_detailed:delete")
// @DeleteMapping(value = "/delete")
// public Result<String> delete(@RequestParam(name="id",required=true) String id) {
// kcDetectionDetailedService.removeById(id);
// return Result.OK("删除成功!");
// }
//
// /**
// * 批量删除
// *
// * @param ids
// * @return
// */
// @AutoLog(value = "教室人数检测-详细表-批量删除")
// @ApiOperation(value="教室人数检测-详细表-批量删除", notes="教室人数检测-详细表-批量删除")
// @RequiresPermissions("detection:kc_detection_detailed:deleteBatch")
// @DeleteMapping(value = "/deleteBatch")
// public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
// this.kcDetectionDetailedService.removeByIds(Arrays.asList(ids.split(",")));
// return Result.OK("批量删除成功!");
// }
//
// /**
// * 通过id查询
// *
// * @param id
// * @return
// */
// //@AutoLog(value = "教室人数检测-详细表-通过id查询")
// @ApiOperation(value="教室人数检测-详细表-通过id查询", notes="教室人数检测-详细表-通过id查询")
// @GetMapping(value = "/queryById")
// public Result<KcDetectionDetailed> queryById(@RequestParam(name="id",required=true) String id) {
// KcDetectionDetailed kcDetectionDetailed = kcDetectionDetailedService.getById(id);
// if(kcDetectionDetailed==null) {
// return Result.error("未找到对应数据");
// }
// return Result.OK(kcDetectionDetailed);
// }
//
// /**
// * 导出excel
// *
// * @param request
// * @param kcDetectionDetailed
// */
// @RequiresPermissions("detection:kc_detection_detailed:exportXls")
// @RequestMapping(value = "/exportXls")
// public ModelAndView exportXls(HttpServletRequest request, KcDetectionDetailed kcDetectionDetailed) {
// return super.exportXls(request, kcDetectionDetailed, KcDetectionDetailed.class, "教室人数检测-详细表");
// }
//
// /**
// * 通过excel导入数据
// *
// * @param request
// * @param response
// * @return
// */
// @RequiresPermissions("detection:kc_detection_detailed:importExcel")
// @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
// public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
// return super.importExcel(request, response, KcDetectionDetailed.class);
// }
}

View File

@ -0,0 +1,213 @@
package org.jeecg.modules.kc.detection.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.beust.jcommander.internal.Sets;
import com.google.common.collect.Maps;
import org.apache.commons.compress.utils.Lists;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.kc.detection.entity.KcDetectionDetailed;
import org.jeecg.modules.kc.detection.entity.KcDetectionMain;
import org.jeecg.modules.kc.detection.service.IKcDetectionDetailedService;
import org.jeecg.modules.kc.detection.service.IKcDetectionMainService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 教室人数检测-主表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Api(tags="教室人数检测-主表")
@RestController
@RequestMapping("/detection/kcDetectionMain")
@Slf4j
public class KcDetectionMainController extends JeecgController<KcDetectionMain, IKcDetectionMainService> {
@Autowired
private IKcDetectionMainService kcDetectionMainService;
@Autowired
private IKcDetectionDetailedService kcDetectionDetailedService;
/**
* 分页列表查询
*
* @param kcDetectionMain
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "教室人数检测-主表-分页列表查询")
@ApiOperation(value="教室人数检测-主表-分页列表查询", notes="教室人数检测-主表-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<KcDetectionMain>> queryPageList(KcDetectionMain kcDetectionMain,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<KcDetectionMain> queryWrapper = QueryGenerator.initQueryWrapper(kcDetectionMain, req.getParameterMap());
Page<KcDetectionMain> page = new Page<>(pageNo, pageSize);
IPage<KcDetectionMain> pageList = kcDetectionMainService.page(page, queryWrapper);
//补充查询子列表
if(kcDetectionMain.getIsSelectKcDetailed() != null && kcDetectionMain.getIsSelectKcDetailed()){
Set<String> pidSet = Sets.newHashSet();
Map<String, KcDetectionMain> detectionMainMap = Maps.newHashMap();
pageList.getRecords().forEach(x -> {
pidSet.add(x.getId());
detectionMainMap.put(x.getId(),x);
x.setDetectionDetailedList(Lists.newArrayList());
} );
if(!pidSet.isEmpty()){
QueryWrapper<KcDetectionDetailed> qw = new QueryWrapper<>();
qw.lambda().in(KcDetectionDetailed::getPid,pidSet);
qw.orderByAsc("detection_num", "create_time");
List<KcDetectionDetailed> detailedList = kcDetectionDetailedService.list(qw);
detailedList.forEach(x -> {
if(detectionMainMap.containsKey(x.getPid())){
KcDetectionMain pData = detectionMainMap.get(x.getPid());
pData.getDetectionDetailedList().add(x);
}
});
}
}
return Result.OK(pageList);
}
// /**
// * 添加
// *
// * @param kcDetectionMain
// * @return
// */
// @AutoLog(value = "教室人数检测-主表-添加")
// @ApiOperation(value="教室人数检测-主表-添加", notes="教室人数检测-主表-添加")
// @RequiresPermissions("detection:kc_detection_main:add")
// @PostMapping(value = "/add")
// public Result<String> add(@RequestBody KcDetectionMain kcDetectionMain) {
// kcDetectionMainService.save(kcDetectionMain);
// return Result.OK("添加成功!");
// }
//
// /**
// * 编辑
// *
// * @param kcDetectionMain
// * @return
// */
// @AutoLog(value = "教室人数检测-主表-编辑")
// @ApiOperation(value="教室人数检测-主表-编辑", notes="教室人数检测-主表-编辑")
// @RequiresPermissions("detection:kc_detection_main:edit")
// @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
// public Result<String> edit(@RequestBody KcDetectionMain kcDetectionMain) {
// kcDetectionMainService.updateById(kcDetectionMain);
// return Result.OK("编辑成功!");
// }
//
// /**
// * 通过id删除
// *
// * @param id
// * @return
// */
// @AutoLog(value = "教室人数检测-主表-通过id删除")
// @ApiOperation(value="教室人数检测-主表-通过id删除", notes="教室人数检测-主表-通过id删除")
// @RequiresPermissions("detection:kc_detection_main:delete")
// @DeleteMapping(value = "/delete")
// public Result<String> delete(@RequestParam(name="id",required=true) String id) {
// kcDetectionMainService.removeById(id);
// return Result.OK("删除成功!");
// }
//
// /**
// * 批量删除
// *
// * @param ids
// * @return
// */
// @AutoLog(value = "教室人数检测-主表-批量删除")
// @ApiOperation(value="教室人数检测-主表-批量删除", notes="教室人数检测-主表-批量删除")
// @RequiresPermissions("detection:kc_detection_main:deleteBatch")
// @DeleteMapping(value = "/deleteBatch")
// public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
// this.kcDetectionMainService.removeByIds(Arrays.asList(ids.split(",")));
// return Result.OK("批量删除成功!");
// }
//
// /**
// * 通过id查询
// *
// * @param id
// * @return
// */
// //@AutoLog(value = "教室人数检测-主表-通过id查询")
// @ApiOperation(value="教室人数检测-主表-通过id查询", notes="教室人数检测-主表-通过id查询")
// @GetMapping(value = "/queryById")
// public Result<KcDetectionMain> queryById(@RequestParam(name="id",required=true) String id) {
// KcDetectionMain kcDetectionMain = kcDetectionMainService.getById(id);
// if(kcDetectionMain==null) {
// return Result.error("未找到对应数据");
// }
// return Result.OK(kcDetectionMain);
// }
//
// /**
// * 导出excel
// *
// * @param request
// * @param kcDetectionMain
// */
// @RequiresPermissions("detection:kc_detection_main:exportXls")
// @RequestMapping(value = "/exportXls")
// public ModelAndView exportXls(HttpServletRequest request, KcDetectionMain kcDetectionMain) {
// return super.exportXls(request, kcDetectionMain, KcDetectionMain.class, "教室人数检测-主表");
// }
//
// /**
// * 通过excel导入数据
// *
// * @param request
// * @param response
// * @return
// */
// @RequiresPermissions("detection:kc_detection_main:importExcel")
// @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
// public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
// return super.importExcel(request, response, KcDetectionMain.class);
// }
}

View File

@ -0,0 +1,93 @@
package org.jeecg.modules.kc.detection.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 教室人数检测-详细表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Data
@TableName("kc_detection_detailed")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="kc_detection_detailed对象", description="教室人数检测-详细表")
public class KcDetectionDetailed implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private java.lang.String id;
/**创建时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private java.util.Date createTime;
/**更新时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "更新时间")
private java.util.Date updateTime;
/**教室人数检测-主表ID[kc_detection_main.id]*/
@Excel(name = "教室人数检测-主表ID[kc_detection_main.id]", width = 15)
@ApiModelProperty(value = "教室人数检测-主表ID[kc_detection_main.id]")
private java.lang.String pid;
/**任务编号(课堂)*/
@Excel(name = "任务编号(课堂)", width = 15)
@ApiModelProperty(value = "任务编号(课堂)")
private java.lang.String rwbh;
/**课程编号*/
@Excel(name = "课程编号", width = 15)
@ApiModelProperty(value = "课程编号")
private java.lang.String kcbh;
/**课程名称*/
@Excel(name = "课程名称", width = 15)
@ApiModelProperty(value = "课程名称")
private java.lang.String kcmc;
/**教室编号*/
@Excel(name = "教室编号", width = 15)
@ApiModelProperty(value = "教室编号")
private java.lang.String jsbh;
/**学年学期内部用*/
@Excel(name = "学年学期内部用", width = 15)
@ApiModelProperty(value = "学年学期内部用")
private java.lang.String xnxq;
/**检测url*/
@Excel(name = "检测url", width = 15)
@ApiModelProperty(value = "检测url")
private java.lang.String detectionUrl;
/**截取图片结果URL*/
@Excel(name = "截取图片结果URL", width = 15)
@ApiModelProperty(value = "截取图片结果URL")
private java.lang.String detectionOutImgUrl;
/**截取图片计算人数返回结果*/
@Excel(name = "截取图片计算人数返回结果", width = 15)
@ApiModelProperty(value = "截取图片计算人数返回结果")
private java.lang.String detectionOutImgRes;
/**检测次数(当前是第几次)*/
@Excel(name = "检测次数(当前是第几次)", width = 15)
@ApiModelProperty(value = "检测次数(当前是第几次)")
private java.lang.Integer detectionNum;
/**当次检测人数*/
@Excel(name = "当次检测人数", width = 15)
@ApiModelProperty(value = "当次检测人数")
private java.lang.Integer num;
}

View File

@ -0,0 +1,99 @@
package org.jeecg.modules.kc.detection.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.modules.kc.ktgl.entity.KcKetangbiao;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 教室人数检测-主表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Data
@TableName(value = "kc_detection_main", autoResultMap = true)
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="kc_detection_main对象", description="教室人数检测-主表")
public class KcDetectionMain implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "id")
private String id;
/**创建时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**任务编号(课堂)*/
@Excel(name = "任务编号(课堂)", width = 15)
@ApiModelProperty(value = "任务编号(课堂)")
private String rwbh;
/**课程编号*/
@Excel(name = "课程编号", width = 15)
@ApiModelProperty(value = "课程编号")
private String kcbh;
/**课程名称*/
@Excel(name = "课程名称", width = 15)
@ApiModelProperty(value = "课程名称")
private String kcmc;
/**教室编号*/
@Excel(name = "教室编号", width = 15)
@ApiModelProperty(value = "教室编号")
private String jsbh;
/**学年学期内部用*/
@Excel(name = "学年学期内部用", width = 15)
@ApiModelProperty(value = "学年学期内部用")
private String xnxq;
/**检测url*/
@Excel(name = "检测url", width = 15)
@ApiModelProperty(value = "检测url")
private String detectionUrl;
/**检测次数*/
@Excel(name = "检测次数", width = 15)
@ApiModelProperty(value = "检测次数")
private Integer detectionNum;
/**人数(累加)*/
@Excel(name = "人数(累加)", width = 15)
@ApiModelProperty(value = "人数(累加)")
private Integer allNum;
/**平均数*/
@Excel(name = "平均数", width = 15)
@ApiModelProperty(value = "平均数")
private Integer averageNum;
/**课堂信息*/
@TableField(updateStrategy = FieldStrategy.IGNORED, typeHandler = FastjsonTypeHandler.class)
@ApiModelProperty(value = "课堂信息")
private KcKetangbiao ketangbiaoInfo;
/***/
@TableField(exist = false)
private List<KcDetectionDetailed> detectionDetailedList;
/***/
@TableField(exist = false)
private Boolean isSelectKcDetailed;
}

View File

@ -0,0 +1,26 @@
package org.jeecg.modules.kc.detection.job;
import org.jeecg.modules.kc.detection.service.IKcDetectionDetailedService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import javax.annotation.Resource;
/**
* @ClassName DetectionJob
* @Description 定时抓取
* @Author bai
* @Date 2024/5/7 16:48
* @Version 1.0
**/
public class DetectionJob implements Job {
@Resource
private IKcDetectionDetailedService detectionDetailedService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
detectionDetailedService.videoScreenshotAll();
}
}

View File

@ -0,0 +1,17 @@
package org.jeecg.modules.kc.detection.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.kc.detection.entity.KcDetectionDetailed;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 教室人数检测-详细表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
public interface KcDetectionDetailedMapper extends BaseMapper<KcDetectionDetailed> {
}

View File

@ -0,0 +1,17 @@
package org.jeecg.modules.kc.detection.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.kc.detection.entity.KcDetectionMain;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 教室人数检测-主表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
public interface KcDetectionMainMapper extends BaseMapper<KcDetectionMain> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.kc.detection.mapper.KcDetectionDetailedMapper">
</mapper>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.kc.detection.mapper.KcDetectionMainMapper">
</mapper>

View File

@ -0,0 +1,18 @@
package org.jeecg.modules.kc.detection.service;
import org.jeecg.modules.kc.detection.entity.KcDetectionDetailed;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.tools.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 教室人数检测-详细表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
public interface IKcDetectionDetailedService extends IService<KcDetectionDetailed> {
void videoScreenshotAll();
}

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.kc.detection.service;
import org.jeecg.modules.kc.detection.entity.KcDetectionMain;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 教室人数检测-主表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
public interface IKcDetectionMainService extends IService<KcDetectionMain> {
}

View File

@ -0,0 +1,227 @@
package org.jeecg.modules.kc.detection.service.impl;
import java.util.*;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.beust.jcommander.internal.Sets;
import com.google.common.collect.Maps;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.kc.detection.entity.KcDetectionDetailed;
import org.jeecg.modules.kc.detection.entity.KcDetectionMain;
import org.jeecg.modules.kc.detection.mapper.KcDetectionDetailedMapper;
import org.jeecg.modules.kc.detection.service.IKcDetectionDetailedService;
import org.jeecg.modules.kc.detection.service.IKcDetectionMainService;
import org.jeecg.modules.kc.jiaoshi.controller.KcZhihuijiaoshiController;
import org.jeecg.modules.kc.jiaoshi.entity.KcZhihuijiaoshi;
import org.jeecg.modules.kc.jiaoshi.service.IKcZhihuijiaoshiService;
import org.jeecg.modules.kc.kcJieci.entity.KcJieci;
import org.jeecg.modules.kc.kcJieci.service.IKcJieciService;
import org.jeecg.modules.kc.ktgl.controller.KcKetangbiaoController;
import org.jeecg.modules.kc.ktgl.entity.KcKetangbiao;
import org.jeecg.modules.kc.ktgl.service.IKcKetangbiaoService;
import org.jeecg.modules.tools.AuthService;
import org.jeecg.modules.tools.CommonUtil;
import org.jeecg.modules.tools.DateUtils;
import org.jeecg.modules.tools.URLEncoder;
import org.jeecg.modules.tools.ffmpeg.FFmpegTools;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.util.FileCopyUtils;
import javax.annotation.Resource;
import java.io.File;
import java.util.stream.Collectors;
/**
* @Description: 教室人数检测-详细表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Service
public class KcDetectionDetailedServiceImpl extends ServiceImpl<KcDetectionDetailedMapper, KcDetectionDetailed> implements IKcDetectionDetailedService {
@Resource
private IKcDetectionMainService kcDetectionMainService;
@Resource
private IKcZhihuijiaoshiService zhihuijiaoshiService;
@Resource
private AuthService authService;
@Resource
private FFmpegTools _FFmpegTools;
@Resource
private IKcKetangbiaoService kcKetangbiaoService;
@Resource
private IKcJieciService jieciService;
@Value(value = "${jeecg.path.upload}")
private String uploadpath;
@Override
public void videoScreenshotAll() {
DateTime starTime = DateTime.now();
String nowStr = starTime.toString("yyyy-MM-dd");
//新版查询当前是否有课
// KcZhihuijiaoshi jiaoshi = new KcZhihuijiaoshi();
// jiaoshi.setXm("学生全景");
// jiaoshi.setChangshang("奥威亚");
// QueryWrapper<KcZhihuijiaoshi> queryWrapper = new QueryWrapper<>();
// queryWrapper.eq("xm","学生全景");
// queryWrapper.eq("changshang","奥威亚");
String hh = "";
KcJieci kcJieci = new KcJieci();
List<KcJieci> kcJieciList = jieciService.getIndexJcList(kcJieci);
if(kcJieciList != null && !kcJieciList.isEmpty()){
KcJieci kcJieciParam = kcJieciList.get(0);
String[] jcArray = StringUtils.split(kcJieciParam.getJieci(),"");
hh = kcJieciParam.getJieci() + "," + String.join(",", jcArray);
}
KcKetangbiao kcKetangbiao = new KcKetangbiao();
kcKetangbiao.setSfyzhjs("1");
kcKetangbiao.setHh(hh);
kcKetangbiao.setSkrq(nowStr);
// kcKetangbiao.setUserid("");
kcKetangbiao.setSkxs(1);
kcKetangbiao.setSbType("1");
kcKetangbiao.setSftkb("1");
kcKetangbiao.setYwskxs("");
if(StringUtils.equals(",", hh)){
log.error("未查到节次,原因未知!");
return;
}
Page<KcKetangbiao> page = new Page<>(1, -1);
IPage<KcKetangbiao> pageList = kcKetangbiaoService.getKclblist(page, kcKetangbiao);
if(pageList != null){
List<KcKetangbiao> list = pageList.getRecords();
Set<String> jsbhSet = Sets.newHashSet();
Map<String, KcKetangbiao> KcKetangbiaoMap = Maps.newHashMap();
list.forEach(x -> {
KcKetangbiaoMap.put(x.getJsbh(), x);
jsbhSet.add(x.getJsbh());
});
//取智慧教室信息
//id: item.jsbh, ktId: item.id
QueryWrapper<KcZhihuijiaoshi> zhjsQW = new QueryWrapper<>();
zhjsQW.lambda().eq(KcZhihuijiaoshi::getXm,"学生全景");
zhjsQW.lambda().eq(KcZhihuijiaoshi::getChangshang,"奥威亚");
zhjsQW.lambda().in(KcZhihuijiaoshi::getJsbh, jsbhSet);
List<KcZhihuijiaoshi> zhihuijiaoshiList = zhihuijiaoshiService.list(zhjsQW);
zhihuijiaoshiList.forEach(x -> {
KcKetangbiao ketangbiao = KcKetangbiaoMap.get(x.getJsbh());
String fileName;
File uploadpathFile = new File(uploadpath);
String uploadpathFilePath = uploadpathFile.getPath();
File file = new File(uploadpathFilePath + File.separator + "videoScreenshot" + File.separator + DateUtils.getTradeNo() + File.separator);
String orgName = x.getPullUrl();// 获取文件名
orgName = CommonUtil.getFileName(orgName);
if(orgName.lastIndexOf(".")!=-1){
//qn更改-- 修复特殊字符上传后无法下载的问题修复多个.名称错乱的问题
orgName = URLEncoder.DEFAULT.encode(orgName);
//原名是m3u8不是图片改成jpeg
// fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + DateUtils.getTradeNo() + orgName.substring(orgName.lastIndexOf("."));
fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + DateUtils.getTradeNo() + ".jpeg";
}else{
// fileName = x.getRw"_" + orgName+ "_" + DateUtils.getTradeNo();
fileName = orgName+ "_" + DateUtils.getTradeNo();
}
//qn更改-- 修复特殊字符上传后无法下载的问题修复多个.名称错乱的问题END
// String savePath = file.getPath() + File.separator + fileName;
// File savefile = new File(savePath);
// FileCopyUtils.copy(mf.getBytes(), savefile);
//截图
String outImagePath = file.getPath() + File.separator + fileName;
FileUtil.touch(outImagePath);
String miniOutImagePath = StringUtils.replace(outImagePath, uploadpathFilePath, "");
miniOutImagePath = StringUtils.replace(miniOutImagePath,"\\","/");
boolean isSuccess = _FFmpegTools.videoScreenshot(x.getPullUrl(), outImagePath);
//查找主表
QueryWrapper<KcDetectionMain> detectionMainQw = new QueryWrapper<>();
detectionMainQw.apply("create_time >= '" + nowStr + " 00:00:00' and create_time <= '" + nowStr + " 23:59:59'");
detectionMainQw.lambda().eq(KcDetectionMain::getRwbh, ketangbiao.getRwbh());
detectionMainQw.last("limit 1");
KcDetectionMain detectionMain = kcDetectionMainService.getOne(detectionMainQw);
if(detectionMain == null) {
detectionMain = new KcDetectionMain();
detectionMain.setRwbh(ketangbiao.getRwbh());
detectionMain.setKcbh(ketangbiao.getKcbh());
detectionMain.setKcmc(ketangbiao.getKcmc());
detectionMain.setJsbh(x.getJsbh());
detectionMain.setXnxq(ketangbiao.getXnxq());
detectionMain.setDetectionUrl(x.getPullUrl());
detectionMain.setDetectionNum(0);
detectionMain.setAllNum(0);
detectionMain.setAverageNum(0);
}
Integer detectionNum = detectionMain.getDetectionNum();
detectionNum++;
detectionMain.setDetectionNum(detectionNum);
detectionMain.setKetangbiaoInfo(ketangbiao);
KcDetectionDetailed detectionDetailed = new KcDetectionDetailed();
detectionDetailed.setRwbh(ketangbiao.getRwbh());
detectionDetailed.setKcbh(ketangbiao.getKcbh());
detectionDetailed.setKcmc(ketangbiao.getKcmc());
detectionDetailed.setJsbh(x.getJsbh());
detectionDetailed.setXnxq(ketangbiao.getXnxq());
detectionDetailed.setDetectionUrl(x.getPullUrl());
detectionDetailed.setDetectionOutImgUrl(miniOutImagePath);
detectionDetailed.setDetectionOutImgRes("{\"res\":\"无法截取图片!\"}");
detectionDetailed.setDetectionNum(detectionNum);//截图序列号
detectionDetailed.setNum(0);
//取数量
if(isSuccess){
String rJson = authService.body_num(outImagePath);
detectionDetailed.setDetectionOutImgRes(rJson);
//解析获取数
JSONObject object= JSON.parseObject(rJson);
detectionDetailed.setNum(object.getInteger("person_num"));
}
Integer allNum = detectionMain.getAllNum();
allNum += detectionDetailed.getNum();
detectionMain.setAllNum(allNum);
detectionMain.setAverageNum(allNum/detectionNum);
//保存主表
if(StringUtils.isBlank(detectionMain.getId())){
kcDetectionMainService.save(detectionMain);
} else {
kcDetectionMainService.updateById(detectionMain);
}
detectionDetailed.setPid(detectionMain.getId());
//保存子表
save(detectionDetailed);
});
}
}
}

View File

@ -0,0 +1,19 @@
package org.jeecg.modules.kc.detection.service.impl;
import org.jeecg.modules.kc.detection.entity.KcDetectionMain;
import org.jeecg.modules.kc.detection.mapper.KcDetectionMainMapper;
import org.jeecg.modules.kc.detection.service.IKcDetectionMainService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 教室人数检测-主表
* @Author: jeecg-boot
* @Date: 2024-05-07
* @Version: V1.0
*/
@Service
public class KcDetectionMainServiceImpl extends ServiceImpl<KcDetectionMainMapper, KcDetectionMain> implements IKcDetectionMainService {
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.UnavailableSecurityManagerException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.kc.kcTingkeBmd.entity.KcTingkeBmd;
import org.jeecg.modules.kc.kcTingkeBmd.mapper.KcTingkeBmdKcxxMapper;
@ -36,16 +37,24 @@ public class KcKetangbiaoServiceImpl extends ServiceImpl<KcKetangbiaoMapper, KcK
@Override
public IPage<KcKetangbiao> getKclblist(Page<KcKetangbiao> page, KcKetangbiao kcKetangbiao) {
LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
LoginUser user = null;
try {
user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
} catch (UnavailableSecurityManagerException e) {
log.error("无法获取用户");
}
//获取当前用户是否有白名单权限
QueryWrapper<KcTingkeBmd> kcTingkeBmdQueryWrapper = new QueryWrapper<>();
kcTingkeBmdQueryWrapper.eq("jgh",user.getUsername());
if(user != null){
kcTingkeBmdQueryWrapper.eq("jgh",user.getUsername());
}
List<KcTingkeBmd> list = kcTingkeBmdMapper.selectList(kcTingkeBmdQueryWrapper);
String bmdId = "";
for(int i = 0; i < list.size(); i++){
bmdId = list.get(i).getId()+",";
}
if(bmdId.indexOf(",")>-1){
if(bmdId.contains(",")){
bmdId = bmdId.substring(0,bmdId.length()-1);
}
kcKetangbiao.setBmdId(bmdId);

View File

@ -0,0 +1,94 @@
package org.jeecg.modules.tools;
//import org.apache.commons.lang.StringUtils;
//import org.joda.time.format.DateTimeFormat;
//import org.joda.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* @ClassName DateUtils
* @Description 日期工具类
* @Author raymond
* @Date 2024/4/7 10:24
* @Version 1.0
**/
public class DateUtils {
/** 时间格式(yyyy-MM-dd) */
public final static String DATE_PATTERN = "yyyy-MM-dd";
public final static String DATE_PATTERN_CHINESE = "yyyy年MM月dd日";
public final static String DATE_PATTERN_String = "yyyy-MM-dd"+" 00:00:00";
public final static String DATE_PATTERN_END_TIME = "yyyy-MM-dd"+" 23:59:59";
/** 时间格式(yyyy-MM-dd HH) */
public final static String DATE_PATTERN_HOURS = "yyyy-MM-dd HH";
/** 时间格式(yyyy-MM-dd HH:mm) */
public final static String DATE_PATTERN_MINUTE = "yyyy-MM-dd HH:mm";
/** 时间格式(yyyy-MM-dd HH:mm:ss) */
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public final static String DATE_PAY_TIME = "yyyyMMddHHmmss";
/**
* 日期格式化 日期格式为yyyy-MM-dd
* @param date 日期
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date) {
return format(date, DATE_PATTERN);
}
/**
* 日期格式化 日期格式为yyyy-MM-dd
* @param date 日期
* @param pattern 格式DateUtils.DATE_TIME_PATTERN
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date, String pattern) {
if(date != null){
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
// public static Date stringToDate(String strDate, String pattern) {
// if (StringUtils.isBlank(strDate)){
// return null;
// }
//
// DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
// return fmt.parseLocalDateTime(strDate).toDate();
// }
public static Date executeDate(String payTime){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
try {
return sdf.parse(payTime);
} catch (ParseException e) {
return null;
}
}
public static String getTradeNo(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
String str = sdf.format(new Date());
str += DateUtils.getCaptcha().substring(0,6);
return str.toLowerCase(Locale.ROOT);
}
public static String getCaptcha(){
String str = "";
for (int i = 0; i < 7; i++) {
int num = (int) (Math.random() * 8);
str = str +num;
}
return str;
}
public static void main(String[] args) {
}
}

View File

@ -0,0 +1,120 @@
package org.jeecg.modules.tools.ffmpeg;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RuntimeUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName FFmpegTools
* @Description FFmpeg相关工具
* @Author bai
* @Date 2024/5/6 19:53
* @Version 1.0
**/
@Component
@Slf4j
public class FFmpegTools {
/**
* 执行命令的核心文件
*/
@Value("${ffmpeg.executableFile}")
public String executableFile;
/**
* 日志等级 quiet | panic | fatal | error | warning | info | verbose | debug | trace默认值为 info
*/
@Value("${ffmpeg.videoScreenshot.loglevel}")
public String loglevel;
/**
* 视频过滤器
*/
@Value("${ffmpeg.videoScreenshot.vf}")
public String vf;
/**
* 图片压缩比例
*/
@Value("${ffmpeg.videoScreenshot.compressionRatio}")
public String compressionRatio;
/**
* 是否覆盖输出文件 y:覆盖 | n:不覆盖
*/
@Value("${ffmpeg.videoScreenshot.isOverwrite}")
public String isOverwrite;
/**
*
* @return [true: 压缩成功 | false: 压缩失败或是未压缩]
*/
public boolean videoScreenshot(String inputPath,String outPath){
// -q:v 2 压缩比例数越大图越小
// -vsync vfr 同步类型不知含义
// -frames 1 截一帧
// -vf 视频过滤器select 选择器 scale缩放比例-1:-1为原比例
// ffmpeg -i https://kczx.nenu.edu.cn:9553/live_hls/wzl0236s_xsqj.m3u8 -q:v 2 -vf "select=not(mod(n\,15)),scale=-1:-1" -vsync vfr -frames:v 1 snapshot2.jpg
List<String> command = Lists.newArrayList();
command.add(executableFile);
command.add("-i");
command.add(inputPath);//输入的文件地址
command.add("-vf");
command.add(vf);//视频过滤器参数
command.add("-vsync");
command.add("vfr");//同步类型
command.add("-frames:v");
command.add("1");//截取一帧
command.add("-q:v");
command.add(compressionRatio);//压缩比
command.add(outPath);//出的文件地址
if(StringUtils.isNotBlank(loglevel)){
command.add("-loglevel");//如果写了日志级别则添加参数不写默认是info
command.add(loglevel);
}
if(StringUtils.isNotBlank(isOverwrite)){
command.add("-" + isOverwrite);//是否覆盖 y | n
}
String[] cmdArr = command.toArray(new String[]{});
log.debug("命令行参数为:{}",command);
log.debug("命令行参数为:{}",command.stream().collect(Collectors.joining(" ")));
log.info("\n--FFmpegTools--\n开始截取一帧图片\n输入文件地址{}",inputPath);
Process process = RuntimeUtil.exec(cmdArr);
String res = RuntimeUtil.getResult(process);
log.debug("脚本输出信息:\n{}",res);
//没法判断返回值信息贼多且没有个成功标识
if(FileUtil.exist(outPath)){
log.info("\n--FFmpegTools--\n截取一帧图片成功\n输出文件地址{}",outPath);
return true;
}else{
log.error("\n--FFmpegTools--\n截取一帧图片失败\n输出文件不存在输出文件地址{}",outPath);
}
return false;
}
public static void main(String[] args) {
FFmpegTools _FFmpegTools = new FFmpegTools();
_FFmpegTools.executableFile = "D:\\ProgramGreeFile\\ffmpeg\\bin\\ffmpeg.exe";
_FFmpegTools.loglevel = "info";
_FFmpegTools.vf = "\"select=not(mod(n\\,15)),scale=-1:-1\"";
// _FFmpegTools.vf = " -vsync vfr -frames:v 1";
_FFmpegTools.compressionRatio = "2";
_FFmpegTools.isOverwrite = "y";
boolean res = _FFmpegTools.videoScreenshot("https://kczx.nenu.edu.cn:9553/live_hls/wzl0236s_xsqj.m3u8","F:\\temp\\000\\11\\jietu22.jpeg");
log.debug("最终结果:{}",res);
}
}

View File

@ -17,18 +17,18 @@ import java.util.List;
@Slf4j
public class ZipImage {
/**
* 执行命令的核心文件
*/
@Value("${ffmpeg.executableFile}")
public String executableFile;
/**
* 是否开启压缩true:开启压缩 | false:关闭压缩
*/
@Value("${ffmpeg.compress.enable}")
public boolean enable;
/**
* 执行命令的核心文件
*/
@Value("${ffmpeg.compress.executableFile}")
public String executableFile;
/**
* 压缩比,正整数数越大压缩比越高
*/

View File

@ -302,14 +302,14 @@ libreOffice:
ffmpeg:
# 根路径
path: D:\ProgramGreeFile\ffmpeg\bin
# 执行命令的核心文件
executableFile: ${ffmpeg.path}\ffmpeg.exe
# 压缩相关
compress:
# 是否开启压缩【true:开启压缩 | false:关闭压缩 】
enable: false
# 日志等级,【 quiet | panic | fatal | error | warning | info | verbose | debug | trace】默认值为info
loglevel: error
# 执行命令的核心文件
executableFile: ${ffmpeg.path}\ffmpeg.exe
# 压缩比,正整数,数越大压缩比越高
compressionRatio: 50
# 是否覆盖输出文件【 y:覆盖 | n:不覆盖 】
@ -318,6 +318,16 @@ ffmpeg:
isDeleteSourceFile: true
# 压缩文件扩展名范围
extensionFilter: png,jpg,jpeg
# 视频截图相关
videoScreenshot:
# 日志等级,【 quiet | panic | fatal | error | warning | info | verbose | debug | trace】默认值为info
loglevel: error
# 是否覆盖输出文件【 y:覆盖 | n:不覆盖 】
isOverwrite: y
# 压缩 数越大,图越小
compressionRatio: 2
# 视频过滤器参数此处用意为截1张原尺寸当前时间的最新帧
vf: '"select=not(mod(n\,15)),scale=-1:-1"'
# 维普检测接口
weipu:
userId: 765996

View File

@ -310,14 +310,14 @@ libreOffice:
ffmpeg:
# 根路径
path: D:\ProgramGreeFile\ffmpeg\bin
# 执行命令的核心文件
executableFile: ${ffmpeg.path}\ffmpeg.exe
# 压缩相关
compress:
# 是否开启压缩【true:开启压缩 | false:关闭压缩 】
enable: false
# 日志等级,【 quiet | panic | fatal | error | warning | info | verbose | debug | trace】默认值为info
loglevel: error
# 执行命令的核心文件
executableFile: ${ffmpeg.path}\ffmpeg.exe
# 压缩比,正整数,数越大压缩比越高
compressionRatio: 50
# 是否覆盖输出文件【 y:覆盖 | n:不覆盖 】
@ -326,6 +326,16 @@ ffmpeg:
isDeleteSourceFile: true
# 压缩文件扩展名范围
extensionFilter: png,jpg,jpeg
# 视频截图相关
videoScreenshot:
# 日志等级,【 quiet | panic | fatal | error | warning | info | verbose | debug | trace】默认值为info
loglevel: error
# 是否覆盖输出文件【 y:覆盖 | n:不覆盖 】
isOverwrite: y
# 压缩 数越大,图越小
compressionRatio: 2
# 视频过滤器参数此处用意为截1张原尺寸当前时间的最新帧
vf: '"select=not(mod(n\,15)),scale=-1:-1"'
# 维普检测接口
weipu:
userId: 765996