From c8e45a5311ffd27616683d5b8cd8087a2f8315a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Wed, 26 Aug 2026 09:57:25 +0800 Subject: [PATCH] =?UTF-8?q?1.=E9=87=87=E7=94=A8=E6=96=B0=E7=9A=84=E5=9B=9E?= =?UTF-8?q?=E6=94=BE=202.=E4=BF=AE=E6=94=B9opencv=E7=9A=84jar=E5=8C=85?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E6=8C=89=E9=9C=80=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao-module-camera-biz/pom.xml | 19 +++++---- .../lib/camera/hik/HikControlModuleImpl.java | 41 +++++++++++-------- .../yudao-module-logistics-biz/pom.xml | 12 ++---- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/yudao-module-camera/yudao-module-camera-biz/pom.xml b/yudao-module-camera/yudao-module-camera-biz/pom.xml index 78b889d..f74477e 100644 --- a/yudao-module-camera/yudao-module-camera-biz/pom.xml +++ b/yudao-module-camera/yudao-module-camera-biz/pom.xml @@ -127,16 +127,21 @@ com.sun.jna.examples - test + jna-examples 1.0 - system - ${project.basedir}/src/main/resources/libs/examples.jar + org.bytedeco - javacv-platform + javacv 1.5.7 + + + org.bytedeco + ffmpeg-platform + 5.0-1.5.7 + com.aliyun aliyun-java-sdk-dysmsapi @@ -171,10 +176,8 @@ gnu.io - SerialPort - 1.0 - system - ${project.basedir}/src/main/resources/libs/rxtx-2.1.7.jar + rxtx + 2.1.7 diff --git a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/hik/HikControlModuleImpl.java b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/hik/HikControlModuleImpl.java index 2408f8d..039c9da 100644 --- a/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/hik/HikControlModuleImpl.java +++ b/yudao-module-camera/yudao-module-camera-biz/src/main/java/cn/iocoder/yudao/module/camera/lib/camera/hik/HikControlModuleImpl.java @@ -12,6 +12,12 @@ import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.bytedeco.ffmpeg.global.avcodec; +import org.bytedeco.ffmpeg.global.avutil; +import org.bytedeco.javacv.FFmpegFrameGrabber; +import org.bytedeco.javacv.FFmpegFrameRecorder; +import org.bytedeco.javacv.FFmpegLogCallback; +import org.bytedeco.javacv.Frame; import org.springframework.stereotype.Service; import java.io.*; @@ -621,7 +627,7 @@ public class HikControlModuleImpl implements CameraModule { // 通过获取设备时间来判断连接是否有效 HCNetSDK.NET_DVR_TIME deviceTime = new HCNetSDK.NET_DVR_TIME(); return hcNetsdk.NET_DVR_GetDVRConfig(lUserId, HCNetSDK.NET_DVR_GET_TIMECFG, 0, - deviceTime.getPointer(), deviceTime.size(), new com.sun.jna.ptr.IntByReference()); + deviceTime.getPointer(), deviceTime.size(), new IntByReference()); } /** @@ -961,10 +967,10 @@ public class HikControlModuleImpl implements CameraModule { } private void runGrabberRecorder(PipedInputStream pipedIn) { - org.bytedeco.ffmpeg.global.avutil.av_log_set_level(org.bytedeco.ffmpeg.global.avutil.AV_LOG_ERROR); - org.bytedeco.javacv.FFmpegLogCallback.set(); - org.bytedeco.javacv.FFmpegFrameGrabber grabber = null; - org.bytedeco.javacv.FFmpegFrameRecorder recorder = null; + avutil.av_log_set_level(avutil.AV_LOG_ERROR); + FFmpegLogCallback.set(); + FFmpegFrameGrabber grabber = null; + FFmpegFrameRecorder recorder = null; try { // 等待管道有数据(最多等30秒) long deadline = System.currentTimeMillis() + 30_000; @@ -976,15 +982,14 @@ public class HikControlModuleImpl implements CameraModule { } log.info("[Grabber] cameraId={} 首批数据 {} bytes", cameraId, pipedIn.available()); - grabber = new org.bytedeco.javacv.FFmpegFrameGrabber(pipedIn); + grabber = new FFmpegFrameGrabber(pipedIn); grabber.setFormat("mpeg"); - // 减小 probe 参数,避免消费过多数据导致跳帧 - grabber.setOption("probesize", "131072"); // 128KB - grabber.setOption("analyzeduration", "1000000"); // 1秒 - grabber.setOption("max_analyze_duration", "1000000"); + // probe 参数:给足数据量和时长,避免 probe 阶段读到管道暂时无数据就误判 EOF 导致 grab() 提前返回 null + grabber.setOption("probesize", "5000000"); // 5MB + grabber.setOption("analyzeduration", "5000000"); // 5秒 + grabber.setOption("max_analyze_duration", "5000000"); grabber.setOption("err_detect", "ignore_err"); - grabber.setOption("fflags", "nobuffer"); - grabber.setOption("flags", "low_delay"); + // 注意:不能设 fflags=nobuffer / flags=low_delay,否则管道流 probe 时会提前判 EOF grabber.start(); int w = grabber.getImageWidth(), h = grabber.getImageHeight(); @@ -993,9 +998,9 @@ public class HikControlModuleImpl implements CameraModule { int br = grabber.getVideoBitrate() > 0 ? grabber.getVideoBitrate() : 2000000; log.info("[Grabber] cameraId={} {}x{} fps={}", cameraId, w, h, fps); - recorder = new org.bytedeco.javacv.FFmpegFrameRecorder(rtmpUrl, w, h, ch); + recorder = new FFmpegFrameRecorder(rtmpUrl, w, h, ch); recorder.setFormat("flv"); - recorder.setVideoCodec(org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_H264); + recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.setVideoBitrate(br); recorder.setFrameRate(fps); recorder.setGopSize(Math.max(25, (int) fps)); @@ -1006,7 +1011,7 @@ public class HikControlModuleImpl implements CameraModule { recorder.setVideoOption("ec", "favor_inter"); recorder.setVideoOption("err_detect", "ignore_err"); if (ch > 0) { - recorder.setAudioCodec(org.bytedeco.ffmpeg.global.avcodec.AV_CODEC_ID_AAC); + recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); recorder.setSampleRate(grabber.getSampleRate() > 0 ? grabber.getSampleRate() : 8000); recorder.setAudioChannels(ch); recorder.setAudioBitrate(grabber.getAudioBitrate() > 0 ? grabber.getAudioBitrate() : 64000); @@ -1016,7 +1021,7 @@ public class HikControlModuleImpl implements CameraModule { long fc = 0; long startMs = System.currentTimeMillis(); - org.bytedeco.javacv.Frame frame; + Frame frame = null; int errorFrameCount = 0; while (running && (frame = grabber.grab()) != null) { if (frame.image != null) { @@ -1101,12 +1106,12 @@ public class HikControlModuleImpl implements CameraModule { } /** 关闭 FFmpegFrameGrabber */ - private static void closeQuietly(org.bytedeco.javacv.FFmpegFrameGrabber g) { + private static void closeQuietly(FFmpegFrameGrabber g) { if (g != null) { try { g.close(); } catch (Exception ignored) {} } } /** 关闭 FFmpegFrameRecorder */ - private static void closeQuietly(org.bytedeco.javacv.FFmpegFrameRecorder r) { + private static void closeQuietly(FFmpegFrameRecorder r) { if (r != null) { try { r.close(); } catch (Exception ignored) {} } } diff --git a/yudao-module-logistics/yudao-module-logistics-biz/pom.xml b/yudao-module-logistics/yudao-module-logistics-biz/pom.xml index 2b2f4b1..f5116c4 100644 --- a/yudao-module-logistics/yudao-module-logistics-biz/pom.xml +++ b/yudao-module-logistics/yudao-module-logistics-biz/pom.xml @@ -39,10 +39,8 @@ gnu.io - SerialPort - 1.0 - system - ${project.basedir}/src/main/resources/libs/rxtx-2.1.7.jar + rxtx + 2.1.7 @@ -65,10 +63,8 @@ gnu.io - SerialPort - 1.0 - system - ${project.basedir}/src/main/resources/libs/rxtx-2.1.7.jar + rxtx + 2.1.7