Ga naar inhoud

On-demand streaming

Op deze apparaten is geheugen de beperkende factor, niet de CPU. Elke draaiende zender houdt een decoder of demultiplexer, buffers en een socket vast, en die kosten worden betaald of er nu een televisie luistert of niet. In een hotel met honderd kamers en veertig zenders is het aantal verschillende zenders waarnaar om drie uur ‘s nachts wordt gekeken meestal twee of drie.

Alleen laten draaien wat bekeken wordt, maakt van inactieve zenders weer ruimte. Het verlaagt ook de belasting van de uplink, omdat een zender die niet draait geen segmenten van de originserver ophaalt.

Wanneer een televisie afstemt op een multicastzender, meldt ze zich aan met een IGMP membership report, en wanneer ze wegzapt, stuurt ze een leave. Die berichten zijn het enige betrouwbare bewijs dat iemand kijkt, omdat niets verderop in de keten op een andere manier iets terugmeldt aan het apparaat. Castmux bewaakt daarom het IGMP-verkeer op de interface die naar de televisies wijst.

Dat gebeurt met pakketcapture in promiscuous mode, via libpcap. Die keuze is niet willekeurig en het loont om haar te begrijpen, want het voor de hand liggende alternatief — een raw IPPROTO_IGMP-socket — werkt helemaal niet.

Waarom een raw IGMP-socket andere hosts niet kan zien

Section titled “Waarom een raw IGMP-socket andere hosts niet kan zien”

Membership-verkeer is niet aan deze machine geadresseerd. Het is geadresseerd aan multicastgroepen waarbij deze machine zich doorgaans niet heeft aangemeld:

BerichtBestemmingGevolg
IGMPv3-report224.0.0.22De all-routers-v3-groep. Een kopstation is geen router en heeft geen reden om zich daarbij aan te melden.
IGMPv2-leave224.0.0.2De all-routers-groep. Hetzelfde probleem.
IGMPv2-reportde groep waarbij wordt aangemeldGeadresseerd aan bijvoorbeeld 239.10.0.1 — een groep waarbij de afzender zich aanmeldt en waar het apparaat alleen ooit naartoe verzendt.

Linux gooit multicast voor een groep waarbij de host zich niet heeft aangemeld weg in het invoerrouteringspad, vóór aflevering aan welke socket dan ook. Een raw socket is een afleverpunt; het pakket is allang verdwenen voordat het daar aankomt. Geen enkele socketoptie verandert dit. De socket opent zonder fouten, het lezen blokkeert eeuwig, en de resulterende bug ziet eruit als “er kijkt nooit iemand” in plaats van als een foutmelding.

Pakketcapture zit onder die controle, op het punt waar frames binnenkomen, en ziet het verkeer dus ongeacht waarbij de host zich heeft aangemeld. Daarom heeft Castmux de capability nodig om raw pakketten te capturen en draait de container met host networking — zie Installatie.

Alleen de bestemmingsgroepen die op uw zenders zijn ingesteld, worden gevolgd. Het netwerk van een gebouw draagt veel ongerelateerde multicast — mDNS-servicediscovery, SSDP van printers en smart-tv’s, gebabbel van routeringsprotocollen — en niets daarvan telt als kijker. Membership voor een groep die Castmux niet bedient, wordt genegeerd.

Castmux onderscheidt ook zijn eigen verkeer van dat van een kijker. Naar een groep verzenden is er niet naar kijken; een zender houdt zichzelf niet in leven.

Een client stuurt ongevraagd een report wanneer hij zich aanmeldt en zegt daarna niets meer tot iets hem ernaar vraagt. Op een goed gerouteerd netwerk vraagt de IGMP-querier — normaal de router — dat periodiek, en kan elke luisteraar de membership-tabel uit de antwoorden reconstrueren.

De segmenten waarop deze apparaten staan, hebben meestal geen querier. Er is geen router op het televisie-VLAN, de switches doen hooguit snooping, en niets verstuurt general queries. In die situatie hoort een luisteraar alleen van een aanmelding op het moment dat die plaatsvindt. Herstart Castmux, of installeer het in een gebouw waar televisies al zijn afgestemd, en het kent niemand: elke bestaande kijker is onzichtbaar tot hij van zender wisselt.

Castmux verstuurt daarom zelf IGMP general queries, standaard elke 30 seconden, en bouwt de membership-tabel op uit de antwoorden. Daardoor blijft de kijkerstatus een herstart overleven en klopt het aantal kijkers binnen één query-interval na het opstarten, in plaats van ergens later.

Drie timers bepalen het gedrag. De standaardwaarden passen bij een park settopboxen op een rustig segment; de reden om er een te wijzigen is een concreet waargenomen symptoom, niet netheid.

TimerStandaardWat hij regelt
Grace90 sHoe lang een bekende kijker stil mag blijven voordat hij als vertrokken wordt beschouwd. Dit moet ruim boven het query-interval liggen, zodat één verloren query of één verloren antwoord geen televisie verwijdert die nog kijkt. Verhoog het als u kijkers op een segment met verlies ziet verschijnen en verdwijnen.
Linger30 sHoe lang een zender blijft draaien nadat de laatste kijker is vertrokken. Zappen is het normale geval: een gast bladert in twintig seconden door zes zenders en komt terug. Linger maakt die terugkeer direct, in plaats van telkens een nieuwe koude start te betalen.
Query-interval30 sHoe vaak Castmux een general query verstuurt wanneer actief bevragen is ingeschakeld. Korter betekent sneller herstel van de membership-tabel en meer verkeer; langer het omgekeerde. Wijzig grace mee, niet los daarvan.

Een koude start is de tijd tussen het binnenkomen van de join en het eerste pakket dat naar de televisie vertrekt. Gemeten op het apparaat is dat ongeveer 1.9 seconden op de pass-through-engine en ongeveer 4.4 seconden op de remux-engine. Zie Streaming-engines voor de reden van het verschil.

Eén keer is geen van beide waarden bezwaarlijk. Zes keer in twintig seconden betaald door iemand die door de zenderlijst bladert, is het het verschil tussen een televisie die aanvoelt als een televisie en een die kapot lijkt. Dat is het hele argument voor de linger-timer, en daarom is de standaardwaarde niet nul.

Kan pakketcapture niet starten — de capability ontbreekt, de interface is verkeerd, de bibliotheek is niet beschikbaar — dan blijft Castmux elke zender streamen in plaats van te concluderen dat niemand kijkt.

Het gedrag is instelbaar, omdat er installaties zijn waar een beheerder echt liever heeft dat een zender stopt dan dat hij onbewaakt doordraait. De standaard is fail open, en zo hoort het te blijven tenzij u een concrete reden hebt om het anders te doen.

Wanneer de detectie verstoord is, markeert Castmux zichzelf als degraded en meldt dat in de interface. Dat is belangrijker dan het klinkt: zonder die melding is “0 viewers” dubbelzinnig tussen “er kijkt niemand” en “ik kan het niet zien”, en een beheerder leest elke keer de eerste betekenis. Een degraded-indicator maakt van een stil fout antwoord een zichtbaar onbekend.

force-always-on laat één zender continu draaien, ongeacht het aantal kijkers. Gebruik het wanneer de afnemer van de stream niet iets is dat zich bij een groep kan aanmelden:

  • Een zender die een DVB-C-multiplex voedt. De multiplexer neemt de stream continu af en verstuurt namens hem geen membership reports. Een on-demand-zender in een multiplex is een gat in de draaggolf. Zie DVB-C-multiplexing.
  • Een lobby- of signagescherm achter een apparaat dat IGMP niet goed afhandelt, of dat nooit een opstartvertraging mag tonen.
  • Tijdens de oplevering. Tijdens de installatie wilt u de stream op de lijn hebben zodat u hem kunt meten, voordat kijkerdetectie een variabele in de diagnose wordt. Schakel het weer uit als u klaar bent.

Een geforceerde zender wordt in de interface als geforceerd getoond, zodat duidelijk is dat zijn draaistatus een instructie is en geen meting.

Het openen van de preview in de webinterface telt als kijker voor die zender, dus een on-demand-zender start wanneer u hem bekijkt in de preview en blijft draaien zolang de preview open is. Zonder dit zou een preview van een inactieve zender niets tonen en zou een preview van een live zender die per ongeluk in leven houden — beide verwarrend. Na het sluiten van de preview loopt de normale linger-timer.

On-demand is geen gratis complexiteit, en er zijn twee gevallen waarin het niets oplevert:

  • Een kleine zenderlijst die altijd aan staat, op een box met geheugen over. Passen acht zenders ruim en wordt er het grootste deel van de dag naar alle acht gekeken, dan voegt on-demand een opstartvertraging toe bij de eerste keer afstemmen ‘s ochtends en bespaart het niets wat u nodig had. Laat ze altijd aan staan.
  • Een segment waarop u geen verkeer kunt capturen. Kan het apparaat het IGMP-verkeer van de televisies niet zien — omdat het niet op hun layer 2-segment zit, of omdat de installatie promiscuous capture verbiedt — dan heeft kijkerdetectie niets om mee te werken. Het valt dan terug op fail open en streamt toch alles, maar u moet het expliciet uitschakelen in plaats van een permanente degraded-indicator te laten staan, want die leert beheerders waarschuwingen te negeren.

Overal elders is het geheugen dat het vrijmaakt de reden dat het aantal zenders op deze apparaten is wat het is.