修复问题

This commit is contained in:
2025-09-28 10:36:29 +08:00
parent b458e754a5
commit 8024f53bce
2 changed files with 56 additions and 3 deletions

View File

@@ -25,6 +25,7 @@ import org.springframework.util.CollectionUtils;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -105,6 +106,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
// 解码/推理/发送解耦
private final OpenCVFrameConverter.ToMat toMat = new OpenCVFrameConverter.ToMat();
private final OpenCVFrameConverter.ToMat matToFrameConverter = new OpenCVFrameConverter.ToMat();
private final AtomicReference<Mat> latestFrame = new AtomicReference<>();
private final AtomicReference<List<Detection>> latestDetections =
new AtomicReference<>(java.util.Collections.emptyList());
@@ -442,14 +444,16 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
if (enableDetection) {
Mat src = latestFrame.get();
if (src == null || src.empty()) continue;
if (src == null || src.empty()) {
continue;
}
// 叠加最近一次检测结果
List<Detection> dets = latestDetections.get();
if (!CollectionUtils.isEmpty(dets)) {
Overlay.draw(dets, src);
}
// 更新最近叠好框的帧用于存证
// 更新"最近叠好框的帧"用于存证
updateLatestAnnotated(src);
// 统计(仅窗口巡检时)
@@ -460,7 +464,27 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
finishWindow();
}
frame = toMat.convert(src);
// 完全重新创建Frame避免使用转换器
int width = src.cols();
int height = src.rows();
int depth = src.depth();
int channels = src.channels();
// 创建新的Frame
frame = new Frame(width, height, Frame.DEPTH_UBYTE, channels);
// 将Mat数据复制到Frame
ByteBuffer frameBuffer = (ByteBuffer)frame.image[0];
frameBuffer.clear();
// 确保Mat是连续的
Mat continuous = src.isContinuous() ? src : src.clone();
byte[] matData = new byte[Math.toIntExact(continuous.total() * continuous.elemSize())];
continuous.data().get(matData);
// 复制数据
frameBuffer.put(matData);
frameBuffer.rewind();
} else {
frame = grabber.grab();
}