diff --git a/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByFFmpeg.java b/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByFFmpeg.java index af4fa6d..9ec5181 100644 --- a/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByFFmpeg.java +++ b/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByFFmpeg.java @@ -176,6 +176,7 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { // 添加日志级别参数(临时调试用) this.addArgument("-loglevel").addArgument("info") + .addArgument("-fflags").addArgument("+genpts") // 生成PTS时间戳(在输入之前) .addArgument("-rtsp_transport").addArgument("tcp") .addArgument("-i").addArgument(cameraDto.getUrl()) .addArgument("-max_delay").addArgument("1"); @@ -183,20 +184,24 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { if (useSystemFFmpeg) { // 系统 FFmpeg:使用 libx264 重新编码 log.info("🎬 使用 libx264 编码器(重新编码)"); - this.addArgument("-g").addArgument("25") - .addArgument("-r").addArgument("25") - .addArgument("-c:v").addArgument("libx264") + this.addArgument("-c:v").addArgument("libx264") .addArgument("-preset").addArgument("ultrafast") .addArgument("-tune").addArgument("zerolatency") .addArgument("-profile:v").addArgument("baseline") .addArgument("-level").addArgument("3.0") + .addArgument("-pix_fmt").addArgument("yuv420p") // 像素格式 + .addArgument("-g").addArgument("50") // GOP大小(关键帧间隔) + .addArgument("-keyint_min").addArgument("50") // 最小关键帧间隔 + .addArgument("-sc_threshold").addArgument("0") // 禁用场景切换检测 + .addArgument("-r").addArgument("25") // 帧率 .addArgument("-b:v").addArgument("1000k") .addArgument("-maxrate").addArgument("1000k") .addArgument("-bufsize").addArgument("2000k") .addArgument("-c:a").addArgument("aac") .addArgument("-strict").addArgument("experimental") .addArgument("-b:a").addArgument("64k") - .addArgument("-ar").addArgument("44100"); + .addArgument("-ar").addArgument("44100") + .addArgument("-ac").addArgument("1"); // 单声道 } else { // JavaCV FFmpeg:使用 copy(不重新编码,只重新封装) log.info("📦 使用 copy 编码器(不重新编码,只重新封装)"); @@ -204,7 +209,9 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { .addArgument("-c:a").addArgument("copy"); } - this.addArgument("-f").addArgument("flv"); + // 🔑 关键:添加 FLV 格式参数,确保 flv.js 能正确解析 + this.addArgument("-f").addArgument("flv") + .addArgument("-flvflags").addArgument("add_keyframe_index"); // 添加关键帧索引 } // private void buildCommand() {