- docs/integrations/frigate.md — полный production-tested guide: Dockerfile, docker-compose, config.yml, troubleshooting (s6+pid, scale_cuda, hwaccel issues), build steps - docs/integrations/cctv-cpp.md — C++ pattern: IFrameSource interface + CuframesSource skeleton + CMake setup + runtime requirements - examples/frigate-compose/ — reference compose stack (cuframes-pub + Frigate) с config.yml stub, .env.example, README - examples/python-consumer/ — ctypes-based skeleton для AI/ML pipeline'ов (до v0.3 native pybind11 bindings) - docs/integration.md — превратился в index-страницу, ссылается на specific guides Reorganization упрощает onboarding: пользователь выбирает guide по типу integration'а (Frigate/C++/Python/FFmpeg) и сразу видит реальный code. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
examples/python-consumer
Reference Python consumer для cuframes через ctypes wrapper.
Use case
AI/ML pipeline (PyTorch / ONNX / TensorRT) которому нужны декодированные кадры с камер. Без cuframes — каждый Python скрипт открывает RTSP + decode сам. С cuframes — подписывается на готовые NV12 frames от publisher'а.
Запуск
# Publisher должен быть запущен (см. tools/cuframes-rtsp-source или Docker image)
cuframes-rtsp-source --rtsp rtsp://admin:pw@cam-ip:554/... --key cam-parking &
# Consumer (same host, либо same docker namespace — см. требования ниже)
python3 cuframes_consumer.py --key cam-parking --max-frames 100
Ожидаемый output:
[consumer] connected to 'cam-parking'
[consumer] first frame: 640x480 NV12, pitch_y=640, pitch_uv=640, cuda_ptr=0x...
[consumer] received=25 seq=42 pts_ms=...
...
=== RESULT ===
received: 100 / 100
elapsed: 3.96s
avg_fps: 25.03
Что этот пример НЕ делает
-
НЕ копирует GPU NV12 frame на host —
cuda_ptrэто raw CUDA device pointer. Для реальной работы нужно:pycuda/cupy/cuda-pythonбиблиотека для CUDA memcpy- либо передать
cuda_ptrнапрямую в GPU-aware ML framework (PyTorch'storch.cuda.IntTensor.from_dlpacketc.)
-
НЕ конвертирует NV12 → RGB. Используй
cv2.cvtColor(nv12, cv2.COLOR_YUV2RGB_NV12)на host или GPU-side conversion. -
НЕ обрабатывает inference — это skeleton, в твоём pipeline replace comment-block
### ВАШ ML PIPELINE ЗДЕСЬ ###с актуальным кодом.
Требования
| Значение | |
|---|---|
| Python | 3.8+ |
libcuframes.so.0 |
в LD_LIBRARY_PATH (либо /usr/local/lib) |
| Publisher running | да, с matching --key |
| Same IPC namespace | да (host либо ipc:container:<publisher> в docker) |
| Same PID namespace | да (host либо pid:container:<publisher> в docker) |
| NVIDIA GPU + driver | для access cuda_ptr (read-only frame от publisher'а) |
Docker-style
# В compose рядом с publisher service
ai-pipeline:
image: your-ai-image:cuda
runtime: nvidia
ipc: "container:cuframes-pub-parking"
pid: "container:cuframes-pub-parking"
volumes:
- cuframes_sock:/run/cuframes:ro
environment:
LD_LIBRARY_PATH: /usr/local/lib
command: python3 /app/cuframes_consumer.py --key cam-parking --max-frames 1000000
v0.3 → first-class pybind11 bindings
Текущий ctypes pattern будет заменён на native pybind11 bindings в v0.3 cuframes
(ROADMAP.md). Тогда API будет более pythonic + zero-copy через
__cuda_array_interface__ / dlpack.