One container per channel. Built like capture/build-with-decklink: NDI + DeckLink SDKs fetched at build, runs --privileged with Xvfb for the GL context where no real display is present. Components: - entrypoint.sh: Xvfb + CasparCG launch, creates /media/live/<CHANNEL_ID> - src/amcp.js: TCP AMCP client - src/playout-manager.js: channel lifecycle, playlist walk via LOADBG AUTO for gapless transitions; primary consumer (decklink/ndi/srt/rtmp) plus a second FFMPEG HLS consumer (~600 kbps, 2s segments) for the UI preview - src/index.js: HTTP shim — /channel/start, /playlist/load, transport - frame-rate helper picks fps from video_format (59.94 → 60000/1001) so SEEK / LENGTH frame math is correct
29 lines
869 B
XML
29 lines
869 B
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<configuration>
|
|
<paths>
|
|
<media-path>/media/</media-path>
|
|
<log-path>/opt/casparcg/log/</log-path>
|
|
<data-path>/opt/casparcg/data/</data-path>
|
|
<template-path>/media/templates/</template-path>
|
|
</paths>
|
|
|
|
<!-- Single logical channel. The output consumer (DeckLink / NDI / SRT / RTMP)
|
|
is added at runtime over AMCP by the Node shim (playout-manager.js), so no
|
|
static consumer is declared here. A screen consumer is intentionally
|
|
omitted — this is a headless server. -->
|
|
<channels>
|
|
<channel>
|
|
<video-mode>1080i5994</video-mode>
|
|
<consumers>
|
|
</consumers>
|
|
</channel>
|
|
</channels>
|
|
|
|
<controllers>
|
|
<!-- AMCP over TCP — the Node shim connects here. -->
|
|
<tcp>
|
|
<port>5250</port>
|
|
<protocol>AMCP</protocol>
|
|
</tcp>
|
|
</controllers>
|
|
</configuration>
|