From 84b3154cdd51d56550e501320d92f08b37bbc88a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Sat, 22 Mar 2025 16:31:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=BD=95=E5=88=B6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StreamRecordController.java | 17 ++++++++ .../com/tuoheng/steam/dos/ProcessType.java | 2 +- .../tuoheng/steam/service/ITaskService.java | 2 + .../tuoheng/steam/service/TaskService.java | 28 +++++++++++++ .../service/innerService/ProcessService.java | 42 +++++++++++++++++++ src/main/resources/application.properties | 24 +++++------ 6 files changed, 102 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/tuoheng/steam/controller/StreamRecordController.java b/src/main/java/com/tuoheng/steam/controller/StreamRecordController.java index 2f12947..fccc7c0 100644 --- a/src/main/java/com/tuoheng/steam/controller/StreamRecordController.java +++ b/src/main/java/com/tuoheng/steam/controller/StreamRecordController.java @@ -34,6 +34,23 @@ public class StreamRecordController { @Autowired IRecordService iRecordService; + + @GetMapping("pic") + public Response startPic(@RequestParam String streamUrl) { + System.out.println("启动视频拍照 :"+streamUrl); + if(Objects.isNull(streamUrl)) { + return Response.fail(-1); + } + String outfile = taskService.startPic(streamUrl); + if(Objects.nonNull(outfile)) { + return Response.success(outfile); + }else { + return Response.fail(-1); + } + } + + + @GetMapping("start") public Response startRecording(@RequestParam String streamUrl) { System.out.println("启动录制 :"+streamUrl); diff --git a/src/main/java/com/tuoheng/steam/dos/ProcessType.java b/src/main/java/com/tuoheng/steam/dos/ProcessType.java index 7b006a9..d1c91c9 100644 --- a/src/main/java/com/tuoheng/steam/dos/ProcessType.java +++ b/src/main/java/com/tuoheng/steam/dos/ProcessType.java @@ -1,5 +1,5 @@ package com.tuoheng.steam.dos; public enum ProcessType { - RECORD,MERGE + RECORD,MERGE,PIC } diff --git a/src/main/java/com/tuoheng/steam/service/ITaskService.java b/src/main/java/com/tuoheng/steam/service/ITaskService.java index 711aad8..2aa59b5 100644 --- a/src/main/java/com/tuoheng/steam/service/ITaskService.java +++ b/src/main/java/com/tuoheng/steam/service/ITaskService.java @@ -6,6 +6,8 @@ public interface ITaskService { public StreamTask startTask(String streamUrl); + public String startPic(String streamUrl); + public StreamTask stopTask(String streamUrl); public StreamTask getLastTask(String streamUrl); diff --git a/src/main/java/com/tuoheng/steam/service/TaskService.java b/src/main/java/com/tuoheng/steam/service/TaskService.java index 119d6dc..e970eb4 100644 --- a/src/main/java/com/tuoheng/steam/service/TaskService.java +++ b/src/main/java/com/tuoheng/steam/service/TaskService.java @@ -118,6 +118,34 @@ public class TaskService implements ITaskService{ }, 60, 60, TimeUnit.SECONDS); } + public String startPic(String streamUrl) { + + try { + StreamProcess streamProcess = processService.takePic(streamUrl); + String outFileName = streamProcess.getFileName(); + /* + 注册进程 + */ + ProcessManager.registerProcess(streamProcess.getInnerProcessId()); + logger.info("streamUrl {} startPicProcess {} ", streamUrl,streamProcess.getInnerProcessId()); + CompletableFuture future = streamProcess.onExit(); + future.thenRun(() -> { + logger.info("streamUrl {} startPicProcess {} Over ", streamUrl,streamProcess.getInnerProcessId()); + streamProcess.setStopTime(TimeUtils.formatDateToString(new Date())); + ProcessManager.unRegisterProcess(streamProcess.getInnerProcessId()); + }).exceptionally(ex -> { + logger.info("streamUrl {} startPicProcess {} Exceptionally ", streamUrl,streamProcess.getInnerProcessId()); + streamProcess.setStopTime(TimeUtils.formatDateToString(new Date())); + ProcessManager.unRegisterProcess(streamProcess.getInnerProcessId()); + return null; + }); + return outFileName; + }catch (Exception e) { + logger.info("streamUrl {} ", streamUrl,e); + } + return null; + } + public StreamTask startTask(String streamUrl) { /* diff --git a/src/main/java/com/tuoheng/steam/service/innerService/ProcessService.java b/src/main/java/com/tuoheng/steam/service/innerService/ProcessService.java index a3a6346..32ada1b 100644 --- a/src/main/java/com/tuoheng/steam/service/innerService/ProcessService.java +++ b/src/main/java/com/tuoheng/steam/service/innerService/ProcessService.java @@ -97,6 +97,48 @@ public class ProcessService { } + + public StreamProcess takePic(String streamUrl) throws IOException { + String outFileName = targetPath + "/" +UUID.randomUUID().toString() +".jpg"; + String command = String.format( + ffmpeg+ " -i %s -vf fps=1 -frames:v 1 -q:v 2 %s", + streamUrl, outFileName); + + logger.info("takePic {}", command); + + List rcommand = new ArrayList<>(); + rcommand.add(ffmpeg); // ffmpeg 路径 + rcommand.add("-i"); + rcommand.add(streamUrl); // 流地址 + rcommand.add("-vf"); + rcommand.add("fps=1"); + rcommand.add("-frames:v"); + rcommand.add("1"); + rcommand.add("-q:v"); + rcommand.add("2"); + rcommand.add(outFileName); // 输出文件名 + + ProcessBuilder pb = new ProcessBuilder(rcommand); + pb.redirectErrorStream(true); + Process process = pb.start(); + + loggingService.execute(new Runnable() { + @Override + public void run() { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + logger.info("recordStream-------- {}",line); + } + } catch (IOException e) { + logger.info("takePic-------- Over"); + } + } + }); + return new StreamProcess(process,outFileName, ProcessType.PIC); + } + public StreamProcess recordStream(String streamUrl) throws IOException { String recordFileName = splitPath+'/'+UUID.randomUUID().toString() +".ts"; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index efde9dd..a205dfd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,14 +1,14 @@ spring.application.name=demo -server.port = 8989 -srs.splitPath=/data/java/srs/stream_server/temp -srs.targetPath=/data/java/srs/srs/trunk/objs/nginx/html -ffmpeg=/data/ffmpeg/bin/ffmpeg -recordPath=/data/java/srs/srs/trunk/objs/nginx/html/record -livedates=8 +#server.port = 8989 +#srs.splitPath=/data/java/srs/stream_server/temp +#srs.targetPath=/data/java/srs/srs/trunk/objs/nginx/html +#ffmpeg=/data/ffmpeg/bin/ffmpeg +#recordPath=/data/java/srs/srs/trunk/objs/nginx/html/record +#livedates=8 -#server.port = 8080 -#srs.splitPath=/Users/sunpeng/workspace/stream/temp -#srs.targetPath=/Users/sunpeng/workspace/stream/html -#ffmpeg=ffmpeg -#recordPath=/Users/sunpeng/workspace/stream/record -#livedates=7 \ No newline at end of file +server.port = 8080 +srs.splitPath=/Users/sunpeng/workspace/stream/temp +srs.targetPath=/Users/sunpeng/workspace/stream/html +ffmpeg=ffmpeg +recordPath=/Users/sunpeng/workspace/stream/record +livedates=7 \ No newline at end of file