Kaynağa Gözat

优化识别

suntianwu 3 yıl önce
ebeveyn
işleme
1760c28c17

+ 1 - 2
src/main/java/com/iden/bms/controller/CommunityController.java

@@ -42,8 +42,7 @@ public class CommunityController {
 
     @GetMapping("/listCommunity4Select")
     @ApiOperation(value = "小区下拉列表 ")
-    public Result<List<CommunityVO>> listCommunity4Select(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                          PageReqVO pageReqVo){
+    public Result<List<CommunityVO>> listCommunity4Select(HttpServletRequest request, @RequestHeader(value = "token") String token){
         try {
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
             List<CommunityVO> datas = this.communityService.listCommunity4Select(loginUser);

+ 1 - 2
src/main/java/com/iden/bms/controller/CrowdController.java

@@ -44,8 +44,7 @@ public class CrowdController {
     private PersonService personService;
     @GetMapping("/listCommunity4Select")
     @ApiOperation(value = "人群下拉列表 ")
-    public Result<List<CrowdVO>> listCommunity4Select(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                          PageReqVO pageReqVo){
+    public Result<List<CrowdVO>> listCommunity4Select(HttpServletRequest request, @RequestHeader(value = "token") String token){
         try {
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
             List<CrowdVO> datas = this.crowdService.lisCrowd4Select(loginUser);

+ 1 - 2
src/main/java/com/iden/bms/controller/DistrictController.java

@@ -38,8 +38,7 @@ public class DistrictController {
 
     @GetMapping("/listDistrict4Select")
     @ApiOperation(value = "区域下拉列表 ")
-    public Result<List<DistrictVO>> listDistrict4Select(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                   PageReqVO pageReqVo){
+    public Result<List<DistrictVO>> listDistrict4Select(HttpServletRequest request, @RequestHeader(value = "token") String token){
         try {
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
             List<DistrictVO> datas = this.districtService.listDistrict4Select(loginUser);

+ 15 - 10
src/main/java/com/iden/bms/controller/SubistrictController.java

@@ -10,13 +10,12 @@ import com.iden.common.vo.SubdistrictVO;
 import com.iden.common.vo.PageReqVO;
 import com.iden.common.vo.UserLoginedConvertVO;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
@@ -27,7 +26,7 @@ import java.util.List;
  * @Desc:
  */
 @RestController
-@Api(value = "SubdistrictController", tags = { "区域管理" })
+@Api(value = "SubdistrictController", tags = { "街道管理" })
 @Slf4j
 @RequestMapping("/bms/subdistrict")
 @Permission
@@ -37,18 +36,24 @@ public class SubistrictController {
     private SubdistrictService subdistrictService;
 
     @GetMapping("/listSubdistrict4Select")
-    @ApiOperation(value = "区域下拉列表 ")
+    @ApiOperation(value = "街道下拉列表 ")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", required = true, name = "token", dataType = "String", value = "token验证信息"),
+            @ApiImplicitParam(name = "district", value = "街道",
+                    dataType = "String", paramType = "query",
+                    required = false)
+    })
     public Result<List<SubdistrictVO>> listSubdistrict4Select(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                                   PageReqVO pageReqVo){
+                                                              @RequestParam(name = "district", required = false) String district){
         try {
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
-            List<SubdistrictVO> datas = this.subdistrictService.listSubdistrict4Select(loginUser);
+            List<SubdistrictVO> datas = this.subdistrictService.listSubdistrict4Select(district,loginUser);
             return Result.success(datas);
         }catch (BDException e) {
-            log.error("区域下拉列表查询-分页列表出现异常",e);
+            log.error("街道下拉列表查询-分页列表出现异常",e);
             return  PageResult.error(e.getMessage());
         } catch (Exception e) {
-            log.error("区域管理: 区域下拉列表查询出现异常",e);
+            log.error("街道管理: 街道下拉列表查询出现异常",e);
             return PageResult.error( "获取列表失败");
         }
     }

+ 1 - 1
src/main/java/com/iden/bms/service/CommunityService.java

@@ -59,7 +59,7 @@ public class CommunityService {
     public List<CommunityVO> listCommunity4Select(UserLoginedConvertVO loginUser) {
 
         QueryWrapper<IdenCommunity> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().orderByAsc(IdenCommunity::getName);
+        queryWrapper.lambda().orderByAsc(IdenCommunity::getCode);
 
         List<IdenCommunity> list = this.idenCommunityService.list(queryWrapper);
         List<CommunityVO> results = new ArrayList<>();

+ 1 - 1
src/main/java/com/iden/bms/service/CrowdService.java

@@ -46,7 +46,7 @@ public class CrowdService {
     public List<CrowdVO> lisCrowd4Select(UserLoginedConvertVO loginUser) {
 
         QueryWrapper<IdenCrowd> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().orderByAsc(IdenCrowd::getName);
+        queryWrapper.lambda().orderByAsc(IdenCrowd::getCode);
 
         List<IdenCrowd> list = this.idenCrowdService.list(queryWrapper);
         List<CrowdVO> results = new ArrayList<>();

+ 2 - 2
src/main/java/com/iden/bms/service/FaceIdenService.java

@@ -7,7 +7,7 @@ import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
-import com.iden.bms.tool.FaceIdenTool;
+import com.iden.common.facetool.FaceIdenTool;
 import com.iden.common.cache.FaceMoniterCache;
 import com.iden.common.cache.RedisKeyConstant;
 import com.iden.common.cache.RedisUtil;
@@ -21,7 +21,7 @@ import com.iden.common.service.*;
 import com.iden.common.util.ByteUtil;
 import com.iden.common.util.DateUtils;
 import com.iden.common.util.FileUtil;
-import com.iden.common.util.VideoUtil;
+import com.iden.common.videotool.VideoUtil;
 import com.iden.common.vo.FaceRetrieveResultVO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;

+ 1 - 1
src/main/java/com/iden/bms/service/PersonService.java

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
-import com.iden.bms.tool.FaceIdenTool;
+import com.iden.common.facetool.FaceIdenTool;
 import com.iden.common.cache.DictCache;
 import com.iden.common.cache.FaceMoniterCache;
 import com.iden.common.cache.RedisKeyConstant;

+ 2 - 1
src/main/java/com/iden/bms/service/SubdistrictService.java

@@ -30,9 +30,10 @@ public class SubdistrictService {
      * 查询街道列表
      * @return
      */
-    public List<SubdistrictVO> listSubdistrict4Select(UserLoginedConvertVO loginUser) {
+    public List<SubdistrictVO> listSubdistrict4Select(String district, UserLoginedConvertVO loginUser) {
 
         QueryWrapper<IdenSubdistrict> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IdenSubdistrict::getDistrict,district);
         queryWrapper.lambda().orderByAsc(IdenSubdistrict::getName);
 
         List<IdenSubdistrict> list = this.idenSubdistrictService.list(queryWrapper);

+ 1 - 1
src/main/java/com/iden/bms/service/TraceService.java

@@ -10,7 +10,7 @@ import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;
-import com.iden.bms.tool.FaceIdenTool;
+import com.iden.common.facetool.FaceIdenTool;
 import com.iden.common.entity.IdenCamera;
 import com.iden.common.entity.IdenCameraVideo;
 import com.iden.common.entity.IdenCommunity;

+ 1 - 1
src/main/java/com/iden/bms/tool/FaceIdenTool.java

@@ -1,4 +1,4 @@
-package com.iden.bms.tool;
+package com.iden.common.facetool;
 
 import com.face.monitor.FaceMonitor;
 import com.face.monitor.model.FaceModel;

+ 96 - 0
src/main/java/com/iden/common/videotool/VideoUtil.java

@@ -0,0 +1,96 @@
+package com.iden.common.videotool;
+
+
+
+import com.iden.common.util.DateUtils;
+import org.bytedeco.javacv.*;
+import org.bytedeco.javacv.Frame;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.imageio.ImageIO;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.*;
+
+
+/**
+ * 视频工具
+ *
+ * @author
+ */
+public class VideoUtil {
+
+
+    private static final Logger logger = LoggerFactory.getLogger(VideoUtil.class);
+
+
+    public static Long fetchAllPic(File videoFile, String saveDir, Date shootEndTime) throws Exception {
+
+        Long endTime = shootEndTime.getTime() ;
+
+        java.util.List<File> files = new ArrayList<>();
+
+        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFile);
+        ff.start();
+
+        // 此视频时长(ms/毫秒秒)
+        Long duration = ff.getLengthInTime() /  1000;
+        logger.info("duration==" + duration);
+
+        Long beginTime = endTime - duration;
+
+        // 视频总帧数
+        int frameLength = ff.getLengthInFrames();
+
+        logger.info("length==" + frameLength);
+
+        //帧率(1秒多少帧)
+        double framRate = ff.getFrameRate();
+
+        int i = 0;
+        Frame frame = null;
+
+        while (i < frameLength) {
+            frame = ff.grabImage();
+            if (frame != null && frame.image != null) {
+                Double time = beginTime + (i * (1000/framRate));
+                String fileName = DateUtils.formatToDateStr(new Date(time.longValue()),"yyyyMMddHHmmss") + "_" + UUID.randomUUID().toString();
+                files.add(writeToFile(frame, saveDir, fileName));
+            }
+            i++;
+        }
+        ff.stop();
+        return duration;
+    }
+
+    private static File writeToFile(Frame frame, String saveDir, String fileName) throws Exception {
+        File saveDirFile = new File(saveDir);
+        if(!saveDirFile.exists()) {
+            saveDirFile.mkdirs();
+        }
+        File targetFile = new File(saveDir + File.separator + fileName + ".jpg");
+        String imgSuffix = "jpg";
+
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        BufferedImage srcBi = converter.getBufferedImage(frame);
+        int owidth = srcBi.getWidth();
+        int oheight = srcBi.getHeight();
+        // 对截取的帧进行等比例缩放
+        int width = 800;
+        int height = (int) (((double) width / owidth) * oheight);
+        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+        bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
+        try {
+            ImageIO.write(bi, imgSuffix, targetFile);
+        } catch (Exception e) {
+            throw new Exception( "截帧失败");
+        }
+        return targetFile;
+    }
+
+
+
+}

+ 51 - 0
src/test/java/com/face/video/CmdExecuter.java

@@ -0,0 +1,51 @@
+package com.face.video;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.LinkedList;
+import java.util.List;
+public class CmdExecuter {
+    public static String exec(List<String> cmd) {
+        String converted_time = null;
+        Process proc =null;
+        BufferedReader stdout = null;
+        try {
+            ProcessBuilder builder = new ProcessBuilder();
+            builder.command(cmd);
+            builder.redirectErrorStream(true);
+            proc = builder.start();
+            stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+            String line;
+            int lineNumber=1;
+            List<String> returnStringList = new LinkedList<String>();
+            while ((line = stdout.readLine()) != null) {
+                System.out.println("第"+lineNumber+"行:"+line);
+                lineNumber=lineNumber+1;
+                returnStringList.add(FFMPEG.dealString(line));
+            }
+            String info = "";
+            for (int i = returnStringList.size() - 1; i >= 0; i--) {
+                if (null != returnStringList.get(i)	&& returnStringList.get(i).startsWith("frame=")) {
+                    info = returnStringList.get(i);
+                    break;
+                }
+            }
+            if (null != info) {
+                converted_time = info.split("time=")[1].split("bitrate=")[0].trim();
+            }
+        } catch (IndexOutOfBoundsException ex) {
+            converted_time = null;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally{
+            try {
+                proc.waitFor();
+                stdout.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return converted_time;
+    }
+
+}

+ 122 - 0
src/test/java/com/face/video/FFMPEG.java

@@ -0,0 +1,122 @@
+package com.face.video;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class FFMPEG {
+    public static String dealString(String str) {
+        Matcher m = java.util.regex.Pattern.compile("^frame=.*").matcher(str);
+        String msg = "";
+        while (m.find()) {
+            msg = m.group();
+        }
+        return msg;
+    }
+
+    /**
+     * 如果是数字就是成功的时间(秒数)
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isNumeric(String str) {
+        Pattern pattern = Pattern.compile("[0-9]*");
+        Matcher isNum = pattern.matcher(str);
+        if (!isNum.matches()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 如果返回不是null的值就是成功(值为转换用时单位:秒)
+     *
+     * @param instr
+     * @return
+     */
+    public static String returnSecond(String instr) {
+        String returnValue = null;
+        if (null != instr) {
+            String[] a = instr.split("\\.");
+            String[] b = a[0].split(":");
+            int returnNumber = 0;
+            if (null != instr && b[0].length() != 0) {
+                returnNumber = Integer.valueOf(b[0]) * 60 * 60 + Integer.valueOf(b[1]) * 60 + Integer.valueOf(b[2]);
+                returnValue = String.valueOf(returnNumber);
+            } else {
+                returnValue = null;
+            }
+        }
+        return returnValue;
+    }
+
+    /**
+     * 获取视频格式(转码前的格式和转码后的格式都可以调用)
+     *
+     * @param outputPath
+     * @return
+     */
+    public static String returnVideoFormat(String outputPath) {
+        return outputPath.substring(outputPath.lastIndexOf(".") + 1);
+    }
+
+    /**
+     * @ HashMap<String,String> dto 参数传递对象<br>
+     * dto中包含的参数<br>
+     * (必填)1.ffmpeg_path:ffmpeg执行文件地址,如 d:\\ffmpeg\\ffmpeg.exe
+     * Linux下直接调用ffmpeg命令(当然你事先已经有这个程序了)<br>
+     * (必填)2.input_path:原视频路径<br>
+     * (必填)3.video_converted_path:转换后视频输出路径<br>
+     * (可选)4.screen_size:视频尺寸 长度乘宽度 乘号用英文小写"x"如 512x480<br>
+     * (可选)5.logo:水印地址(其实在ffmpeg中有一个专门的watermark参数,logo跟它有何不同,我还没看,不过对我来说效果一样
+     * 貌似需要png图片才行)<br>
+     * (可选,如果填写必须有logo才行,默认为0)6.xaxis:水印logo的横坐标(只有logo参数为一个正确路径才行) 比如0<br>
+     * (可选,如果填写必须有logo才行,默认为0)6.yaxis:水印logo的纵坐标(只有logo参数为一个正确路径才行) 比如0<br>
+     * (可选)vb:视频比特率,传入一个数值,单位在程序里面拼接了k (可选)ab:音频比特率,传入一个数值,单位在程序里面拼接了k
+     *
+     * width:裁剪后的宽度 height:裁剪后的高度 xaxis:裁剪起始点横坐标 yaxis:裁剪起始点纵坐标
+     */
+    public String videoTransfer(HashMap<String, String> dto) {
+        // String ffmpeg_path,String input_path,String video_converted_path,String
+        // logo,String screen_size,String xaxis,String yaxis,String vb,String ab
+        List<String> cmd = new ArrayList<String>();
+        cmd.add("ffmpeg");
+        cmd.add("-i");
+        cmd.add(dto.get("input_path"));
+
+        cmd.add("-vf");
+        String width = dto.get("width");
+        String height = dto.get("height");
+        //String xaxis = dto.get("xaxis");
+        //String yaxis = dto.get("yaxis");
+        //xaxis = xaxis != null && !xaxis.equals("") ? xaxis : "0";
+        //yaxis = yaxis != null && !yaxis.equals("") ? yaxis : "0";
+
+        //String cropString = "crop=" + width + ":" + height + ":" + xaxis + ":" + yaxis;
+        //String cropString = "crop=" + xaxis + ":" + yaxis;
+        String cropString = "crop=" + width + ":" + height ;
+
+        cmd.add(cropString);
+
+        cmd.add(dto.get("video_converted_path"));
+        String converted_time = CmdExecuter.exec(cmd);
+        return returnSecond(converted_time);// 获取转换时间
+    }
+
+    public static void main(String[] arg) {
+        HashMap<String, String> dto = new HashMap<String, String>();
+        dto.put("ffmpeg_path", "D:\\program\\ffmpeg\\ffmpeg.exe");// 必填
+        dto.put("input_path", "e:/20211223123223_76639ced-6400-11ec-b8f9-fa163e4e1e9f.mp4");// 必填
+        //dto.put("width", "720");// 必填
+        //dto.put("height", "1280");
+        dto.put("width", "540");
+        dto.put("height", "796");
+        dto.put("video_converted_path", "e:\\b3.mp4");
+        String secondsString = new FFMPEG().videoTransfer(dto);
+        System.out.println("转换共用:" + secondsString + "秒");
+    }
+
+}

+ 17 - 14
src/main/java/com/iden/common/util/VideoUtil.java

@@ -1,7 +1,7 @@
-package com.iden.common.util;
+package com.face.video;
 
 
-import com.iden.common.enums.TimeoutOption;
+import com.iden.common.util.DateUtils;
 import net.bramp.ffmpeg.FFmpeg;
 import net.bramp.ffmpeg.FFmpegExecutor;
 import net.bramp.ffmpeg.FFprobe;
@@ -17,8 +17,10 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.File;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 
 /**
@@ -26,11 +28,11 @@ import java.util.List;
  *
  * @author
  */
-public class VideoUtil {
+public class VideoTest {
 
     private static final int SECOND = 50;
 
-    private static final Logger logger = LoggerFactory.getLogger(VideoUtil.class);
+    private static final Logger logger = LoggerFactory.getLogger(VideoTest.class);
 
     /**
      * 获取指定视频的帧并保存为图片至指定目录
@@ -41,7 +43,7 @@ public class VideoUtil {
      */
     public static List<File> fetchPic(File videoFile, String saveFile, int second) throws Exception {
 
-        java.util.List<File> files = new ArrayList<>();
+        List<File> files = new ArrayList<>();
 
         FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFile);
         ff.start();
@@ -86,7 +88,7 @@ public class VideoUtil {
 
     public static List<File> fetchPicByCount(File videoFile, String saveDir, int count) throws Exception {
 
-        java.util.List<File> files = new ArrayList<>();
+        List<File> files = new ArrayList<>();
 
         FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFile);
         ff.start();
@@ -125,7 +127,7 @@ public class VideoUtil {
 
         Long endTime = shootEndTime.getTime() ;
 
-        java.util.List<File> files = new ArrayList<>();
+        List<File> files = new ArrayList<>();
 
         FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFile);
         ff.start();
@@ -296,16 +298,16 @@ public class VideoUtil {
         grabber.release();
     }
 
-    public void cut3() throws Exception{
-        FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg");
-        FFprobe ffprobe = new FFprobe("/path/to/ffprobe");
+    public static void cut3() throws Exception{
+        FFmpeg ffmpeg = new FFmpeg("C:\\Users\\STW\\Downloads\\ffmpeg-3.1.3\\ffmpeg-3.1.3\\ffmpeg");
+        FFprobe ffprobe = new FFprobe("C:\\Users\\STW\\Downloads\\ffmpeg-3.1.3\\ffmpeg-3.1.3\\ffprobe");
 
         FFmpegBuilder builder = new FFmpegBuilder()
 
-                .setInput("input.mp4")     // Filename, or a FFmpegProbeResult
+                .setInput("e:/20211223123223_76639ced-6400-11ec-b8f9-fa163e4e1e9f.mp4")     // Filename, or a FFmpegProbeResult
                 .overrideOutputFiles(true) // Override the output if it exists
 
-                .addOutput("output.mp4")   // Filename for the destination
+                .addOutput("e:/output.mp4")   // Filename for the destination
                 .setFormat("mp4")        // Format is inferred from filename, or can be set
                 .setTargetSize(250_000)  // Aim for a 250KB file
 
@@ -340,9 +342,10 @@ public class VideoUtil {
 //            System.out.println(files.get(0).getName());
 //            System.out.println(VideoUtil.getVideoTime(file));
 
-            Date shootEndTime = DateUtils.strToDate("20211223123223","yyyyMMddHHmmss");
+ //           Date shootEndTime = DateUtils.strToDate("20211223123223","yyyyMMddHHmmss");
  //          fetchAllPic(file,"E:/223",shootEndTime);
 //            cut3(file,new File("e:/a.mp4"));
+            cut3();
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 60 - 0
src/test/java/com/face/video/VideoThumbTaker.java

@@ -0,0 +1,60 @@
+package com.face.video;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class VideoThumbTaker {
+
+    protected String ffmpegApp;
+
+    public VideoThumbTaker(String ffmpegApp)
+    {
+        this.ffmpegApp = ffmpegApp;
+    }
+
+    @SuppressWarnings("unused")
+    /****
+     * 获取指定时间内的图片
+     * @param videoFilename:视频路径
+     * @param thumbFilename:图片保存路径
+     * @param width:图片长
+     * @param height:图片宽
+     * @param hour:指定时
+     * @param min:指定分
+     * @param sec:指定秒
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    public void getThumb(String videoFilename, String thumbFilename, int width,
+                         int height, int hour, int min, float sec) throws IOException,
+            InterruptedException
+    {
+        ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y",
+                "-i", videoFilename, "-vframes", "1", "-ss", hour + ":" + min
+                + ":" + sec, "-f", "mjpeg", "-s", width + "*" + height,
+                "-an", thumbFilename);
+
+        Process process = processBuilder.start();
+
+        InputStream stderr = process.getErrorStream();
+        InputStreamReader isr = new InputStreamReader(stderr);
+        BufferedReader br = new BufferedReader(isr);
+        String line;
+        while ((line = br.readLine()) != null)
+            ;
+        process.waitFor();
+
+        if(br != null)
+            br.close();
+        if(isr != null)
+            isr.close();
+        if(stderr != null)
+            stderr.close();
+
+
+    }
+
+
+}