En journalist med en iPhone skal kunne gå live i en tv-produktion på under et minut, med stabilt billede, returlyd og talkback, og uden at nogen i afviklingen skal route signaler i hånden. Det er opgaven for min mobil-hub. Her gennemgår jeg, hvordan den er bygget: fra bonding af mobilnet over routing til lydmotoren, der giver hver journalist sin egen retur.
Problemet er nettet, ikke kameraet
En moderne telefon filmer rigeligt godt til nyheder og live. Det svage led er forbindelsen. Én 5G-forbindelse kan gå fra fin til ubrugelig på få sekunder, når tusind mennesker omkring dig sender video på samme netværk. Professionelle bonding-sendere løser det, men det er dyrt udstyr med abonnementer, og der er sjældent nok til alle. Samtidig har afviklingen brug for mere end et billede: et fast input i billedmixeren, returlyd (IFB), talkback, beskeder og tally.
SRT: video, der retter sine egne fejl
SRT (Secure Reliable Transport) er en protokol til at sende video over internettet. Den sender hurtigt, men holder samtidig styr på hver eneste datapakke. Forsvinder en pakke på vejen, beder modtageren om at få den igen.
For at have tid til det venter modtageren et kort øjeblik, før billedet vises. Det kaldes delay. Jo dårligere forbindelsen er, jo længere skal man vente for at være sikker på at få alle pakkerne med. Mobil-hub'en bruger tre forskellige værdier:
| Forbindelse | Delay | Hvorfor |
|---|---|---|
| Telefon → hub (billede) | 2000 ms | Mobilnet taber pakker og svinger meget |
| Hub → telefon (returlyd) | 400 ms | Kun lyd, og kort delay giver en mere naturlig samtale |
| Hub → vMix | 200 ms | Lokalt netværk uden tab |
SRTLA: én SRT-strøm over flere forbindelser
SRTLA (SRT Link Aggregation) kommer fra open source-projektet BELABOX. Telefonen sender over flere forbindelser på én gang, fx 5G og WiFi, et USB-netkort eller en ekstra telefon via Moblink. Datapakkerne fordeles på de forbindelser, der leverer bedst lige nu: en forbindelse får mere at sende, når den kører stabilt, og mindre, når den taber pakker. På serveren samler srtla_rec pakkerne igen til én almindelig SRT-strøm.
Resultatet er, at én dårlig forbindelse ikke tager billedet med sig ned. Moblin viser svartiden for hver forbindelse, og hub'en læser den med, så produceren kan se, hvilken forbindelse der halter.

Arkitekturen
Mobil-hub'en kører på én Linux-server med Docker og består af tre tjenester:
- srtla_rec tager imod telefonernes forbindelser og samler dem til én SRT-strøm.
- MediaMTX er routeren. Den modtager billederne, sender dem videre til vMix og optager hver telefon for sig.
- Hub'en er skrevet i Python. Den laver returlyden, henter tally fra vMix, fjernstyrer telefonerne og leverer dashboardet til produceren.
Billede og lyd ud
Returlyd tilbage
Tjenesterne kører direkte på serverens netværk i stedet for bag Dockers interne netværk. Video og lyd sendes over UDP, og et ekstra netværkslag imellem ville både give mere forsinkelse og gøre portopsætningen besværlig.
Videoen bliver aldrig komprimeret om. Den sendes uændret gennem MediaMTX til vMix, så billedkvaliteten er præcis den, telefonen sender. Det er kun lyden, hub'en arbejder med, og derfor kan en lille server med 2 processorkerner klare 8 telefoner på én gang.
| Port | Protokol | Bruges til |
|---|---|---|
5000 | UDP | Bonding fra telefonerne (SRTLA) |
8890 | UDP | SRT til vMix, hardware-sendere og returlyd |
8189 | UDP | WebRTC: preview, talkback og retur-side |
8080 | TCP | Join-side, retur-side og fjernstyring af Moblin |
8443 | TCP | Dashboard over HTTPS, som browserens mikrofon kræver |
Faste slots: ingen routing i afviklingen
Hvert slot har et nummer, som går igen hele vejen: telefonen på slot 3 sender til slot3 i hub'en, vMix-inputtet "HUB 3" henter slot3, og returlyden til telefonen hedder ifb3. Nedenfor kan du se præcis, hvad der sker:
# telefonen sender sit billede (bonded)
srtla://hub:5000?streamid=publish:slot3:<bruger>:<kode>
# vMix-inputtet "HUB 3" henter billedet
srt://hub:8890?streamid=read:slot3:<bruger>:<kode>
# vMix sender programlyden (Bus A) til hub'en
srt://hub:8890?streamid=publish:program:<bruger>:<kode>
# telefonen henter sin egen returlyd
srt://hub:8890?streamid=read:ifb3:<bruger>:<kode>&latency=400
Hver telefon optages samtidig for sig i blokke af 15 minutter, så materialet kan bruges bagefter, også det, der ikke kom i luften. Optagelserne slettes automatisk efter 7 dage.

Journalistens flow: ét link
Journalisten scanner en QR-kode, skriver sit navn og vælger et ledigt slot, som derefter er reserveret. Knappen "Åbn i Moblin" er et deep link, der sætter hele appen op på én gang: adressen, bonding, 1080p25 med 6 Mbit/s og fire færdige delay-profiler (1, 2, 3 og 5 sekunder). Samtidig kobles Moblins fjernstyring til hub'en.

Til hardware-sendere som LiveU Solo og Haivision, eller appen Larix, laver hub'en en almindelig SRT-adresse til samme slot.
Returlyden: mix-minus
Får journalisten hele programlyden tilbage, hører de sig selv 1–2 sekunder forsinket, og så kan man ikke tale. Løsningen hedder mix-minus eller N-1: hver telefon får sin egen returlyd, hvor dens egen lyd er trukket fra. Det er hub'ens vigtigste opgave, og den sker i fire trin, 50 gange i sekundet:
- Hent lyden. Programlyden fra vMix, lyden fra hver telefon og producerens talkback hentes ind og pakkes ud til rå lyd.
- Udjævn. Lyden lægges i en lille buffer, så ujævn levering fra mobilnettet ikke kan høres.
- Mix. Til hver telefon lægges programlyden sammen med de andre telefoner, minus telefonens egen lyd, og eventuelt producerens talkback.
- Send tilbage. Returen komprimeres som Opus, der er lavet til tale med lav forsinkelse, og sendes tilbage til telefonen.
Selve mixet er få linjer:
alle = summen af lyden fra alle telefoner
for hver telefon n:
retur = programlyd
if "hør andre felter": retur += alle − telefon[n] # N-1
if producer taler til n: retur = retur · −12 dB + talkback
send(begræns(retur))
Til sidst sørger en limiter for, at lyden aldrig forvrænger, selv når flere taler på én gang. Falder en telefon ud, bliver dens lyd bare til stilhed, og de andre returer kører videre uden afbrydelse.
Bufferen tilpasser sig selv
Lyd fra telefoner over mobilnet kommer ikke jævnt, men i små klumper. Er bufferen for lille, opstår der huller. Er den for stor, kommer der unødig forsinkelse. Derfor starter den på 60 ms, vokser, hvis der opstår huller (op til 500 ms), og skrumper igen, når forbindelsen er stabil. Journalisten får dermed så lidt forsinkelse som muligt uden udfald.
Den egne lyd ligger mindst 80 dB under i egen retur, så den kan reelt ikke høres. Talkback dæmper programmet præcis −12 dB uden at påvirke de andre telefoner. Hub'en lægger kun 60–90 ms til returlyden.
Tally fra vMix
Hub'en spørger vMix fire gange i sekundet, hvad der er på. Inputs kobles til slots via titlen, fx "HUB 3". Er inputtet i program eller i et overlay, der er on air, er telefonen ON AIR, og er det i preview, er den PREVIEW. Tally ryddes først efter tre fejlede svar i træk, så et enkelt tabt svar ikke får lampen til at blinke. På journalistens retur-side bliver skærmen rød ved ON AIR og grøn ved PREVIEW.
Delay skiftes fra afviklingen
SRT aftaler sit delay, når forbindelsen starter, og det kan ikke ændres undervejs. Det gælder også dyre hardware-sendere. Mobil-hub'en løser det ved at fjernstyre telefonen:
- Moblin forbinder selv til hub'en og logger ind med en kode. Hub'en kan derefter se telefonens indstillinger og de fire delay-profiler.
- Vælger produceren fx 3 sekunder, stopper hub'en streamen, skifter til profilen og starter igen.
Dashboardet viser det delay, forbindelsen faktisk kører med, og om pakker kommer for sent. Så kan man se, hvornår der skal skrues op. Et skift giver et kort udfald: ca. 4 sekunder til 1 s delay og ca. 8 sekunder til 5 s. Som tommelfingerregel bruges 1 s til dialog på god dækning, 2 s som standard og 3–5 s i menneskemængder, i tog og ved dårlig dækning.
Afviklingen

Produceren styrer det hele fra et dashboard i browseren. Hvert slot viser bitrate, lydbuffer og niveaumålere for lyden ind og retur. Billed-preview og producerens talkback kører direkte i browseren via WebRTC. Talkback kan gå til ét slot eller alle, også med tasterne 1–9 og mellemrum. Beskeder til journalisten vises på retur-siden, og telefonen vibrerer.
Forsinkelse hele vejen rundt
- Billede til vMix: ca. 2 sekunder, styret af delay på telefonens forbindelse.
- Returlyd via Moblin Talkback: typisk 0,8–1,5 sekunder i alt.
- Returlyd via retur-siden (WebRTC): markant lavere, så den er bedst til dialog med værten.
- Hub'ens eget bidrag: 60–90 ms til returlyden.
Bygget med hjælp fra AI
Mobil-hub'en er bygget med hjælp fra AI. Idéen, kravene og testene kommer fra mit arbejde med tv-produktion: hvad en journalist i felten har brug for, og hvad afviklingen skal kunne. AI har hjulpet mig med at skrive og gennemgå koden, fra lydmotoren til dashboardet, så jeg kunne komme fra idé til en fungerende løsning langt hurtigere end alene. Det er også sådan, jeg arbejder med custom løsninger til kunder: jeg kender problemet og tager beslutningerne, og AI gør mig hurtigere.
Status og næste skridt
Mobil-hub'en kører i test med Moblin på iPhone som sender. Bonding, slots, mix-minus, talkback og delay-skift virker, og billedet er hentet ud i OBS som almindelig SRT-kilde. Næste skridt er en rigtig produktion med vMix, hvor tally og programlyd kobles på.
