Инструменты пользователя

Инструменты сайта


dvr

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
dvr [11.05.2024 08:28] augindvr [08.07.2024 11:51] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
-{{ :favicon.ico |}} 
- 
 [[https://github.com/AlexxIT/go2rtc/releases/]] [[https://github.com/AlexxIT/go2rtc/releases/]]
  
Строка 525: Строка 523:
  
 </code> </code>
-===== python dvr.py --config_file '/path/to/config.yaml' --base_dir '/media/disk1/video' --stream_server 'rtsp://10.10.15.103:8554' ===== +===== python3 dvr.py --config_file 'dvr.yaml' ===== 
- +<code>
-<code bash>+
 import argparse import argparse
 import time import time
Строка 535: Строка 532:
 import subprocess import subprocess
 import schedule import schedule
 +from pathlib import Path
 +
  
 # Настройка парсера аргументов командной строки # Настройка парсера аргументов командной строки
 parser = argparse.ArgumentParser(description='Запись видеопотоков.') parser = argparse.ArgumentParser(description='Запись видеопотоков.')
 parser.add_argument('--config_file', type=str, help='Путь к файлу конфигурации', required=True) parser.add_argument('--config_file', type=str, help='Путь к файлу конфигурации', required=True)
-parser.add_argument('--base_dir', type=str, help='Базовая директория для сохранения видео', required=True) 
-parser.add_argument('--stream_server', type=str, help='Адрес сервера потоков', required=True) 
- 
 # Чтение аргументов командной строки # Чтение аргументов командной строки
 args = parser.parse_args() args = parser.parse_args()
 +dvr_config_file = args.config_file
 +
 +def read_dvr_config(config_file):
 +    with open(dvr_config_file, 'r') as file:
 +        return yaml.safe_load(file)
 +
 +config = read_dvr_config(dvr_config_file)
 +base_dir = config['base_dir']
 +stream_server = config['stream_server']
 +target_size_gb = config['target_size_gb']
 +go2rtc_config_path = config['go2rtc_config_path']
 +
 +
 +# Функция очистки папок
 +def clean_camera_folders(base_dir, target_size_gb):
 +    """
 +    Очищает папки камер, удаляя самые старые файлы, пока размер папки не уменьшится до целевого размера.
 +
 +    :param base_dir: Путь к каталогу, содержащему папки камер.
 +    :param target_size_gb: Целевой размер папки в гигабайтах.
 +    """
 +    base_dir = Path(base_dir)
 +    # Удалить пустые папки
 +    for folder in base_dir.iterdir():
 +        if folder.is_dir() and not any(folder.iterdir()):
 +            folder.rmdir()
 +    # Перебор папок камер
 +    for camera_dir in base_dir.iterdir():
 +        if camera_dir.is_dir():
 +            # Получить текущий размер папки камеры в ГБ без десятичной части
 +            size_gb = sum(f.stat().st_size for f in camera_dir.glob('**/*') if f.is_file()) / (1024 ** 3)
 +
 +            # Рассчитать, сколько нужно удалить, чтобы достичь целевого размера
 +            space_to_free_gb = size_gb - target_size_gb
 +
 +            # Проверить, превышает ли текущий размер целевой размер
 +            if size_gb > target_size_gb:
 +                print(f"Cleaning {camera_dir}")
 +                # Удалить самые старые файлы, пока размер папки не уменьшится до целевого размера
 +                while space_to_free_gb > 0:
 +                    # Найти самый старый файл в папке
 +                    oldest_file = min(camera_dir.glob('**/*'), key=os.path.getmtime)
 +                    # Удалить самый старый файл
 +                    oldest_file_size = oldest_file.stat().st_size / (1024 ** 3)
 +                    try:
 +                        oldest_file.unlink()
 +                        print(f"Deleted {oldest_file}")
 +                        # Обновить текущий размер
 +                        space_to_free_gb -= oldest_file_size
 +                    except Exception as e:
 +                        print(f"Error deleting file {oldest_file}: {e}")
  
 # Функция для записи потоков # Функция для записи потоков
 def record_streams(duration, base_dir, stream_server): def record_streams(duration, base_dir, stream_server):
-    with open(args.config_file, 'r') as file:+    with open(go2rtc_config_path, 'r') as file:
         config_data = yaml.safe_load(file)         config_data = yaml.safe_load(file)
     streams = config_data['streams'].keys()     streams = config_data['streams'].keys()
Строка 569: Строка 616:
             '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', '-t', str(duration), output_file             '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', '-t', str(duration), output_file
         ]         ]
-        log_file = os.path.join(base_dir, f"{stream_name}_{M}.txt")+        #log_file = os.path.join(base_dir, f"{stream_name}_{M}.txt")
         # Запуск субпроцесса без ожидания его завершения         # Запуск субпроцесса без ожидания его завершения
         process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)         process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Строка 576: Строка 623:
     # Возвращаем список запущенных процессов, если нужно контролировать их в будущем     # Возвращаем список запущенных процессов, если нужно контролировать их в будущем
     return processes     return processes
 +    # Очистка папок до размера 90 Гб
 +    clean_camera_folders(base_dir, target_size_gb)
  
-# Запуск если минута не кратна 10+## Запуск записи при старте.
 now = datetime.now() now = datetime.now()
-if now.minute % 10 != 0: +#if now.minute % 10 != 0: 
-    next_interval = (now.minute // 10 + 1) * 10 +next_interval = (now.minute // 10 + 1) * 10 
-    remaining_time = (next_interval - now.minute) * 60 - now.second +remaining_time = (next_interval - now.minute) * 60 - now.second 
-    record_streams(remaining_time, args.base_dir, args.stream_server)+record_streams(remaining_time, base_dir, stream_server)
  
-remaining_time 600 +duration 607 
-# Планируем задачу на каждую минуту +# Планируем задачу на каждые 10 минут 
-schedule.every().hour.at(":00").do(record_streams,remaining_timeargs.base_dir, args.stream_server) +schedule.every().hour.at(":00").do(record_streams, duration, base_dir, stream_server) 
-schedule.every().hour.at(":10").do(record_streams,remaining_timeargs.base_dir, args.stream_server) +schedule.every().hour.at(":10").do(record_streams, duration, base_dir, stream_server) 
-schedule.every().hour.at(":20").do(record_streams,remaining_timeargs.base_dir, args.stream_server) +schedule.every().hour.at(":20").do(record_streams, duration, base_dir, stream_server) 
-schedule.every().hour.at(":30").do(record_streams,remaining_timeargs.base_dir, args.stream_server) +schedule.every().hour.at(":30").do(record_streams, duration, base_dir, stream_server) 
-schedule.every().hour.at(":40").do(record_streams,remaining_timeargs.base_dir, args.stream_server) +schedule.every().hour.at(":40").do(record_streams, duration, base_dir, stream_server) 
-schedule.every().hour.at(":50").do(record_streams,remaining_timeargs.base_dir, args.stream_server)+schedule.every().hour.at(":50").do(record_streams, duration, base_dir, stream_server)
  
 # Основной цикл # Основной цикл
Строка 598: Строка 647:
     time.sleep(1)     time.sleep(1)
 </code> </code>
-===== Заголовок ===== +===== dvr.yaml ===== 
-<code bash>import os +<code> 
-from pathlib import Path +base_dir: '/media/disk1/vt' 
-import shutil+stream_server: 'rtsp://10.10.15.103:8554' 
 +target_size_gb: 90 
 +go2rtc_config_path: '/opt/go2rtc/go2rtc.yaml'
  
-# Установите целевой размер для папок камеры в гигабайтах +</code>
-target_size_gb = 90+
  
-# Каталог, содержащий папки камер +===== Docker ===== 
-base_dir Path("/media/disk1/video")+  docker container rm  simple_nvr 
 +  docker build -t augin/nvr:v1 . 
 +  docker run -v /usr/share/hassio/homeassistant/go2rtc.yaml:/config/go2rtc.yaml -v /mnt:/mounts/disk1/video  --name simple_nvr augin/nvr:v1 
 +  
  
-# Удалить пустые папки 
-# for folder in base_dir.iterdir(): 
-#     if folder.is_dir() and not any(folder.iterdir()): 
-#         folder.rmdir() 
- 
-# Перебор папок камер 
-for camera_dir in base_dir.iterdir(): 
-    if camera_dir.is_dir(): 
-        # Получить текущий размер папки камеры в ГБ без десятичной части 
-        size_gb = sum(f.stat().st_size for f in camera_dir.glob('**/*') if f.is_file()) / (1024 ** 3) 
- 
-        # Рассчитать, сколько нужно удалить, чтобы достичь целевого размера 
-        space_to_free_gb = size_gb - target_size_gb 
- 
-        # Проверить, превышает ли текущий размер целевой размер 
-        if size_gb > target_size_gb: 
-            print(f"Cleaning {camera_dir}") 
-            # Удалить самые старые файлы, пока размер папки не уменьшится до целевого размера 
-            while space_to_free_gb > 0: 
-                # Найти самый старый файл в папке 
-                oldest_file = min(camera_dir.glob('**/*'), key=os.path.getmtime) 
-                # Удалить самый старый файл 
-                oldest_file_size = oldest_file.stat().st_size / (1024 ** 3) 
-                try: 
-                    oldest_file.unlink() 
-                    print(f"Deleted {oldest_file}") 
-                    # Обновить текущий размер 
-                    space_to_free_gb -= oldest_file_size 
-                except Exception as e: 
-                    print(f"Error deleting file {oldest_file}: {e}") 
-</code> 
dvr.1715416084.txt.gz · Последнее изменение: 08.07.2024 11:48 (внешнее изменение)