Files
cuframes-composer/docker/Dockerfile
T
gx fa6ab3069a Phase 7 audio mixing — attempt + rollback + lessons
Несколько сессий попыток реализовать audio mixing в композитор'е.
Не достигнуто sub-секундной latency со стабильным video+audio.
Откатано на parallel mode (cfc-grid video-only, live от pipeline с audio).

Полный набор выводов и pitfall'ов — docs/LESSONS-audio-mixing-attempts.md.

Главные lesson'ы для будущей попытки:
- mpegts mux libavformat авто-инсёртит h264_mp4toannexb BSF которому
  не нравится Annex-B + inline SPS/PPS — NVENC OUTPUT_SPSPPS per-frame ломает
- SPSC ring drop newest при full, не oldest (consumer's domain)
- av_new_packet (не av_malloc) для av_interleaved_write_frame ownership
- Monotonic PTS на counter (frame_idx, total_samples) — не wallclock
- mediamtx env-var path names не должны иметь '-' (parser limitation)
- Default mediamtx ReadTimeout=10s короткий для burst write'ов

Изменения в repo сохранены для будущей доработки:
- src/writer.c — mpegts backend с audio stream support
- src/audio.c — RTSP AAC consumer + lock-free SPSC ring
- include/cuframes_composer/{writer,audio}.h — public API
- examples/grid_record.c — --format=mpegts + --audio-source flags
- include/cuframes_composer/composer.h — consumer_prefix field
- docker/Dockerfile — libavformat-dev добавлен в builder/runtime

cfc-grid composer стабильно работает на видео (substantially лучше
монолитного pipeline'а с audio bag'ом). TV рекомендуется использовать
rtsp://...:554/cfc-grid + опционально rtsp://...:554/live-audio
parallel.
2026-06-03 14:29:56 +01:00

89 lines
4.6 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cuframes-composer — production Docker image.
#
# Multi-stage:
# 1) builder: nvidia/cuda CUDA-toolkit + build deps + cmake build
# 2) runtime: nvidia/cuda base (минимум: libcudart) + runtime deps + бинарь
#
# Размер runtime image: ~250 MB (cuda runtime + apt-deps). Build image: ~5 GB.
#
# Использование:
# docker build -t gx/cuframes-composer:0.1 -f docker/Dockerfile .
# docker run --gpus all --network=cctv --ipc=container:cuframes-ipc-anchor \
# -v cctv_cuframes_sock:/run/cuframes:ro \
# -v cuda_grid_icons:/icons:ro \
# -v /usr/share/fonts/truetype/dejavu:/fonts:ro \
# -p 5599:5599 \
# gx/cuframes-composer:0.1 grid_record --out - --control tcp://0.0.0.0:5599 ...
#
# Лицензия: LGPL-2.1+
# ── Builder ──────────────────────────────────────────────────────────────
# CUDA 12 (не 13) — нужен для sm_61 (Pascal GTX 1050) в production.
# CUDA 13 deprecated Pascal. Ubuntu 22.04 jammy glibc 2.35 forward-compat
# на хосте 24.04 noble (glibc 2.39).
FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential cmake git pkg-config \
libpng-dev libfreetype-dev \
libzmq3-dev libjson-c-dev libmosquitto-dev \
libavformat-dev libavcodec-dev libavutil-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /src
COPY . .
RUN git submodule update --init --recursive || true
# CUDA architectures: production targets compiled to real binary,
# а sm_89-virtual генерит PTX для forward JIT на newer GPU (Blackwell sm_120
# = JIT на старте при первом kernel'е). Это избавляет нас от требования
# CUDA 12.8+ который sm_120 native. CUDA 12.4 здесь — sweet spot между
# Pascal (sm_61) и Ada (sm_89).
RUN mkdir -p build && cd build && \
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_ARCHITECTURES="61-real;75-real;86-real;89-real;89-virtual" \
.. && \
make -j$(nproc)
# ── Runtime ──────────────────────────────────────────────────────────────
# runtime variant включает libcudart12 (нужен grid_record/simple_record).
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS runtime
# Ubuntu 22.04 jammy: package names иные чем noble (libpng16-16 без t64).
# libcudart12 уже в runtime image; здесь только наши user-space deps.
# netcat-openbsd — для healthcheck'а через ZMQ ping (см. HEALTHCHECK ниже).
# ffmpeg — для transmux raw h264 → mpegts (shell pipe chain после
# grid_record); без него ffmpeg-mux downstream не справляется с
# intra refresh без IDR boundaries.
RUN apt-get update && apt-get install -y --no-install-recommends \
libpng16-16 libfreetype6 \
libzmq5 libjson-c5 libmosquitto1 \
libavformat58 libavcodec58 libavutil56 \
fonts-dejavu-core \
netcat-openbsd \
&& rm -rf /var/lib/apt/lists/*
# Бинари + libcuframes (статически слинкована не вся, libcuframes shared нужен).
COPY --from=builder /src/build/examples/grid_record /usr/local/bin/grid_record
COPY --from=builder /src/build/examples/simple_record /usr/local/bin/simple_record
COPY --from=builder /src/build/third_party/cuframes/libcuframes/libcuframes.so.0.4.0 \
/usr/lib/x86_64-linux-gnu/libcuframes.so.0
COPY --from=builder /src/build/src/libcuframes_composer.so.0.1.0 \
/usr/lib/x86_64-linux-gnu/libcuframes_composer.so.0
# NVIDIA_DRIVER_CAPABILITIES должен включать 'video' для NVENC через libnvidia-encode.
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
# Healthcheck — проверяет что ZMQ control plane port слушается.
# Полная functional проверка через ZMQ ping требует ZMTP handshake (plain nc
# не подходит — это binary wire protocol с greeting), поэтому здесь только
# liveness через TCP probe. Composer thread'ы (compose/encode) могут зависнуть
# без падения main process'а, но external monitor (MQTT health uptime_s,
# Prometheus в Phase 7) дополнит контроль over time.
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD nc -z 127.0.0.1 5599 || exit 1
ENTRYPOINT ["/usr/local/bin/grid_record"]
CMD ["--help"]