package com.ld.igds.util; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import java.util.Map; import java.util.concurrent.*; /** * 使用ffmpeg.exe的命令执行截图,不要添加任何JAR包。 *

* 链接:https://pan.baidu.com/s/1MEvUXPMe6bDOsQYt5LMIxA 提取码:y177 * * @author: andy.jia * @description: * @version: * @data:2020年6月13日 */ public class FfmpegUtil { /** * 定义ffmpeg工具的位置 */ public static final String FFMPEG_PATH = "D:/IGDS/ffmpeg-win64-static/bin/ffmpeg.exe"; public static final String IMG_SIZE = "1280*720"; public static final Map contextProcess = new HashMap<>(); /** * 关闭进程 * * @param key */ public static void destroyProcess(String key) { Process process = contextProcess.get(key); contextProcess.remove(key); if (null != process) { process.destroy(); } } public static void addProcess(String key, Process process) { contextProcess.put(key, process); } /** * 根据视频流转换为图片 * * @param mediaAddr * @param key * @return */ public static String cutImgByMediaAddr(String mediaAddr, String baseFile,String fileName, String key) { // 图片命令 StringBuilder command = new StringBuilder(); command.append(FFMPEG_PATH); command.append(" -i "); command.append(mediaAddr); command.append(" -vframes"); command.append(" 1"); command.append(" -y"); command.append(" -f"); command.append(" image2"); command.append(" -t"); command.append(" 1"); command.append(" -s "); command.append(IMG_SIZE); command.append(" "); command.append(baseFile+fileName); InputStreamReader isr = null; LineNumberReader input = null; Process process; try { process = Runtime.getRuntime().exec(command.toString()); addProcess(key, process); isr = new InputStreamReader(process.getInputStream()); input = new LineNumberReader(isr); while (input.readLine() != null) { } } catch (java.io.IOException e) { e.printStackTrace(); } finally { try { if (null != input) input.close(); if (null != isr) isr.close(); } catch (IOException e1) { e1.printStackTrace(); } destroyProcess(key); } return fileName; } public static String cutImgByMediaAddr(String mediaAddr, String diskFile, String key) { // 图片命令 StringBuilder command = new StringBuilder(); command.append(FFMPEG_PATH); command.append(" -i "); command.append(mediaAddr); command.append(" -vframes"); command.append(" 1"); command.append(" -y"); command.append(" -f"); command.append(" image2"); command.append(" -t"); command.append(" 1"); command.append(" -s "); command.append(IMG_SIZE); command.append(" "); command.append(diskFile); InputStreamReader isr = null; LineNumberReader input = null; Process process; try { process = Runtime.getRuntime().exec(command.toString()); addProcess(key, process); isr = new InputStreamReader(process.getInputStream()); input = new LineNumberReader(isr); while (input.readLine() != null) { } } catch (java.io.IOException e) { e.printStackTrace(); } finally { try { if (null != input) input.close(); if (null != isr) isr.close(); } catch (IOException e1) { e1.printStackTrace(); } destroyProcess(key); } return diskFile; } /** * 调用抓拍,每个动作执行6S * * @param mediaAddr * @param baseFile * @return */ public static String snapImg(String mediaAddr, String baseFile, String fileName) { final ExecutorService exec = Executors.newFixedThreadPool(1); String key = ContextUtil.getUUID(); Callable call = new Callable() { public String call() throws Exception { return cutImgByMediaAddr(mediaAddr, baseFile,fileName, key); } }; try { Future future = exec.submit(call); future.get(6 * 1000, TimeUnit.MILLISECONDS); } catch (Exception ex) { destroyProcess(key); return null; } exec.shutdown(); return fileName; } public static String cutImgByMediaAddr1(String mediaAddr, String outFile) { final ExecutorService exec = Executors.newFixedThreadPool(1); String key = ContextUtil.getUUID(); Callable call = new Callable() { public String call() throws Exception { return cutImgByMediaAddr(mediaAddr, outFile, key); } }; try { Future future = exec.submit(call); future.get(5 * 1000, TimeUnit.MILLISECONDS); } catch (Exception ex) { destroyProcess(key); return "=============后台保存图片执行时间超时======"; } exec.shutdown(); return outFile; } public static String cutImgByMediaAddr2(String mediaAddr, String outFile) { final ExecutorService exec = Executors.newFixedThreadPool(1); String key = ContextUtil.getUUID(); Callable call = new Callable() { public String call() throws Exception { return cutImgByMediaAddr(mediaAddr, outFile, key); } }; try { Future future = exec.submit(call); future.get(5 * 1000, TimeUnit.MILLISECONDS); } catch (Exception ex) { destroyProcess(key); return "=============后台保存图片执行时间超时======"; } exec.shutdown(); return outFile; } public static String cutImgByMediaAddr3(String mediaAddr, String outFile) { final ExecutorService exec = Executors.newFixedThreadPool(1); String key = ContextUtil.getUUID(); Callable call = new Callable() { public String call() throws Exception { return cutImgByMediaAddr(mediaAddr, outFile, key); } }; try { Future future = exec.submit(call); future.get(5 * 1000, TimeUnit.MILLISECONDS); } catch (Exception ex) { destroyProcess(key); return "=============后台保存图片执行时间超时======"; } exec.shutdown(); return outFile; } public static String getImgStr(String imgFile) { // FileInputStream in = null; // byte[] data = null; // // 读取图片字节数组 // try { // in = new FileInputStream(imgFile); // data = new byte[in.available()]; // in.read(data); // in.close(); // } catch (IOException e) { // e.printStackTrace(); // return null; // } // String imgData = "data:image/jpg;base64," // + Base64Util.encode2String(data); // return imgData; return Base64Util.getImageStr(imgFile); } public static void main(String[] args) { String rtsp = "rtsp://admin:admin@192.168.1.102:554/h264/ch1/sub/av_stream"; rtsp = "rtsp://admin:smd123456@192.168.2.61:554/cam/realmonitor?channel=1&subtype=1&proto=Dahua3"; FfmpegUtil .cutImgByMediaAddr1(rtsp, "D:\\IGDS\\FILE\\INOUT\\" + System.currentTimeMillis() + ".jpg"); System.out.println("==================="); } }