去除人脸识别内容

This commit is contained in:
2025-09-26 16:12:51 +08:00
parent 7f07552ecc
commit 77f18452c1
9 changed files with 50 additions and 349 deletions

View File

@@ -5,7 +5,6 @@ import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.video.common.ClientType;
import com.ruoyi.video.domain.dto.CameraDto;
import com.ruoyi.video.service.MediaService;
import com.ruoyi.video.utils.ArcFaceEngineUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
@@ -97,12 +96,10 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
*/
private Thread listenThread;
private ArcFaceEngineUtil arcFaceEngineUtil;
public MediaTransferFlvByJavacv(CameraDto cameraDto) {
super();
this.cameraDto = cameraDto;
this.arcFaceEngineUtil = SpringUtils.getBean(ArcFaceEngineUtil.class);
}
public boolean isRunning() {
@@ -129,45 +126,43 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
this.recorderStatus = recorderStatus;
}
/**
* 创建拉流器
*
* @return
*/
protected boolean createGrabber() {
// 拉流器
grabber = new FFmpegFrameGrabber(cameraDto.getUrl());
// 超时时间(15秒)
grabber.setOption("stimeout", cameraDto.getNetTimeout());
// 这些参数很多是“微秒”单位;如果你的 getNetTimeout() / getReadOrWriteTimeout() 是毫秒,
// 记得 *1000 转为微秒字符串。这里演示保守固定值,先跑通为先。
String fiveSecUs = "5000000"; // 5s in microseconds
String oneMb = "1048576"; // 1MB
// ---- 通用优化 ----
grabber.setOption("threads", "1");
// grabber.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
// 设置缓存大小,提高画质、减少卡顿花屏
grabber.setOption("buffer_size", "1024000");
grabber.setOption("buffer_size", oneMb); // 输入缓冲
grabber.setOption("rw_timeout", fiveSecUs); // 读写超时(微秒)
grabber.setOption("stimeout", fiveSecUs); // 套接字超时(微秒)
grabber.setOption("probesize", fiveSecUs); // 探测时长(微秒)
grabber.setOption("analyzeduration", fiveSecUs);// 解析时长(微秒)
grabber.setOption("fflags", "nobuffer"); // 低延迟
grabber.setOption("flags", "low_delay");
grabber.setOption("loglevel", "debug"); // 先开调试,稳定后可关
// 读写超时,适用于所有协议的通用读写超时
grabber.setOption("rw_timeout", cameraDto.getReadOrWriteTimeout());
// 探测视频流信息为空默认5000000微秒
grabber.setOption("probesize", cameraDto.getReadOrWriteTimeout());
// 解析视频流信息为空默认5000000微秒
grabber.setOption("analyzeduration", cameraDto.getReadOrWriteTimeout());
// 如果为rtsp流增加配置
if ("rtsp".equals(cameraDto.getUrl().substring(0, 4))) {
// 设置打开协议tcp / udp
// ---- RTSP 关键修正 ----
if (cameraDto.getUrl().toLowerCase().startsWith("rtsp://")) {
// 统一走 TCPRTP over RTSP/interleaved避免 461 / NAT / 防火墙问题
grabber.setOption("rtsp_transport", "tcp");
// 首选TCP进行RTP传输
grabber.setOption("rtsp_flags", "prefer_tcp");
} else if ("rtmp".equals(cameraDto.getUrl().substring(0, 4))) {
// rtmp拉流缓冲区默认3000毫秒
// 不再设置 prefer_tcp没意义了确保不带 multicast 相关 flag
// 只要视频轨,避免音频轨导致的协商失败(可按需移除)
grabber.setOption("allowed_media_types", "video");
// 避免较大的 RTP 乱序延迟
grabber.setOption("max_delay", "500000"); // 0.5s (微秒)
// 某些设备对 UA 比较挑,设置一个常见 UA可选
grabber.setOption("user_agent", "Lavf/60");
}
else if (cameraDto.getUrl().toLowerCase().startsWith("rtmp://")) {
grabber.setOption("rtmp_buffer", "1000");
// 默认rtmp流为直播模式不允许seek
// grabber.setOption("rtmp_live", "live");
} else if ("desktop".equals(cameraDto.getUrl())) {
// 支持本地屏幕采集可以用于监控屏幕、局域网和wifi投屏等
}
else if ("desktop".equalsIgnoreCase(cameraDto.getUrl())) {
grabber.setFormat("gdigrab");
grabber.setOption("draw_mouse", "1");// 绘制鼠标
grabber.setOption("draw_mouse", "1");
grabber.setNumBuffers(0);
grabber.setOption("fflags", "nobuffer");
grabber.setOption("framerate", "25");
@@ -176,16 +171,16 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
try {
grabber.start();
log.info("\r\n{}\r\n启动拉流器成功", cameraDto.getUrl());
return grabberStatus = true;
log.info("\n{}\n启动拉流器成功", cameraDto.getUrl());
return (grabberStatus = true);
} catch (FrameGrabber.Exception e) {
MediaService.cameras.remove(cameraDto.getMediaKey());
log.error("\r\n{}\r\n启动拉流器失败网络超时或视频源不可用", cameraDto.getUrl());
// e.printStackTrace();
log.error("\n{}\n启动拉流器失败网络超时或视频源不可用{}", cameraDto.getUrl(), e.getMessage());
return (grabberStatus = false);
}
return grabberStatus = false;
}
/**
* 创建转码推流录制器
*
@@ -333,7 +328,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
if (frame != null) {
processFaceDetection(frame);
if (startTime == 0) {
startTime = System.currentTimeMillis();
@@ -383,16 +378,6 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
log.info("关闭媒体流-javacv{} ", cameraDto.getUrl());
}
@Async
public void processFaceDetection(Frame frame) {
if (arcFaceEngineUtil != null) {
ImageInfo imageInfo = arcFaceEngineUtil.frameToImageInfo(frame);
if (imageInfo != null) {
arcFaceEngineUtil.getUserInfo(imageInfo);
}
}
}
/**
* 发送帧数据
*