Первая волна: live preview / main view / playback archive для Hikvision DVR с user-заданным Encryption Key (Live View Parameters). Работает на нативной libPlayCtrl.so без wine в runtime. ### Добавлено - Live 16-канальный грид (2 fps), main view (12 fps), playback archive через `/SDK/play` / `/SDK/playback` HTTP protocol + libPlayCtrl.so - Pull-модель PlayM4_GetJPEG вместо SetDecCallBack (callback'и крашили под нагрузкой из-за GIL race в 16 native decoder threads) - Session reconnect loop (DVR рвёт /SDK/play ~30 сек) + heartbeat /ISAPI/Security/sessionHeartbeat + auto-recovery на 401 - UI sync часов к видео-PTS через PlayM4_GetSystemTime + /pos endpoint, _pbWall re-peg каждые 2 сек. Оба template'а (fullscreen + modal) - Pure Python KDF `_hik_stream_kdf_128(user_key)` — реверс NetStream.dll через Ghidra headless. K1=6a68a361bf6eb567, K2=cd7afe68ca6fde75, cipher D(K1)-swap-E(K2)-swap-D(K1) на 16-байт блоки. Финальная формула `user_key_ascii + derived16 × 7` (константа для любого ключа) - Spy DLL под wine + Ghidra reverse engineering workflow ### Исправлено - UI часы в архиве тикают на всех скоростях (убрано `if(_pbRate!==1)` в _startSeekTimer + добавлено обновление m-status в модальном template) - Сервер больше не падает в 16-канальном гриде encrypted (убраны per-frame ffmpeg forks, pull-модель JPEG) ### TODO (остаются в testing до фикса) - Playback speed ×2/×4/×8 — протокол захвачен, код применён (PlayM4_Fast + dynamic GETJPEG_INTERVAL), ожидает теста - Clip download encrypted — NET_DVR_SetPlayBackSecretKey returns FALSE, план B: post-factum decrypt через pure Python cipher ### Docker - gunicorn --workers 1 --threads 16 (single worker обязательно для libPlayCtrl thread safety) - _DVR_LD_SET=1 env чтобы skip self-exec в контейнере
29 lines
706 B
Docker
29 lines
706 B
Docker
FROM python:3.11-slim
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
gcc \
|
|
libffi-dev \
|
|
ffmpeg \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
COPY dvr_admin_docker/requirements.txt .
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
# Библиотеки и приложение берём из оригинальных папок
|
|
COPY dvr_admin/lib/ /app/lib/
|
|
COPY dvr_admin/app.py .
|
|
|
|
VOLUME ["/data"]
|
|
|
|
ENV DATA_DIR=/data
|
|
ENV SDK_DIR=/app/lib
|
|
ENV LD_LIBRARY_PATH=/app/lib
|
|
ENV _DVR_LD_SET=1
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "1", "--threads", "16", \
|
|
"--timeout", "3600", "--worker-class", "gthread", "app:app"]
|