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