From 384084ba36022992953a867d9d13dfec49f1fed9 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Wed, 1 Oct 2025 22:49:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/MediaTransferFlvByFFmpeg.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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 55d48c2..671a0f0 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 @@ -85,6 +85,7 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { public MediaTransferFlvByFFmpeg(CameraDto cameraDto) { command.add(System.getProperty(MediaConstant.ffmpegPathKey)); this.cameraDto = cameraDto; + this.enableLog = true; // 临时启用日志,用于调试 buildCommand(); } @@ -176,15 +177,21 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { command.add(output); String join = CollUtil.join(command, " "); + log.info("========== FFmpeg 命令 =========="); log.info(join); + log.info("RTSP URL: {}", cameraDto.getUrl()); + log.info("输出地址: {}", output); + log.info("================================="); try { process = new ProcessBuilder(command).start(); running = true; + log.info("✅ FFmpeg 进程已启动,等待数据..."); listenNetTimeout(); dealStream(process); outputData(); listenClient(); } catch (IOException e) { + log.error("❌ FFmpeg 启动失败: {}", e.getMessage()); e.printStackTrace(); } return this; @@ -215,13 +222,15 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { if (header == null && len >= 13) { header = new byte[13]; System.arraycopy(buffer, 0, header, 0, 13); - log.debug("FLV header已获取: {} bytes", header.length); + log.info("✅ FLV header已获取: {} bytes", header.length); headerSent = true; // 如果有剩余数据(包含header+数据),一起发送 if (len > 0) { byte[] data = new byte[len]; System.arraycopy(buffer, 0, data, 0, len); + log.info("📤 发送第一批数据: {} bytes,客户端数量: HTTP={}, WS={}", + len, httpClients.size(), wsClients.size()); sendFrameData(data); } continue; @@ -384,7 +393,12 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { break; } if (enableLog) { - log.info("err: " + line); + log.info("[FFmpeg] " + line); + } + // 即使不启用日志,也输出关键错误信息 + if (!enableLog && (line.contains("error") || line.contains("failed") || + line.contains("Connection") || line.contains("timeout"))) { + log.error("[FFmpeg Error] " + line); } } } catch (IOException e) { @@ -536,14 +550,17 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { * @param ctype enum,ClientType */ public void addClient(ChannelHandlerContext ctx, ClientType ctype) { + log.info("🔗 新客户端连接: 类型={}, Channel={}", ctype, ctx.channel().remoteAddress()); int timeout = 0; while (true) { try { if (header != null) { + log.info("✅ FLV header 已就绪,准备发送给客户端"); try { if (ctx.channel().isWritable()) { // 发送帧前先发送header if (ClientType.HTTP == ctype) { + log.info("📤 发送 FLV header 到 HTTP 客户端: {} bytes", header.length); ChannelFuture future = ctx.writeAndFlush(Unpooled.copiedBuffer(header)); future.addListener(new GenericFutureListener>() { @Override @@ -574,10 +591,18 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { } // 等待推拉流启动 + if (timeout == 0) { + log.info("⏳ 等待 FLV header..."); + } Thread.sleep(50); // 启动录制器失败 timeout += 50; + if (timeout % 5000 == 0) { + log.warn("⚠️ 等待 FLV header 超时: {} ms,可能 FFmpeg 拉流失败", timeout); + } if (timeout > 30000) { + log.error("❌ 等待 FLV header 超时 30 秒,放弃连接"); + break; } } catch (java.lang.Exception e) {