From 3fcd00d4c805dc44c929518b4705cfb6a70bff1f Mon Sep 17 00:00:00 2001 From: ericwyuan Date: Fri, 21 Aug 2026 13:52:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(fam-edge):=20=E6=96=87=E4=BB=B6=E5=90=8D?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=94=AF=E6=8C=81=E7=BA=AF=E6=95=B0=E5=AD=97?= =?UTF-8?q?=20YYYYMMDD-HHMMSS=20=E6=A0=BC=E5=BC=8F=EF=BC=88=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E5=BD=95=E5=83=8F=E5=90=8D=2020260820-140416=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E6=AD=A3=E5=88=99=E5=8F=AA=E8=AE=A4=E5=B8=A6=E5=88=86?= =?UTF-8?q?=E9=9A=94=E7=AC=A6=EF=BC=89=EF=BC=9B=E4=BA=8B=E4=BB=B6=E7=9B=B8?= =?UTF-8?q?=E5=AF=B9=E6=97=B6=E9=97=B4=E5=8A=A0=206h=20=E5=90=AF=E5=8F=91?= =?UTF-8?q?=E5=BC=8F=E9=98=B2=E8=AF=AF=E5=88=A4=E7=BB=9D=E5=AF=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fam-edge/src/fam_edge/video_processor.py | 31 +++++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/fam-edge/src/fam_edge/video_processor.py b/fam-edge/src/fam_edge/video_processor.py index c326ef5..ef3b4f3 100644 --- a/fam-edge/src/fam_edge/video_processor.py +++ b/fam-edge/src/fam_edge/video_processor.py @@ -24,7 +24,21 @@ logger = setup_logger('fam-edge.video_processor') def _parse_event_start_from_filename(filename: str) -> str: - """从监控文件名解析开始时间(北京时间)。示例: 2026-08-21_081500.mp4""" + """从监控文件名解析开始时间(北京时间)。 + + 支持格式: + - 2026-08-21_081500.mp4 / 20260821_081500.mp4(带/不带分隔符日期) + - Generic_ONVIF-001-20260820-140416-xxx.mp4(纯数字 YYYYMMDD-HHMMSS) + """ + # 纯数字: YYYYMMDD-HHMMSS 或 YYYYMMDDHHMMSS(监控录像文件名格式) + m0 = re.search(r'(\d{4})(\d{2})(\d{2})[-_]?(\d{2})(\d{2})(\d{2})', filename) + if m0: + y, mo, d, hh, mm, ss = m0.groups() + try: + dt = datetime(int(y), int(mo), int(d), int(hh), int(mm), int(ss)) + return dt.strftime('%Y-%m-%d %H:%M:%S') + except ValueError: + pass m = re.search(r'(\d{4})[-_](\d{2})[-_](\d{2})[_-]?(\d{2})(\d{2})(\d{2})', filename) if m: y, mo, d, hh, mm, ss = m.groups() @@ -50,10 +64,19 @@ def _parse_event_ts(ts: str, start_dt): m = re.match(r'^(\d{1,2}):(\d{2}):(\d{2})$', ts) if m: off = int(m.group(1)) * 3600 + int(m.group(2)) * 60 + int(m.group(3)) + # 启发式:监控单段通常 ≤1h,相对时间超过 6h 视为模型误输出绝对时间(无日期),不强行定位 + if off <= 6 * 3600: + if start_dt is not None: + abs_ts = (start_dt + timedelta(seconds=off)).strftime('%Y-%m-%d %H:%M:%S') + return abs_ts, float(off) + return ts, float(off) if start_dt is not None: - abs_ts = (start_dt + timedelta(seconds=off)).strftime('%Y-%m-%d %H:%M:%S') - return abs_ts, float(off) - return ts, float(off) + try: + ev_dt = datetime.strptime(ts[:19], '%Y-%m-%d %H:%M:%S') + return ts, (ev_dt - start_dt).total_seconds() + except ValueError: + pass + return ts, 0.0 if start_dt is not None: try: ev_dt = datetime.strptime(ts[:19], '%Y-%m-%d %H:%M:%S')