From ccbb1ad18603b91b8d2d49b9446eace279c1b5f8 Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Wed, 13 Mar 2024 16:53:35 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=20ffmpegRecord=20=E5=86=99?= =?UTF-8?q?=E5=85=A5=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/wvp/config/FfmpegConfig.java | 2 ++ .../wvp/service/video/VideoService.java | 30 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/config/FfmpegConfig.java b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/config/FfmpegConfig.java index bbadfaf..365a6d0 100644 --- a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/config/FfmpegConfig.java +++ b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/config/FfmpegConfig.java @@ -30,4 +30,6 @@ public class FfmpegConfig { private Boolean input = false; private Boolean output = false; } + + public Boolean useTmpFile = true; } diff --git a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/video/VideoService.java b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/video/VideoService.java index 3d7b74d..7ddfac5 100644 --- a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/video/VideoService.java +++ b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/video/VideoService.java @@ -3,7 +3,9 @@ package cn.skcks.docking.gb28181.wvp.service.video; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; import cn.skcks.docking.gb28181.core.sip.utils.SipUtil; +import cn.skcks.docking.gb28181.wvp.config.FfmpegConfig; import cn.skcks.docking.gb28181.wvp.config.ProxySipConfig; import cn.skcks.docking.gb28181.wvp.config.WvpProxyConfig; import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDevice; @@ -31,9 +33,7 @@ import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.FrameGrabber; import org.springframework.stereotype.Service; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -50,6 +50,7 @@ public class VideoService { private final ProxySipConfig proxySipConfig; private final DockingService dockingService; private final SipSender sender; + private final FfmpegConfig ffmpegConfig; private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); /** @@ -231,7 +232,21 @@ public class VideoService { */ @SneakyThrows public void ffmpegRecord(ServletResponse response, String url, long time, WvpProxyDevice device,String callId){ - ServletOutputStream outputStream = response.getOutputStream(); + OutputStream outputStream; + String tmpDir = System.getProperty("java.io.tmpdir"); + String fileName = callId + ".mp4"; + File file = new File(tmpDir, fileName); + + if(ffmpegConfig.getUseTmpFile()) { + if(!file.exists()){ + log.info("创建临时文件 {}", fileName); + file.createNewFile(); + } + outputStream = new FileOutputStream(file); + } else { + outputStream = response.getOutputStream(); + } + PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, System.err); DefaultExecuteResultHandler executeResultHandler = mediaStatus(device,callId); DateTime startTime = DateUtil.date(); @@ -252,6 +267,13 @@ public class VideoService { DateTime endTime = DateUtil.date(); log.info("录制进程结束 {}, 录制耗时: {}", url, DateUtil.between(startTime,endTime, DateUnit.SECOND)); outputStream.close(); + + if(ffmpegConfig.getUseTmpFile()) { + ServletOutputStream servletOutputStream = response.getOutputStream(); + IoUtil.copy(new FileInputStream(file), servletOutputStream); + boolean delete = file.delete(); + log.info("删除临时文件 {} => {}", file, delete); + } } /**