From dcd905bfde9002a2f7224d48e3fe4c9b23afc789 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Wed, 1 Oct 2025 22:05:03 +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 --- .../com/ruoyi/video/server/FlvHandler.java | 14 +++++-- .../thread/MediaTransferFlvByFFmpeg.java | 41 ++++++++++--------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/ruoyi-video/src/main/java/com/ruoyi/video/server/FlvHandler.java b/ruoyi-video/src/main/java/com/ruoyi/video/server/FlvHandler.java index 4da0cbd..91b0f3b 100644 --- a/ruoyi-video/src/main/java/com/ruoyi/video/server/FlvHandler.java +++ b/ruoyi-video/src/main/java/com/ruoyi/video/server/FlvHandler.java @@ -151,10 +151,16 @@ public class FlvHandler extends SimpleChannelInboundHandler { private void sendFlvReqHeader(ChannelHandlerContext ctx) { HttpResponse rsp = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); - rsp.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE) - .set(HttpHeaderNames.CONTENT_TYPE, "video/x-flv").set(HttpHeaderNames.ACCEPT_RANGES, "bytes") - .set(HttpHeaderNames.PRAGMA, "no-cache").set(HttpHeaderNames.CACHE_CONTROL, "no-cache") - .set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED).set(HttpHeaderNames.SERVER, MediaConstant.serverName); + rsp.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE) + .set(HttpHeaderNames.CONTENT_TYPE, "video/x-flv") + .set(HttpHeaderNames.ACCEPT_RANGES, "bytes") + .set(HttpHeaderNames.PRAGMA, "no-cache") + .set(HttpHeaderNames.CACHE_CONTROL, "no-cache") + .set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED) + .set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*") + .set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, OPTIONS") + .set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, "*") + .set(HttpHeaderNames.SERVER, MediaConstant.serverName); ctx.writeAndFlush(rsp); } 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 9053660..55d48c2 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 @@ -201,31 +201,38 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { client = tcpServer.accept(); DataInputStream input = new DataInputStream(client.getInputStream()); - byte[] buffer = new byte[1024]; + byte[] buffer = new byte[4096]; // 增加缓冲区到4KB int len = 0; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + boolean headerSent = false; + while (running) { - len = input.read(buffer); if (len == -1) { break; } - bos.write(buffer, 0, len); - - if (header == null) { - header = bos.toByteArray(); -// System.out.println(HexUtil.encodeHexStr(header)); - bos.reset(); + // 第一次读取的是FLV header(13字节) + if (header == null && len >= 13) { + header = new byte[13]; + System.arraycopy(buffer, 0, header, 0, 13); + log.debug("FLV header已获取: {} bytes", header.length); + headerSent = true; + + // 如果有剩余数据(包含header+数据),一起发送 + if (len > 0) { + byte[] data = new byte[len]; + System.arraycopy(buffer, 0, data, 0, len); + sendFrameData(data); + } continue; } - // 帧数据 - byte[] data = bos.toByteArray(); - bos.reset(); - - // 发送到前端 - sendFrameData(data); + // 后续直接发送所有读取的数据 + if (headerSent) { + byte[] data = new byte[len]; + System.arraycopy(buffer, 0, data, 0, len); + sendFrameData(data); + } } try { @@ -236,10 +243,6 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer { input.close(); } catch (java.lang.Exception e) { } - try { - bos.close(); - } catch (java.lang.Exception e) { - } log.info("关闭媒体流-ffmpeg,{} ", cameraDto.getUrl());