From 6cefaa1e4de863fabf028bc18bd5f8672726ecf3 Mon Sep 17 00:00:00 2001 From: Klein <11241686+Klein422@user.noreply.gitee.com> Date: Sat, 5 Aug 2023 23:34:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=B4=E6=92=AD=E6=9A=82=E5=81=9C=E5=B9=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/example/DouyuLiveTest.java | 3 ++- .../org/example/core/component/FlvHandle.java | 20 ++++++++++++++++--- .../core/component/LiveStreamTask.java | 11 +++++++--- .../org/example/core/manager/TaskManager.java | 19 ++++++++++++------ .../core/parser/impl/DouyuFlvUrlParser.java | 5 ++++- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/LiveRecordModule/src/main/java/org/example/DouyuLiveTest.java b/LiveRecordModule/src/main/java/org/example/DouyuLiveTest.java index 8dd1eff..4022e80 100644 --- a/LiveRecordModule/src/main/java/org/example/DouyuLiveTest.java +++ b/LiveRecordModule/src/main/java/org/example/DouyuLiveTest.java @@ -9,7 +9,7 @@ public class DouyuLiveTest { public static void main(String[] args) { TaskManager taskManager = new TaskManager(5); - DouyuLiveConfig douyuLiveConfig = new DouyuLiveConfig("3637778", "C:\\Users\\admin\\Desktop\\douyu\\", "DouyuLiveOnline"); + DouyuLiveConfig douyuLiveConfig = new DouyuLiveConfig("3637778", 4000,"C:\\Users\\admin\\Desktop\\douyu\\", "DouyuLiveOnline", true); try { // 向任务管理器中添加任务 String taskId = taskManager.addTask(douyuLiveConfig); // 获取任务的标识符 @@ -26,6 +26,7 @@ public class DouyuLiveTest { System.out.println("已写入数据量:" + taskManager.getDownloadedBytes(taskId) + " bytes"); Thread.sleep(1000); } + taskManager.terminateThenSave(douyuLiveConfig,taskId); } catch (Exception e) { e.printStackTrace(); } diff --git a/LiveRecordModule/src/main/java/org/example/core/component/FlvHandle.java b/LiveRecordModule/src/main/java/org/example/core/component/FlvHandle.java index 1344487..44f424d 100644 --- a/LiveRecordModule/src/main/java/org/example/core/component/FlvHandle.java +++ b/LiveRecordModule/src/main/java/org/example/core/component/FlvHandle.java @@ -11,24 +11,27 @@ public class FlvHandle { private static final int RETRY_TIMES = 3; private static final int BUFFER_SIZE = 64 * 1024; // 64 KB buffer + private volatile boolean shouldTerminate = false; public void parseStream(InputStream in, StatusMonitor statusMonitor, OutputStream out) { int retryCount = 0; - while (retryCount < RETRY_TIMES) { + while (retryCount < RETRY_TIMES && !shouldTerminate) { try (BufferedInputStream input = new BufferedInputStream(in); BufferedOutputStream output = new BufferedOutputStream(out)) { byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead; while ((bytesRead = input.read(buffer)) != -1) { + if (shouldTerminate) { + break; + } output.write(buffer, 0, bytesRead); statusMonitor.addDownloadedBytes(bytesRead); } - break; } catch (IOException e) { retryCount++; if (retryCount < RETRY_TIMES) { try { - Thread.sleep(1000L * retryCount); // Exponential backoff + Thread.sleep(1000L * retryCount); } catch (InterruptedException interruptedException) { Thread.currentThread().interrupt(); } @@ -36,9 +39,20 @@ public class FlvHandle { statusMonitor.setConnectionClosed(true); e.printStackTrace(); } + }finally { + try { + in.close(); + out.close(); + }catch (IOException e){ + e.printStackTrace(); + } } } } + + public void terminateDownload() { + shouldTerminate = true; + } } diff --git a/LiveRecordModule/src/main/java/org/example/core/component/LiveStreamTask.java b/LiveRecordModule/src/main/java/org/example/core/component/LiveStreamTask.java index 7602096..3fe678f 100644 --- a/LiveRecordModule/src/main/java/org/example/core/component/LiveStreamTask.java +++ b/LiveRecordModule/src/main/java/org/example/core/component/LiveStreamTask.java @@ -20,10 +20,10 @@ public class LiveStreamTask { private String url; private Map headers; + private FlvHandle f = new FlvHandle(); public void start(ExecutorService executor, StatusMonitor statusMonitor, OutputStream fileIO) { executor.execute(() -> { - FlvHandle f = new FlvHandle(); try { URLConnection conn = new URL(this.url).openConnection(); if (this.headers != null) { @@ -31,12 +31,17 @@ public class LiveStreamTask { conn.setRequestProperty(entry.getKey(), entry.getValue()); } } - InputStream in = conn.getInputStream(); - f.parseStream(in, statusMonitor, fileIO); + try (InputStream in = conn.getInputStream()) { + f.parseStream(in, statusMonitor, fileIO); + } } catch (Exception e) { e.printStackTrace(); } }); } + + public void terminate() { + f.terminateDownload(); + } } diff --git a/LiveRecordModule/src/main/java/org/example/core/manager/TaskManager.java b/LiveRecordModule/src/main/java/org/example/core/manager/TaskManager.java index 5b76580..3088153 100644 --- a/LiveRecordModule/src/main/java/org/example/core/manager/TaskManager.java +++ b/LiveRecordModule/src/main/java/org/example/core/manager/TaskManager.java @@ -53,12 +53,6 @@ public class TaskManager { Future future = executor.submit(() -> { task.start(executor, statusMonitor, fileIO); - // 将.flv文件转换为.mp4 - if (liveConfig.isConvertToMp4()) { - String flvFilePath = liveConfig.getVideoPath() + liveConfig.getRoomId() + ".flv"; - String mp4FilePath = liveConfig.getVideoPath() + liveConfig.getRoomId() + ".mp4"; - VideoConverter.convertFlvToMp4(flvFilePath, mp4FilePath); - } }); futures.put(taskId, future); @@ -87,6 +81,19 @@ public class TaskManager { } } + public void terminateThenSave(LiveConfig liveConfig,String taskId){ + LiveStreamTask task = tasks.get(taskId); + task.terminate(); + removeTask(taskId); + if (liveConfig.isConvertToMp4()) { + String flvFilePath = liveConfig.getVideoPath() + liveConfig.getRoomId() + ".flv"; + String mp4FilePath = liveConfig.getVideoPath() + liveConfig.getRoomId() + ".mp4"; + VideoConverter.convertFlvToMp4(flvFilePath, mp4FilePath); + System.out.println("start: flv-->mp4"); + + } + } + private StatusMonitor getStatusMonitor(String taskId) { return statusMonitors.get(taskId); } diff --git a/LiveRecordModule/src/main/java/org/example/core/parser/impl/DouyuFlvUrlParser.java b/LiveRecordModule/src/main/java/org/example/core/parser/impl/DouyuFlvUrlParser.java index d628dae..cb4d843 100644 --- a/LiveRecordModule/src/main/java/org/example/core/parser/impl/DouyuFlvUrlParser.java +++ b/LiveRecordModule/src/main/java/org/example/core/parser/impl/DouyuFlvUrlParser.java @@ -65,7 +65,10 @@ public class DouyuFlvUrlParser implements PlatformVideoUrlParser { String fileUrl = dataObj.getString("rtmp_live"); if(fileUrl!=null){ String name = fileUrl.substring(0,fileUrl.indexOf(".")); - return String.format(flvBaseUrl+"%s.flv",name); + if(name.contains("_")){ + return String.format(flvBaseUrl+"%s_%s.xs",name.substring(0,name.indexOf("_")),clarity); + } + return String.format(flvBaseUrl+"%s_%s.xs",name,clarity); } } }