fix(fam-edge): 文件名解析支持纯数字 YYYYMMDD-HHMMSS 格式(监控录像名 20260820-140416,原正则只认带分隔符);事件相对时间加 6h 启发式防误判绝对时间
This commit is contained in:
@@ -24,7 +24,21 @@ logger = setup_logger('fam-edge.video_processor')
|
|||||||
|
|
||||||
|
|
||||||
def _parse_event_start_from_filename(filename: str) -> str:
|
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)
|
m = re.search(r'(\d{4})[-_](\d{2})[-_](\d{2})[_-]?(\d{2})(\d{2})(\d{2})', filename)
|
||||||
if m:
|
if m:
|
||||||
y, mo, d, hh, mm, ss = m.groups()
|
y, mo, d, hh, mm, ss = m.groups()
|
||||||
@@ -50,6 +64,8 @@ def _parse_event_ts(ts: str, start_dt):
|
|||||||
m = re.match(r'^(\d{1,2}):(\d{2}):(\d{2})$', ts)
|
m = re.match(r'^(\d{1,2}):(\d{2}):(\d{2})$', ts)
|
||||||
if m:
|
if m:
|
||||||
off = int(m.group(1)) * 3600 + int(m.group(2)) * 60 + int(m.group(3))
|
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:
|
if start_dt is not None:
|
||||||
abs_ts = (start_dt + timedelta(seconds=off)).strftime('%Y-%m-%d %H:%M:%S')
|
abs_ts = (start_dt + timedelta(seconds=off)).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
return abs_ts, float(off)
|
return abs_ts, float(off)
|
||||||
@@ -61,6 +77,13 @@ def _parse_event_ts(ts: str, start_dt):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
return ts, 0.0
|
return ts, 0.0
|
||||||
|
if start_dt is not None:
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
class VideoProcessor:
|
class VideoProcessor:
|
||||||
|
|||||||
Reference in New Issue
Block a user