From 677227441fb51a4c3e1a86c890ba7c87c3e1bc03 Mon Sep 17 00:00:00 2001 From: MaDaLei Date: Fri, 17 Apr 2026 20:04:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20verified=20?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E4=BD=9C=E7=94=A8=E5=9F=9F=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ReportHighlightVideoService.java | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/petstore/service/ReportHighlightVideoService.java b/src/main/java/com/petstore/service/ReportHighlightVideoService.java index 9eeb4b8..a461c4c 100644 --- a/src/main/java/com/petstore/service/ReportHighlightVideoService.java +++ b/src/main/java/com/petstore/service/ReportHighlightVideoService.java @@ -192,36 +192,29 @@ public class ReportHighlightVideoService { } Path merged = workDir.resolve("merged.mp4"); + Path sourceToSave; // 最终用于保存的文件(会在下面赋值) int c1 = runFfmpeg(List.of( ffmpegBinary, "-y", "-f", "concat", "-safe", "0", "-i", listFile.toString(), "-c", "copy", merged.toString() )); if (c1 != 0) { + // stream copy 失败,改用转码(同时做尺寸 + Baseline Profile 标准化) int c2 = runFfmpeg(List.of( ffmpegBinary, "-y", "-f", "concat", "-safe", "0", "-i", listFile.toString(), - "-c:v", "libx264", "-preset", "veryfast", "-crf", "23", - "-c:a", "aac", "-b:a", "96k", merged.toString() - )); - if (c2 != 0) { - throw new IllegalStateException("ffmpeg 转码失败(退出码 " + c2 + ")"); - } - - // 验证输出文件(确保可播放) - Path verified = workDir.resolve("verified.mp4"); - int c3 = runFfmpeg(List.of( - ffmpegBinary, "-y", "-i", merged.toString(), "-vf", "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2", "-c:v", "libx264", "-preset", "fast", "-crf", "22", "-profile:v", "baseline", "-level", "3.0", // 最高兼容 WeChat/Android "-c:a", "aac", "-b:a", "128k", - "-movflags", "+faststart", // MP4 streaming优化,微信要求 + "-movflags", "+faststart", // MP4 streaming 优化,微信要求 "-t", String.valueOf(durationSec), - verified.toString() + merged.toString() )); - if (c3 != 0) { - // 转码验证失败,降级为copy - verified = merged; + if (c2 != 0) { + throw new IllegalStateException("ffmpeg 拼接失败(退出码 " + c2 + ")"); } + sourceToSave = merged; // 转码后文件已满足兼容性要求 + } else { + sourceToSave = merged; // stream copy 成功,直接用 } String datePath = LocalDate.now().toString().replace("-", "/"); @@ -230,7 +223,6 @@ public class ReportHighlightVideoService { Files.createDirectories(outDir); String filename = "highlight_" + reportId + "_" + UUID.randomUUID().toString().replace("-", "") + ".mp4"; Path finalPath = outDir.resolve(filename); - Path sourceToSave = Files.exists(verified) ? verified : merged; Files.copy(sourceToSave, finalPath, StandardCopyOption.REPLACE_EXISTING); String url = "/api/upload/image/" + datePath + "/" + filename;