diff --git a/common/constants.py b/common/constants.py index 4825756..6ea183d 100644 --- a/common/constants.py +++ b/common/constants.py @@ -24,7 +24,7 @@ def init_config(config_path: str = "config.yaml"): cfg = yaml.safe_load(f) ALERT_PUSH_URL = cfg.get("alert_push_url", "") - HLS_ROOT_PATH = cfg.get("hls_root_path", "") + # HLS_ROOT_PATH = cfg.get("hls_root_path", "") logger.info(f"[INFO] Config initialized from {config_path}, alert_push_url={ALERT_PUSH_URL}") except Exception as e: diff --git a/hls_service_ws_kadian.py b/hls_service_ws_kadian.py index 4951f45..e7b9a0d 100644 --- a/hls_service_ws_kadian.py +++ b/hls_service_ws_kadian.py @@ -21,9 +21,10 @@ from dataclasses import dataclass from common.processor_factory import get_processor from common.camera_config import CameraConfig, parse_cameras_from_json, parse_cameras_from_yaml -from common.constants import init_config +from common import constants from utils.web_socket_sender import WebSocketSender from utils.logger import get_logger +from utils.hls_utils import get_latest_n_segments as get_latest_segments logger = get_logger(__name__) @@ -59,53 +60,8 @@ class HLSFrameProcessor(threading.Thread): self.should_reset_time = False def get_latest_n_segments(self, n: int) -> list: - """ - 获取最新的n个TS分片 - - 逻辑: - 1. 获取index_code文件夹下所有时间戳文件夹 - 2. 按时间戳名称降序排序(最新的在前) - 3. 从最新的时间戳文件夹开始获取分片 - 4. 如果分片数不足n,继续从上一个时间戳文件夹获取 - 5. 返回最新的n个分片路径list(按时间顺序,最旧的在前) - """ - if not os.path.exists(self.camera_root_dir): - return [] - - # 获取所有时间戳文件夹并排序(字符串排序即时间排序) - timestamp_folders = [] - for folder_name in os.listdir(self.camera_root_dir): - folder_path = os.path.join(self.camera_root_dir, folder_name) - if os.path.isdir(folder_path): - timestamp_folders.append(folder_name) - - if not timestamp_folders: - return [] - - # 降序排序,最新的在前 - timestamp_folders.sort(reverse=True) - - # 收集分片 - all_segments = [] - for ts_folder in timestamp_folders: - ts_folder_path = os.path.join(self.camera_root_dir, ts_folder) - pattern = os.path.join(ts_folder_path, "segment_*.ts") - segment_files = glob.glob(pattern) - - # 按分片序号排序 - segment_files.sort(key=lambda x: int(os.path.basename(x).split('_')[-1].split('.')[0])) - - all_segments.extend(segment_files) - - # 已经收集够了 - if len(all_segments) >= n: - break - - # 返回最新的n个(取最后n个,因为最新的在后面) - if len(all_segments) >= n: - return all_segments[-n:] - else: - return all_segments + """获取最新的n个TS分片(委托给工具函数)""" + return get_latest_segments(self.camera_root_dir, n) def get_segment_number(self, filename): """从文件名中提取序号""" @@ -380,7 +336,8 @@ if __name__ == "__main__": args = parser.parse_args() # 初始化全局配置 - init_config(args.config) + constants.init_config(args.config) + constants.HLS_ROOT_PATH = args.hls_root_path # 优先使用命令行传入的 cameras JSON,否则读取配置文件 if args.cameras: diff --git a/utils/hls_utils.py b/utils/hls_utils.py index e69de29..d75b08c 100644 --- a/utils/hls_utils.py +++ b/utils/hls_utils.py @@ -0,0 +1,52 @@ +import os +import glob + + +def get_latest_n_segments(camera_root_dir: str, n: int) -> list: + """ + 获取最新的n个TS分片 + + 逻辑: + 1. 获取index_code文件夹下所有时间戳文件夹 + 2. 按时间戳名称降序排序(最新的在前) + 3. 从最新的时间戳文件夹开始获取分片 + 4. 如果分片数不足n,继续从上一个时间戳文件夹获取 + 5. 返回最新的n个分片路径list(按时间顺序,最旧的在前) + """ + if not os.path.exists(camera_root_dir): + return [] + + # 获取所有时间戳文件夹并排序(字符串排序即时间排序) + timestamp_folders = [] + for folder_name in os.listdir(camera_root_dir): + folder_path = os.path.join(camera_root_dir, folder_name) + if os.path.isdir(folder_path): + timestamp_folders.append(folder_name) + + if not timestamp_folders: + return [] + + # 降序排序,最新的在前 + timestamp_folders.sort(reverse=True) + + # 收集分片 + all_segments = [] + for ts_folder in timestamp_folders: + ts_folder_path = os.path.join(camera_root_dir, ts_folder) + pattern = os.path.join(ts_folder_path, "segment_*.ts") + segment_files = glob.glob(pattern) + + # 按分片序号排序 + segment_files.sort(key=lambda x: int(os.path.basename(x).split('_')[-1].split('.')[0])) + + all_segments.extend(segment_files) + + # 已经收集够了 + if len(all_segments) >= n: + break + + # 返回最新的n个(取最后n个,因为最新的在后面) + if len(all_segments) >= n: + return all_segments[-n:] + else: + return all_segments