def grab_and_write(): while True: if not append_queue.empty(): path, content = append_queue.get() log.n(tag, "Writing to " + path) with open(path, "ab") as f: f.write(content)
def tracking(): while True: if not __q__.empty(): path = __q__.get() log.n("detection_queue.py", "Начал детектить: " + path) os.system('cmd /c ' + 'python object_tracker.py --model yolov4 ' '--video ' + path + ' ' '--output ' + path + '.avi ')
def __close_file__(self): log.n( self.tag, "uTS закрыт: " + self.__cur_ts_file_name__ + " (" + "{:.3f}".format(self.__ts_buffer_duration__) + " сек)") self.__start_tracking__(self.__config__.name, self.__cur_ts_file_name__) self.__cur_ts_file_name__ = None self.__ts_buffer_duration__ = 0
def start(self): """ Запускает работу M3u8Watcher, начинается скачивание трансляции. """ if not self.isReadyToUse: log.e(self.tag, "Конфиг настроен неправильно. Старт потока невозможен") return # Связываем формулятор с нашей очередью self.__config__.formulator.queue = self.__q__ log.n(self.tag, "Старт потока") self.__running_code__()
def __init__(self, config: Config): self.isReadyToUse = False # Готов ли этот M3u8Watcher к запуску self.tag = "M3u8Watcher@" + config.non_null_name() if config.isValid(): self.__config__ = config log.n(self.tag, "Поток настроен успешно и готов к использованию") self.isReadyToUse = True else: log.e(self.tag, "Конфиг настроен неправильно. Поток не будет подключён") self.isReadyToUse = False # Локальные переменные self.__q__ = Queue() self.__ts_buffer_duration__ = 0 self.__cur_ts_file_name__ = None self.__start_is_discontinuity__ = True
def __append_ts_content__(self, ts_seg: TsSegment, ts_content): camera_path = os.path.join(self.__config__.output_path, str(self.__config__.non_null_name())) if not os.path.exists(camera_path): os.makedirs(camera_path) if ts_seg.type == TsSegment.TYPE_TS_CONTENT: if self.__cur_ts_file_name__ is None: # Файл дозаписи ещё не создан # Нужно сгенерировать имя этого файла, чтобы туда можно было дозаписывать self.__cur_ts_file_name__ = self.__generate_full_uTS_file_name__( ts_seg) # Дозаписываем в файл - добавлем в mp.Queue а file_manager в едином потоке по очереди всё записывает в # соотвествующие файлы files.append_queue.put( (os.path.join(camera_path, str(self.__cur_ts_file_name__)), ts_content)) self.__ts_buffer_duration__ += ts_seg.duration log.n( self.tag, "Буфер дополнен. Новая длительность буфера: " + "{:.3f}".format(self.__ts_buffer_duration__) + " сек") # Проверяем на длительность uTS if self.__ts_buffer_duration__ + self.__config__.tolerance >= self.__config__.uTS_duration: # Если uTS достаточно длинный, закрываем этот файл self.__close_file__() elif ts_seg.type == TsSegment.TYPE_TS_AD: if self.__cur_ts_file_name__ is None: # Файл дозаписи ещё не создан log.n( self.tag, "Получен рекламный сегмент, но файл дозаписи ещё не создан. Действия не требуются" ) return # Ничего делать не нужно else: # Файл открыт на дозапись log.w( self.tag, "Получен рекламный сегмент, текущий uTS будет закрыт, " "дальнейшее видео запишется в новый uTS") self.__close_file__( ) # Закрываем этот файл, писать будем в новый self.__start_is_discontinuity__ = True
def add_to_queue(path): log.n("detection_queue.py", "Добавил в очередь: " + path) __q__.put(path)