From 5611bbbe3812a1f5ad31d451b9c1c13b5ecfb858 Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Wed, 13 Mar 2024 17:14:27 +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 --- .../service/ffmpeg/FfmpegSupportService.java | 32 ++++++++++++------- .../wvp/service/video/VideoService.java | 26 +++++++++------ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/ffmpeg/FfmpegSupportService.java b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/ffmpeg/FfmpegSupportService.java index 18ec126..19f1be1 100644 --- a/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/ffmpeg/FfmpegSupportService.java +++ b/gb28181-wvp-proxy-service/src/main/java/cn/skcks/docking/gb28181/wvp/service/ffmpeg/FfmpegSupportService.java @@ -18,13 +18,31 @@ public class FfmpegSupportService { private final FfmpegConfig ffmpegConfig; @SneakyThrows - public Executor downloadToStream(String input, long time, TimeUnit unit, ExecuteStreamHandler streamHandler, ExecuteResultHandler executeResultHandler) { + public Executor downloadToStream(String input, String out, long time, TimeUnit unit, ExecuteStreamHandler streamHandler, ExecuteResultHandler executeResultHandler) { FfmpegConfig.Rtp rtp = ffmpegConfig.getRtp(); FfmpegConfig.Debug debug = ffmpegConfig.getDebug(); String inputParam = debug.getDownload() ? rtp.getDownload() : StringUtils.joinWith(" ", rtp.getDownload(), input); log.info("视频输入参数 {}", inputParam); - String outputParam = debug.getOutput() ? rtp.getOutput() : StringUtils.joinWith(" ", rtp.getOutput(), "-"); + String outputParam = debug.getOutput() ? rtp.getOutput() : StringUtils.joinWith(" ", rtp.getOutput(), out); + log.info("视频输出参数 {}", outputParam); + + return ffmpegExecutor(inputParam, outputParam, time, unit, streamHandler, executeResultHandler); + } + + @SneakyThrows + public Executor downloadToStream(String input, long time, TimeUnit unit, ExecuteStreamHandler streamHandler, ExecuteResultHandler executeResultHandler) { + return downloadToStream(input, "-", time, unit, streamHandler, executeResultHandler); + } + + @SneakyThrows + public Executor playbackToStream(String input, String out, long time, TimeUnit unit, ExecuteStreamHandler streamHandler, ExecuteResultHandler executeResultHandler){ + FfmpegConfig.Rtp rtp = ffmpegConfig.getRtp(); + FfmpegConfig.Debug debug = ffmpegConfig.getDebug(); + String inputParam = debug.getInput() ? rtp.getInput() : StringUtils.joinWith(" ", rtp.getInput(), input); + log.info("视频输入参数 {}", inputParam); + + String outputParam = debug.getOutput() ? rtp.getOutput() : StringUtils.joinWith(" ", rtp.getOutput(), out); log.info("视频输出参数 {}", outputParam); return ffmpegExecutor(inputParam, outputParam, time, unit, streamHandler, executeResultHandler); @@ -32,15 +50,7 @@ public class FfmpegSupportService { @SneakyThrows public Executor playbackToStream(String input, long time, TimeUnit unit, ExecuteStreamHandler streamHandler, ExecuteResultHandler executeResultHandler) { - FfmpegConfig.Rtp rtp = ffmpegConfig.getRtp(); - FfmpegConfig.Debug debug = ffmpegConfig.getDebug(); - String inputParam = debug.getInput() ? rtp.getInput() : StringUtils.joinWith(" ", rtp.getInput(), input); - log.info("视频输入参数 {}", inputParam); - - String outputParam = debug.getOutput() ? rtp.getOutput() : StringUtils.joinWith(" ", rtp.getOutput(), "-"); - log.info("视频输出参数 {}", outputParam); - - return ffmpegExecutor(inputParam, outputParam, time, unit, streamHandler, executeResultHandler); + return playbackToStream(input, "-", time, unit, streamHandler, executeResultHandler); } @SneakyThrows 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 7ddfac5..a7a3c74 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 @@ -236,26 +236,32 @@ public class VideoService { String tmpDir = System.getProperty("java.io.tmpdir"); String fileName = callId + ".mp4"; File file = new File(tmpDir, fileName); - + Executor executor; + DefaultExecuteResultHandler executeResultHandler = mediaStatus(device,callId); if(ffmpegConfig.getUseTmpFile()) { if(!file.exists()){ log.info("创建临时文件 {}", fileName); file.createNewFile(); } - outputStream = new FileOutputStream(file); + outputStream = new PipedOutputStream(); + String filePath = file.getAbsolutePath(); + PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, System.err); + if(proxySipConfig.isUsePlaybackToDownload()){ + executor = ffmpegSupportService.playbackToStream(url, filePath, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); + } else { + executor = ffmpegSupportService.downloadToStream(url, filePath, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); + } } else { outputStream = response.getOutputStream(); + PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, System.err); + if(proxySipConfig.isUsePlaybackToDownload()){ + executor = ffmpegSupportService.playbackToStream(url, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); + } else { + executor = ffmpegSupportService.downloadToStream(url, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); + } } - PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, System.err); - DefaultExecuteResultHandler executeResultHandler = mediaStatus(device,callId); DateTime startTime = DateUtil.date(); - Executor executor; - if(proxySipConfig.isUsePlaybackToDownload()){ - executor = ffmpegSupportService.playbackToStream(url, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); - } else { - executor = ffmpegSupportService.downloadToStream(url, time, TimeUnit.SECONDS,streamHandler,executeResultHandler); - } log.info("开始录制 {}", url); ScheduledFuture schedule = scheduledExecutorService.schedule(() -> { log.info("到达结束时间, 结束录制 {}", url);