Web GUI for Deltacast SDI capture card recording — FFmpeg-based multi-port recorder with ProRes/DNxHD/H264 codecs, SRT streaming, SCTE35/104 ad marker injection, and HLS preview
- frontend types & components now use lowercase codec values (prores/dnxhd/
h264/uncompressed) to match backend CodecType enum. This was the real
cause of the silent Start Recording 422.
- recorder.py: replaced last .done() call on asyncio.subprocess.Process
with returncode-is-None check (same bug previously fixed in hls.py).
This was causing /api/ports/{n} to 500 during active recording and
health checks to fail while any port was running.
- useRecorder now parses pydantic 422 error bodies so field-level detail
reaches the UI, and App.tsx shows a fixed error banner.
- Added docker-compose.truenas.yml: no deltacast device passthrough,
frontend on :8088. Lavfi testsrc2 fallback kicks in automatically and
feeds the full HLS preview + recording pipeline with a test signal
(1080p30 + 1kHz tone). Verified end-to-end on Wooglin: 442MB/1:56s
H.264 MP4 + working HLS playlist.
|
||
|---|---|---|
| backend | ||
| frontend | ||
| .gitignore | ||
| docker-compose.truenas.yml | ||
| docker-compose.yml | ||
| README.md | ||
Deltacast SDI Recorder
Web-based recording suite for Deltacast SDI capture cards. Multi-port recorder with real-time preview, SRT streaming, and SCTE35/104 ad marker injection.
Features
- Multi-port recording — Independent recorders for up to 4 SDI ports
- Codec support — ProRes, DNxHD, H.264, Uncompressed (MXF output)
- SRT streaming — Simultaneous file recording + SRT stream output
- SCTE35/104 ad markers — Binary cue injection + webhook triggering
- Live preview — Low-latency HLS preview per port (5s latency)
- Web GUI — React 18 + TypeScript frontend with real-time status
Requirements
- Deltacast SDI capture card(s) with VideoMaster SDK and FFmpeg plugin installed
- Docker + Docker Compose
- Devices:
/dev/deltacast0through/dev/deltacast3
Quick Start
git clone https://forge.wilddragon.net/zgaetano/deltacast-sdi-recorder
cd deltacast-sdi-recorder
docker compose up -d
Access the GUI at: http://localhost
Configuration
Copy and edit the backend environment file:
cp backend/.env.example backend/.env
Key variables:
| Variable | Default | Description |
|---|---|---|
DELTACAST_PORT_COUNT |
4 |
Number of SDI ports |
RECORDING_DIR |
/recordings |
Output directory |
SRT_LATENCY |
5000 |
SRT latency in ms |
LOG_LEVEL |
INFO |
Logging verbosity |
Architecture
┌─────────────────────────────────────────────┐
│ Browser (React GUI) │
│ - Port status cards (real-time via WS) │
│ - HLS video preview per port │
│ - SCTE35 ad break injection │
│ - Per-port codec/destination config │
└──────────────┬──────────────────────────────┘
│ HTTP/WebSocket (Nginx proxy)
┌──────────────▼──────────────────────────────┐
│ FastAPI Backend │
│ ├── RecorderManager (4x PortRecorder) │
│ │ └── FFmpeg subprocess per port │
│ ├── SCTE35Manager (binary + webhook) │
│ ├── HLSPreviewManager (HLS transcode) │
│ └── SRTStreamer (independent SRT output) │
└──────────────┬──────────────────────────────┘
│ deltacast:// device
┌──────────────▼──────────────────────────────┐
│ Deltacast SDI Card (VideoMaster SDK) │
│ Ports 0-3 → FFmpeg Deltacast plugin │
└─────────────────────────────────────────────┘
Development
# Backend (Python)
cd backend
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reload
# Frontend (Node)
cd frontend
npm install
npm run dev
Run backend tests:
cd backend
pytest tests/ -v