/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.springblade.jfpt.rvideo.controller; import io.minio.MinioClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import jodd.util.StringPool; import lombok.AllArgsConstructor; import javax.validation.Valid; import net.logstash.logback.encoder.org.apache.commons.lang3.StringEscapeUtils; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.jfpt.alarm.service.IAlarmService; import org.springblade.jfpt.xlfeedback.service.IXlfeedbackService; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.jfpt.rvideo.entity.Rvideo; import org.springblade.jfpt.rvideo.vo.RvideoVO; import org.springblade.jfpt.rvideo.service.IRvideoService; import org.springblade.core.boot.ctrl.BladeController; import java.io.File; import org.bytedeco.javacpp.avcodec; import org.bytedeco.javacv.*; import java.io.IOException; /** * 控制器 * * @author BladeX * @since 2021-03-24 */ @RestController @AllArgsConstructor @RequestMapping("/rvideo") @Api(value = "", tags = "接口") public class RvideoController extends BladeController { private final IRvideoService rvideoService; private final IAlarmService alarmService; private final IXlfeedbackService xlfeedbackService; private static String PRE_URL = "D:\\software\\minio\\data\\jfpt\\void\\"; private static String PRF_MINIO_URL = "minio/jfpt/void/"; private static Thread thread; private static String UUIDs; /** * 详情 */ @GetMapping("/detail") @ApiOperationSupport(order = 1) @ApiOperation(value = "详情", notes = "传入rvideo") public R detail(Rvideo rvideo) { Rvideo detail = rvideoService.getOne(Condition.getQueryWrapper(rvideo)); return R.data(detail); } /** * 分页 */ @GetMapping("/list") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "传入rvideo") public R> list(Rvideo rvideo, Query query) { IPage pages = rvideoService.page(Condition.getPage(query), Condition.getQueryWrapper(rvideo)); return R.data(pages); } /** * 自定义分页 */ @GetMapping("/page") @ApiOperationSupport(order = 3) @ApiOperation(value = "分页", notes = "传入rvideo") public R> page(RvideoVO rvideo, Query query) { IPage pages = rvideoService.selectRvideoPage(Condition.getPage(query), rvideo); return R.data(pages); } /** * 新增 */ @PostMapping("/save") @ApiOperationSupport(order = 4) @ApiOperation(value = "新增", notes = "传入rvideo") public R save(@Valid @RequestBody Rvideo rvideo) { return R.status(rvideoService.save(rvideo)); } /** * 修改 */ @PostMapping("/update") @ApiOperationSupport(order = 5) @ApiOperation(value = "修改", notes = "传入rvideo") public R update(@Valid @RequestBody Rvideo rvideo) { return R.status(rvideoService.updateById(rvideo)); } /** * 新增或修改 */ @PostMapping("/submit") @ApiOperationSupport(order = 6) @ApiOperation(value = "新增或修改", notes = "传入rvideo") public R submit(@Valid @RequestBody Rvideo rvideo) { return R.status(rvideoService.saveOrUpdate(rvideo)); } /** * 删除 */ @PostMapping("/remove") @ApiOperationSupport(order = 8) @ApiOperation(value = "删除", notes = "传入ids") public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) { return R.status(rvideoService.removeByIds(Func.toLongList(ids))); } /** * @param sourcePath 源路径 * @param jid 警情id * @throws Exception */ @PostMapping("/rVoid") public String rVoid(String sourcePath,String jid) throws Exception { String webroot = "D:\\LXVideoServer\\3rd\\ffmpeg\\bin"; String UUID = DateUtil.time(); //目标路径 String targetPath = PRE_URL + UUID + ".mp4"; //返回前端路径 String vaddress = null; Runtime run = null; try { run = Runtime.getRuntime(); long start = System.currentTimeMillis(); System.out.println(new File(webroot).getAbsolutePath()); //通过视频url录制30s视频保存,格式为MP4 String newJson = StringEscapeUtils.unescapeHtml4(sourcePath); Process p = run.exec(new File(webroot).getAbsolutePath() + "/ffmpeg -i " +newJson+ " -y -t 00:00:30 -codec copy -f mp4 " + targetPath); //释放进程 p.getOutputStream().close(); p.getInputStream().close(); p.getErrorStream().close(); p.waitFor(); long end = System.currentTimeMillis(); System.out.println(sourcePath + " convert success, costs:" + (end - start) + "ms"); } catch (Exception e) { e.printStackTrace(); } finally { //run调用lame解码器最后释放内存 run.freeMemory(); //返回路径 vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUID + ".mp4"; //把路径通过警情id添加到警情信息 alarmService.updateVaddress(vaddress,jid); } return vaddress; } /** * Javacv录制视频 */ @PostMapping("/rVoids") public void rVoids(String url) { String UUID = DateUtil.time(); UUIDs=UUID; RecordVideoThread recordVideoThread = new RecordVideoThread(); recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4"; recordVideoThread.timesSec = 0L; String newJson = StringEscapeUtils.unescapeHtml4(url); recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放 recordVideoThread.isAudio = true; thread = new Thread(recordVideoThread); thread.start(); } @PostMapping("/stop") public String stop(String jid) throws FrameGrabber.Exception { //返回前端路径 String vaddress = null; thread.stop(); //返回路径 vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4"; //把路径通过警情id添加到警情信息 alarmService.updateVaddress(vaddress,jid); return vaddress; } }