Metadata-Version: 2.4
Name: piestreamer
Version: 0.1.0
Summary: 
Author: George Kasparyants
Author-email: gg_plastt@mail.ru
Requires-Python: ==3.10.*
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Requires-Dist: aioboto3 (<13.4)
Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
Requires-Dist: boto3 (==1.34.50)
Requires-Dist: cython (>=3.0.11,<4.0.0)
Requires-Dist: fastapi-socketio (>=0.0.10,<0.0.11)
Requires-Dist: filetype (>=1.2.0,<2.0.0)
Requires-Dist: flask (>=3.1.0,<4.0.0)
Requires-Dist: flask-socketio (>=5.5.1,<6.0.0)
Requires-Dist: httpx (>=0.28.1,<0.29.0)
Requires-Dist: imageio (>=2.36.1,<3.0.0)
Requires-Dist: motor (>=3.6.1,<4.0.0)
Requires-Dist: parse (>=1.20.2,<2.0.0)
Requires-Dist: pillow (>=11.1.0,<12.0.0)
Requires-Dist: psutil (>=6.1.1,<7.0.0)
Requires-Dist: pvrecorder (>=1.2.4,<2.0.0)
Requires-Dist: pydub (>=0.25.1,<0.26.0)
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
Requires-Dist: redis (>=5.2.1,<6.0.0)
Requires-Dist: requests (>=2.32.3,<3.0.0)
Requires-Dist: tqdm (>=4.67.1,<5.0.0)
Requires-Dist: uvicorn (>=0.34.0,<0.35.0)
Description-Content-Type: text/markdown

# Техническое задание

### Пошаговое задание

1. Поток видео с RSTP через ffmpeg посекундно сохранять  в директорию по кадрам
2. Собрать 128 последовательных кадров и из них сделать видео, и удалить кадры из директории
3. Видео отправить в __CDN__ и  получить ID
4. Сохранить ID в базу с информацией о времени и об индексов кадров


### Этпы реализации

1. Абстрагировать интерфейс CDN
- Базовый класс при сохрании отрывков видео
- Отнаследоваться от базового класса и реализовать хранение в том же gridfs
- в публичном CDN Amazon
- локальный CDN поднять и сохранял эти файлы
2. Метрики сохранения
- файл теста, в котором будет 30 минут считываться все потоки, сохраняться на CDN и после сохранения чтобы выводил максимальное и среднее значение задержек
Задержка - это разница между двумя последовательными кадрами при чтении
по каждому урлу выводить максимальное и среднее значение задержек
3. Оптимизировать сервис, так чтобы метрики снизились


### Продолжение

ffmpeg может читать из потока и сразу созранять как видео

Текущая команда:
```sh
ffmpeg -rtsp_transport tcp -i 'rtsp://faceid:Hv4w2!X7r@37.204.180.11:554/cam/realmonitor?channel=6&subtype=0' -filter:v fps=2 -an -use_wallclock_as_timestamps 1 -f segment -reset_timestamps 1 -segment_time 128 -segment_format mkv -strftime 1 test_output/%Y%m%dT%H%M%S.mkv
```

Нужно ознакомиться с документацией, дополнить команду так, чтобы колиество фреймов было фиксировано - 128
https://ffmpeg.org/ffmpeg-all.html#segment_002c-stream_005fsegment_002c-ssegment

### Решение 1
```shell
ffmpeg -rtsp_transport tcp -i 'rtsp://faceid:Hv4w2!X7r@37.204.180.11:554/cam/realmonitor?channel=6&subtype=0' -c:v libx264 -x264-params keyint=1:min-keyint=1 -filter:v fps=2 -an -use_wallclock_as_timestamps 1 -f segment -reset_timestamps 1 -segment_time 64 -segment_time_delta 0.5 -segment_format mkv -strftime 1 test_output/2/%Y%m%dT%H%M%S.mkv
```

### Решение 2 - с архивацией
```shell
ffmpeg -rtsp_transport tcp -i 'rtsp://faceid:Hv4w2!X7r@37.204.180.11:554/cam/realmonitor?channel=6&subtype=0' -c:v libx264 -preset veryfast -crf 40 -filter:v fps=1 -x264-params keyint=1:min-keyint=1 -an -use_wallclock_as_timestamps 1 -f segment -reset_timestamps 1 -segment_time 128 -segment_format mp4 -strftime 1 'test_output/6/%Y%m%dT%H%M%S.mp4'
```


### Решение 3 (лучшее) - с архивацией и ускорением
```shell
ffmpeg \
-rtsp_transport tcp \
-i 'rtsp://faceid:Hv4w2!X7r@37.204.180.11:554/cam/realmonitor?channel=6&subtype=0' \
-c:v libx264 -preset medium -crf 34 \
-filter:v "fps=16, setpts=PTS/16" \
-x264-params keyint=1:min-keyint=1 -an \
-use_wallclock_as_timestamps 1 \
-f segment -reset_timestamps 1 -segment_time 8 \
-segment_format mp4 -strftime 1 \
'test_output/11/%Y%m%dT%H%M%S.mp4'
```


### Доп. информация

Иструкция:
https://gist.github.com/TomHumphries/f565e0ce479e4acae4a6ecb1d244dbbc

---

Структурв БД:
```
- dt: datetime
- grid_id: ObjectId
- index: int
- room_id: ObjectId
- meta: dict

storage: [grid_id, file]

10:00 - 12:00 room_id

query - grid_id, index которые в этот промежток
```

## Техническое задание для оптимизации записи и хранения медиа файлов

#### Общее описание задачи
Целью проекта является оптимизация процессов захвата, записи и хранения видео и аудио данных, используя возможности `ffmpeg`, для улучшения производительности, эффективности хранения и расширения функциональности системы.

#### Основные требования:
1. **Интеграция `ffmpeg` для захвата и обработки видеопотоков:**
   - Замена текущей логики захвата видеопотоков с использованием OpenCV на `ffmpeg`.
   - Реализация функций предварительной обработки видеопотоков, включая изменение разрешения, сжатие, конвертацию в черно-белый формат и другие.

2. **Разработка новых классов для записи и чтения видео с использованием `ffmpeg`:**
   - Создание классов, аналогичных `EfficientGridFSWriter` и `EfficientGridFSReader`, для работы с файлами через `ffmpeg`.
   - Обеспечение совместимости новых классов с существующей архитектурой системы.

3. **Оптимизация хранения видео и аудио данных:**
   - Исследование возможностей `ffmpeg` для оптимизации форматов хранения данных с целью экономии дискового пространства при сохранении качества.
   - Адаптация схемы хранения данных в MongoDB с учетом новых форматов и требований к эффективности.

4. **Разработка метрик и тестов для оценки производительности системы:**
   - Создание инструментов для измерения производительности захвата, обработки и хранения данных.
   - Сбор и анализ метрик для определения оптимальных настроек `ffmpeg` и структуры хранения данных.

#### Детальные требования:

1. **Абстракция интерфейса CDN для унификации работы с хранилищами:**
   - Разработка базового класса для абстракции процессов сохранения и чтения данных.
   - Имплементация конкретных классов для работы с GridFS MongoDB, Amazon CDN и локальными хранилищами.

2. **Реализация тестового сценария для измерения задержек:**
   - Создание скрипта для автоматизированного тестирования, измеряющего задержки при работе с различными CDN.
   - Анализ полученных данных для выявления узких мест в процессе сохранения данных.

3. **Оптимизация сервиса для снижения задержек:**
   - Использование результатов тестирования для оптимизации параметров кодирования `ffmpeg`.
   - Адаптация логики записи и чтения данных для минимизации задержек.

#### Технические детали:

- **Язык программирования:** Python 3.
- **Основные библиотеки и инструменты:** `ffmpeg`, `imageio-ffmpeg`, `PIL` (Pillow), `numpy`, `pymongo`, `gridfs`.
- **Среда разработки:** Возможность разработки и тестирования должна быть обеспечена как в локальной среде, так и на целевых серверах.
- **Документация:** Каждый новый класс и метод должен сопровождаться подробными комментариями и документацией. Также необходимо подготовить инструкции по развер

тыванию и настройке новых компонентов системы.

