/* * 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.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; 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.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; private static String uids; private static int count=0; /** * 详情 */ @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 uid) { String UUID = DateUtil.time(); UUIDs=UUID; uids=uid; 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,uids,jid); return vaddress; } // /** // * Javacv录制视频测试 // */ // @PostMapping("/cs") // public void rVoids(String url,String uid) { // String UUID = DateUtil.time(); // UUIDs=UUID; // String newJson = StringEscapeUtils.unescapeHtml4(url); // RecordVideoThread recordVideoThread = new RecordVideoThread(newJson,"D:\\software\\minio\\data\\jfpt\\void\\"+UUID +".mp4"); // thread = new Thread(recordVideoThread); // thread.start(); // } // // @PostMapping("/csc") // public String stopcs(String jid) throws FrameGrabber.Exception { // //返回前端路径 // String vaddress = null; // // 发出中断标志 true // thread.interrupt(); // //返回路径 // vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4"; // //把路径通过警情id添加到警情信息 // String uids=Integer.toString(count); // alarmService.updateVaddress(vaddress,uids,jid); // return vaddress; // // } }