Skip to content
Console

Wiring & DAG

AVFlow builds a directed acyclic graph (DAG) from each component’s inputs array.

  1. Sources have no inputs — they produce media.
  2. Nodes consume one or more upstream components and produce processed media.
  3. Sinks consume upstream components and write output (stream, file, room, etc.).
  4. Every inputs entry must reference an existing component by name.
  5. The graph must be acyclic.

Components exchange video, audio, and optionally captions (from ASR). AVFlow infers which streams to pass when you connect components — you rarely need manual split nodes.

Use select to filter by participant identity, track type, or media type. On RTC sources it lives inside config; on nodes and sinks it is a top-level field.

A relay has no processing nodes: the source connects straight to the sink. This works for pull sources (rtmp_pull, whep_pull, srt_pull, file_pull) and 1:1 sinks such as rtmp_push.

rtmp_pull ──► rtmp_push

RTC room sources (livekit, jitsi, daily, agora) are multi-stream (1:n) and need a mixvideo_mixer and audio_mixer — before rtmp_push or similar 1:1 sinks, even for a single participant.

Same mix pattern as above, often with a segment sink:

livekit ──► video_mixer ──► rtmp_push
└──► audio_mixer ──┘

Wire the ASR node into sinks that support subtitles (segment, rtmp_push, RTC sinks, etc.).

livekit ──► audio_mixer ──► segment
└──► asr ──────────┘

Jobs are rejected at submit time if:

  • A 1:1 RTC sink (e.g. rtmp_push) is wired directly to a multi-participant RTC source without a mixer
  • segment is connected directly to a multi-track RTC source (use mixers first)
  • Input limits are exceeded

Fix the topology and resubmit — AVFlow does not partially run invalid graphs.