×

⊳ Muxer

MPTS · TSDuck · PSI/SI

Πολλαπλασιαστής MPTS & Προσαρμοστικός Υβριδικός Statmux

Το Stream Manager mux συναρμολογεί πολλές ροές SPTS σε μία έξοδο CBR MPTS (DVB/IPTV). Το Adaptive Hybrid Statmux συνδυάζει πλήρωση πυρήνα CBR με κωδικοποιητές ισορροπημένους VBR για σταθερή έξοδο mux.

Αρχιτεκτονική κωδικοποιητή

Οι κωδικοποιητές κωδικοποιούν ήχο και βίντεο από πηγές. Οι κωδικοποιητές GStreamer χρησιμοποιούν hardware accelerators (NVIDIA NVENC, VAAPI).

Αρχιτεκτονική mux

Ο πολλαπλασιαστής συνδυάζει τα κωδικοποιημένα streams σε TS/PES/ES μορφή και εφαρμόζει πίνακες EIT/PF.

3. Στρώμα εξόδου (UDP)

Η μονάδα εξόδου στέλνει τον πολλαπλασιασμένο stream στη διεύθυνση multicast ή καταγράφει σε αρχείο.

Muxer προϋπολογισμός

Η κορυφή Mux bar δείχνει 3 αθροίσματα με κατάσταση χρώματος. Κανόνες:

Σ μέσο ≤ 85 % mux.bitrate — μέσο target sum σε όλα τα κανάλια συν ήχος. Αυτός είναι ο 'προϋπολογισμός' mux. Το 15 % στατιστικό reserve προστατεύει από peak coincidence. Πράσινο ≤ 85 %, κίτρινο ≤ 100 %, κόκκινο > 100 %.

Μέγιστο bitrate ροής.

Ελάχιστο bitrate ροής.

Παράδειγμα budget

Παράδειγμα: με 50Mbps σύνολο και 5 ροές, κάθε μία μπορεί να έχει έως 50Mbps.

Διάγνωση

Σε ≥ 10 συναγερμοί σε 60s ένα flash notification εμφανίζεται στο Mux UI συνιστώντας μείωση bitrate. Αυτόματη back-off ΔΕΝ είναι ενεργή — ο χειριστής αποφασίζει.

Monitor bitrate - παρακολουθεί το bitrate κάθε ροής σε πραγματικό χρόνο.

-P continuity — παρακολουθεί TS continuity counters. Καταγράφει μια προειδοποίηση σε κάθε drop (over-subscription, FFmpeg crash, NIC jitter).

-P pcrverify --jitter-max 500000 — Το DVB επιτρέπει PCR jitter ≤ 500 µs. Συναγερμός = pcradjust δεν μπορεί να ακολουθήσει ή πηγή έχει σπασμένα PCRs.

Muxer σφάλματα

Συμπτώση GOP

Απώλεια σήματος εισόδου — ένα κανάλι γίνεται μαύρο, mux συνεχίζει (χάρη στο -I null base). Διάρκεια ~3-8 s για FFmpeg επανεκκίνηση.

Oversubscription

PCR drift — STB stutter κάθε λίγα δευτερόλεπτα. Διόρθωση: pcradjust στη σωλήνωση (ήδη εκεί), παρατηρήστε pcrverify συναγερμούς.

VBV Underrun

Παράμετροι

Οι παράμετροι του mux περιλαμβάνουν PCR cadence, PMT PID, EIT settings, και output bitrate.

Muxer σύσταση

Το top-bar badge `📐 rec X.XM` δείχνει τη συνιστώμενη χωρητικότητα mux που προέρχεται από το κεντρικό όριο θεωρήματος. Το άθροισμα ανεξάρτητων ροών VBR προσεγγίζει κανονική κατανομή, άρα Mux = μ_total + z·σ_total + margin. Σ_i εκτιμάται από το VBR εύρος κάθε εισόδου ως (max−min)/4 (υποθέτοντας το εύρος καλύπτει ±2σ). Το margin = 10% του μ_total αντισταθμίζει κατάχρηση PSI/SI, jitter rate-control κωδικοποιητή, και συσχέτιση ροής που καθαρό CLT υποεκτιμά.

Χρώμα

Κάλυψη

σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 όταν Statmux είναι ON, διαφορετικά 1,0)

Προτεινόμενες ρυθμίσεις

Προτεινόμενες ρυθμίσεις

Muxer statmux

Εισαγωγή στο statmux.

Ικανότητα — πώς διαιρείται το bitrate

ASCII διάγραμμα χωρητικότητας.

Πρακτικό κέρδος (10 ροές × 3 Mbps μέσο, 4 Mbps μέγ)

Χωρίς Adaptive Hybrid Statmux πρέπει να διαστασιολογήσετε το mux για το χειρότερο περίπτωση Σ max. Με Adaptive Hybrid Statmux διαστασιολογείτε γύρω από Σ μέσο + ένα στατιστικό buffer (broadcast correlation ρ=0,15). Πραγματικό κέρδος ~5 Mbps σε 38 Mbps mux, ή +1 stream στο ίδιο cap.

CBR - σταθερό bitrate.

Statmux off.

Statmux on.

Mutex

Mutex - αποτρέπει ταυτόχρονες αλλαγές.

Pipeline

ASCII διάγραμμα pipeline.

Μέγεθος

Μέγεθος statmux.

Παράδειγμα μεγέθους.

Τύπος μεγέθους.

Συμβουλές

Τουλάχιστον 1 ισορροπημένη ροή — χωρίς μία ο δρομολογητής Adaptive Hybrid δεν έχει τίποτα να συνθλίψει κατά τις κορυφές, άρα κέρδος = 0

Μουσικά και ενημερωτικά κανάλια είναι τα καλύτερα υποψήφια — ανοχή >90% στη μείωση ρυθμού

Συμβουλή 3: Τα monitors bitrate είναι κρίσιμα.

Συμβουλή 4: Δοκιμάστε με πραγματικά streams.

Ροή εργασίας

Βήμα 1: Ρυθμίστε το mux.

Εναλλαγή Statmux στη κεφαλίδα mux (κίτρινο chip). Όταν ενεργοποιείται, όλοι οι κωδικοποιητές μεταγλωττίζονται σε VBR και επανεκκινούν

Βήμα 3: Εκκινήστε το statmux.

Βήμα 4: Παρακολουθήστε.

Statmux

The mux runs on a native C NIF (single-host, replaced the old gst_mux.py). Each channel has its own CBR encoder; the NIF demultiplexes them, statistically allocates bitrate by scene complexity, pads with NULL packets to a fixed wire cap, and emits one MPTS UDP multicast. This help describes the current UI: chart, headroom slider, diff gauge, channel cards.

Κλάση: statmux κλειστού βρόχου ανάδρασης με πρόβλεψη C1 (τροφοδότηση προς τα εμπρός) σε encoders VBR — αρχή broadcast statmux, οδηγούμενη από πολυπλοκότητα πηγής.

Αρχιτεκτονική & ροή δεδομένων

Architecture diagram

UDP multicast SSM, ανά κανάλι

Κωδικοποιητής

πολυπλοκότητα πηγής

Κύκλος

ιδία γραμμή / stream

Κατανεμητής

Παροχή

πλήρωση null → CBR

CBR καλώδιο στο cap

πρόβλεψη σύνθετης σκηνής πριν την πτώση

μετρημένο καλώδιο — βαθμονόμηση

στόχος bitrate

Κάθε κανάλι εκτελείται στη δική του γραμμή μέχρι το mux (ξεχωριστός encoder + σύνδεση loopback), όπου όλα συγχωνεύονται σε μία γραμμή MPTS multicast σε απολύτως σταθερό bitrate. Ο allocator είναι ο κεντρικός εγκέφαλος (1 GenServer ανά mux), tick ~0,85 δ.

Εγκέφαλος: ανάδραση + πρόβλεψη C1

Ο allocator συνδυάζει δύο σήματα — μια πρόβλεψη από την πολυπλοκότητα πηγής (προς τα εμπρός) και το μετρημένο καλώδιο (προς τα πίσω). Αυτό πλησιάζει τα statmux εκπομπής που γνωρίζουν το κόστος ενός frame πριν την κωδικοποίηση.

Το C1 μετρά την πολυπλοκότητα περιεχομένου στον αποκωδικοποιητή — που προηγείται της εξόδου του encoder κατά τη λανθάνουσα περίοδο του pipeline. Η σχετική αλλαγή πολυπλοκότητας (συσχέτιση r≈0.92 με bits) εφαρμόζεται στο στόχο bitrate ΚΑΙ ΣΤΙΣ ΔΥΟ ΚΑΤΕΥΘΥΝΣΕΙΣ ΠΡΙΝ ο encoder το παράγει: μια αυξανόμενη σκηνή προ-κατανέμεται (χωρίς πτώση), μια φθίνουσα απελευθερώνει bits νωρίς για τους άλλους.

Μετρημένο καλώδιο (ανάδραση)

Τα ακριβή bits ανά stream που εκπέμπονται από το mux (μετρητές από πλευρά αποστολέα) βαθμονομούν την αντιστοίχιση πολυπλοκότητας→bitrate και διατηρούν το άθροισμα ακριβώς στη δεξαμενή. Αναφορά αλήθειας εδάφους — η πρόβλεψη C1 δεν είναι τέλεια (r 0.92), η τελευταία τιμή καλωδίου την διορθώνει.

deliver_t

Η αξίωση ενός stream υποστηρίζεται από αυτό που παράγει πραγματικά ο encoder (× κεφαλαίο αιχμής). Ένα εύκολο κανάλι δεν μπορεί να αποθεματίσει εύρος ζώνης που δεν μπορεί να δαπανήσει — το ελευθερώνει για τους πεινασμένους.

Εξισορρόπηση ποιότητας

Ο στόχος δεν είναι ίσο bitrate αλλά ίση ποιότητα — η συνεχής πίεση μετακινεί bits από κανάλια υψηλής ποιότητας (χαμηλό QP) προς αυτά χαμηλής ποιότητας (υψηλό QP).

Προβλεπτική αναδιανομή

Όταν το C1 σηματοδοτεί πτώση καναλιού, το εύρος ζώνης του παραδίδεται στα άλλα στο ίδιο tick — ανεβαίνουν πριν η πτώση φτάσει στο καλώδιο.

Βάρος ανά κανάλι = complexity_q12 × max_bps (σκηνή δράσης + υψηλότερο max ⇒ περισσότερα bit).

Προϋπολογισμός ανά ροή = παγκόσμιος προϋπολογισμός × βάρος / Σβάρη, clamp [min_bps, max_bps], υπολογίζεται κάθε 10 ms.

×headroom % (slider) on the encoder target → Σ real encoder < wire cap ⇒ rings drain empty ⇒ clean video.

Stale-exclusion: a dead input (no receive > 2 s) is dropped from the splitter — its share goes to live channels, not wasted; re-included automatically on recovery.

NULL pad fills the difference to the wire cap (strictly CBR). Encoder feedback: ZMQ complexity → BalanceRouter → set_bitrate.

CBR καλώδιο: buffer + πλήρωση null + χρονισμός

Η έξοδος είναι ακριβής ροή CBR στο ρυθμισμένο cap. Τρία επίπεδα το εγγυώνται:

Μόνιμο buffer ~1 δ.

Η ουρά αποστολής διατηρεί ένα σταθερό επίπεδο ~1 δ. καλωδίου που απορροφά βραχύχρονες πτώσεις GOP (μεταξύ I-frames). Επαληθευμένο από την εγγραφή: 0,5–1 δ. απορροφά 88–91% των πτώσεων.

Πλήρωση null

Όταν το περιεχόμενο είναι κάτω από το cap, η διαφορά συμπληρώνεται με πακέτα null MPEG-TS (PID 0x1FFF). Το καλώδιο έτσι ΠΑΝΤΑ χτυπά το cap — συμβατό με DVB.

Ακριβής χρονισμός

Η εκροή χρονομετρείται στο ακριβές cap (busy-spin ABSTIME)· ένα clamp χρέους 12 ms αποτρέπει εκρήξεις catch-up μετά από σύντομη παύση → χωρίς jitter PCR, χωρίς αιχμές πάνω από cap.

Bitrate chart (main)

Stacked area — each channel has its colour (matching its card below). Σ of all + NULL pad = wire cap. Switch the time window 10m / 1h / 24h; pills next to it = event counts (CC / PCR / BR / OVF) for the selected window.

Έγχρωμες ζώνες

Κάθε κανάλι έχει σταθερό χρώμα· το πάχος = το στιγμιαίο bitrate του. Το overhead (PSI/EIT) είναι γκρι στο κάτω μέρος, η πλήρωση null είναι με υφή λευκή στην κορυφή.

Γραμμή Cap / Max

Η διακεκομμένη γραμμή στην κορυφή = ρυθμισμένο cap (ανώτατο όριο καλωδίου). Περιεχόμενο + πλήρωση null μαζί πάντα κάτω από αυτό.

Ζώνη null

Η διακεκομμένη λευκή ζώνη στην κορυφή = πλήρωση null (ελεύθερη χωρητικότητα). Όσο πιο λεπτή είναι, τόσο πιο γεμάτο το καλώδιο· εξαφανίζεται σε απαιτητικό περιεχόμενο.

Σημάδια απόρριψης

Κόκκινα σημάδια στη χρονολόγηση = υπερχείλιση ουράς αποστολής (απόρριψη). Μηδέν σε σταθερή κατάσταση· εκρήξεις μόνο κατά εκκίνηση/πλημμύρα.

Εύρος (30δ–30λ)

Τα κουμπιά αλλάζουν το χρονικό παράθυρο αμέσως (από πλευρά πελάτη), το ενεργό έχει γκρι φόντο. Το γράφημα συσσωρεύει 30 λεπτά στο πρόγραμμα περιήγησης.

tip_t

Το hover εμφανίζει bitrate ανά κανάλι, QP και δείκτη ποιότητας εκείνη τη στιγμή (ιστορική τιμή, όχι ζωντανή).

cap_t

Τρέχον επίπεδο ρύθμισης pool (pool/(pool−trim)). >100% = υπερπίεση (γέμισμα buffer), <100% = κλάδεμα.

Αποθεματικό (slider)

Ζώνη ανοχής πάνω από το cap — πόσο να διατηρηθεί ως αποθεματικό null. 0 = γέμισμα ακριβώς N· θετικό = μεγαλύτερο αποθεματικό (ασφαλέστερο)· αρνητικό = ελαφρά υπερπλήρωση.

Buffer (απορρίψεις)

Η κεφαλίδα εμφανίζει χρήση ουράς αποστολής % και αθροιστικές απορρίψεις. Το κουμπί «εκκαθάριση απορρίψεων» επαναφέρει τον μετρητή.

gop_t

Κοινό μήκος GOP για όλα τα κανάλια του mux (κλειδωμένο στα προφίλ βίντεο κατά την εκκίνηση). Ο χρονικός διακανονισμός κατανέμει I-frames στο χρόνο ώστε να μην συγκρούονται.

vbv_t

Μέγεθος buffer VBV encoder (ms). Μικρότερο ισοπεδώνει I-frames (καλό για κανάλια κίνησης), μεγαλύτερο δίνει πιο λεπτομερές I-frame. Προεπιλογή 850· δυνατή ανά stream παράκαμψη.

Channel cards (Programs)

Η κεφαλίδα ενότητας έχει διακόπτη 'Collapse / Expand all'. Ανοίξτε μια κάρτα κάνοντας κλικ ή κάνοντας κλικ στη ζώνη χρώματος στο διάγραμμα. Η αριστερή χρωματιστή λωρίδα με κουτί = ένταξη καναλιού στο mux.

dark = running OK

orange = starting / restarting

γκρι + αμυδρό = κατεβασμένο/σφάλμα και κουτί OFF (σκόπιμα απενεργοποιημένο — χωρίς συναγερμό)

red + BLINKING = FAULT — channel is in the mux (checkbox ON) but the stream is down/error

Πίνακες PSI/SI (πλήρες σύνολο DVB)

Το StatMux δημιουργεί το πλήρες σύνολο υποχρεωτικών πινάκων MPEG-TS / DVB απευθείας στο NIF mux — χωρίς εξωτερικό εισαγωγέα SI. Οι πίνακες χρονομετρούνται ομοιόμορφα στη ροή ώστε ένα STB να αποκτά PSI/SI γρήγορα μετά από επαναρρύθμιση.

Πίνακας

psi h_pid

psi h_int

Σκοπός / πηγή

EIT ↔ EPG: πλήρης ενσωμάτωση

Το EIT (Event Information Table, PID 0x12) δεν είναι στατικό — είναι πλήρως συνδεδεμένο με το σύστημα EPG της εφαρμογής. Ο operator αναθέτει σε κάθε κανάλι του mux μια υπηρεσία EPG (eit_epg_service_id), και το mux δημιουργεί ζωντανό EIT από τα προγραμματισμένα συμβάντα του.

Διαστασιολόγηση / συστάσεις

mux.bitrate = wire CBR cap (typ. 37 Mbps for 12 SD/HD channels).

Σ avg ≲ cap (comfortable target) · Σ max oversubscribed 1.5–2× cap (that is the point of statmux — peaks rarely coincide) · Σ min = worst-case floor.

Set per-stream min/avg/max in Stream → Transcoder profile (auto-syncs to mux_input). Action/sport 8–10 M, news/talking head 1–2 M, min never < 800 k.

The headroom slider is a quick live lever of reserve vs. tightness — no restart.

Σχέση με broadcast statmux

Κάνουμε πραγματική στατιστική πολυπλεξία — δυναμική αναδιανομή bits σε κανάλια VBR που μοιράζονται σταθερό καλώδιο, με εξισορρόπηση ποιότητας. Μηχανικά είμαστε κοντά στα επαγγελματικά statmux headend (ευθυγράμμιση cap, buffer 1 δ., πλήρωση null, GOP/B-frames, παράκαμψη ορίου).

Τι έχουμε

CBR καλώδιο στο cap · buffer 1 δ. · αναλογική κατανομή ανά stream · τροφοδότηση C1 προς τα εμπρός · εξισορρόπηση ποιότητας · προβλεπτική αναδιανομή · πλήρωση null · ακριβής χρονισμός.

Πού διαφέρουμε

Ένα broadcast statmux χρησιμοποιεί την εκτίμηση ρυθμού-παραμόρφωσης του encoder (ακριβές κόστος frame, ο encoder είναι υπόδουλος στον allocator). Εμείς χρησιμοποιούμε πολυπλοκότητα πηγής C1 (r≈0.92) + encoder VBR που επιλέγει το δικό του QP — περιορισμός υλικού, όχι σχεδίου. Κλάση: ανάδραση + πρόβλεψη αντί καθαρής τροφοδότησης προς τα εμπρός.

TS τίτλος

ts h_sym

ts h_fix

Channel red and blinking

In the mux (checkbox ON) but stream down/error → check the source/encoder of that stream. Self-recovers once restored.

Lots of NULL / large grey area

Calm content or low headroom — normal (statmux gain). For tighter utilization raise the headroom slider or per-stream max_bps.

Picture freezes / glitches

Headroom too high (rings not draining) → lower the slider to 80–82 %. Watch the diff gauge / NULL.

After restart streams=0 / all NULL

Mux started before the encoders — self-heal automatically reaches 12 within ~30 s (1 s tick retry). No manual action.

Diff gauge stuck at 0 / chart empty

Χωρίς ζωντανά δείγματα (mux σταματημένο ή κωδικοποιητές δεν τρέχουν) — ελέγξτε τόσο την κατάσταση mux όσο και τη ροή.

Αρχιτεκτονική

ASCII διάγραμμα

enc_b

nif_b

out_b

1. σειρά

2. σειρά

Κάρτα καταστάσεων

ASCII διάγραμμα

Κόκκινη γραμμή 'cap': ceiling CBR σύρμα (mux.bitrate) — NULL συμπληρώνει μέχρι εδώ.

Πορτοκαλί γραμμή 'headroom N%': = cap × headroom slider / 100. Η εγγραφή κωδικοποιητή set_bitrate στοχεύει εδώ. Κινείται με το δρομέα.

Γκρίζα περιοχή με μαύρες κουκίδες μεταξύ περιεχομένου και cap = NULL padding (ανεκμετάλλευτη δεσμευμένη ποσότητα). Περισσότερες κουκίδες = περισσότερη δεσμευμένη ποσότητα.

L4

Χρονοδιάγραμμα

Το MuxEitAdapter διαβάζει συμβάντα από το σύστημα EPG ανά υπηρεσία, κατασκευάζει ενότητες DVB EIT (όνομα, ώρα, διάρκεια, περιγραφή, είδος) και τις πακετοποιεί στο PID 0x12. Οι εκδόσεις ενότητας αυξάνονται κατά την αλλαγή EPG — το STB ανακτά την ενημέρωση.

Το EIT εγχέεται απευθείας στο NIF mux, ομοιόμορφα ΜΕΣΑ στον χώρο null (1 πακέτο / N έξοδος + p/f περιοδικά) — αντικαθιστώντας την εκρηκτική εξωτερική tsp κασκάδα. Αιχμή/μέσος ≈ 1,1, χωρίς εκκένωση περιεχομένου, το cap διατηρείται.

Πίνακας 0x4E — το τρέχον + επόμενο συμβάν. Εγχέεται κάθε ≤2 δευτερόλεπτα για άμεση ενημέρωση «τώρα/επόμενο» στο STB.

Το mux αναδημιουργεί περιοδικά το EIT .bin από EPG (~15 δ.) — μια αλλαγή χρονοδιαγράμματος EPG φτάνει στο καλώδιο χωρίς επανεκκίνηση. Η κεφαλίδα mux εμφανίζει «EIT ✓» όταν είναι ενεργό.

Πίνακες 0x50/0x51 — το πλήρες πρόγραμμα ώρες/ημέρες μπροστά (τμήματα). Κατανέμεται ομοιόμορφα στη ροή.

Μετρητής

Εισαγωγή

ASCII μετρητής

Τίτλοι

HR b1

Υψηλότερη (→90): σφιχτότερη χρήση cap, λιγότερο NULL.

HR b3

HR b4

Ελέγχει πόση ποσότητα του cap στοχεύουν οι κωδικοποιητές: encoder target = budget × headroom% / 100 (πορτοκαλί γραμμή στο διάγραμμα). Αλλαγές ζωντανή (εφέ από το επόμενο 10 ms tick), μόνιμη στο SystemConfig.

ISO 13818-1

ISO 13818-1 σωμα

PCR

PCR σωμα

CAT — υπό συνθήκες πρόσβαση (μόνο με scrambling / ECM).

EIT — πληροφορίες συμβάντος (EPG) — από το σύστημα EPG, βλ. παρακάτω.

NIT — πληροφορίες δικτύου (αναγνωριστικό δικτύου, όνομα, ροή μεταφοράς).

PAT — λίστα προγραμμάτων (αντιστοίχιση PNR → PMT PID).

PMT — ανά πρόγραμμα: PID βίντεο/ήχου/PCR, κωδικοποιητές, περιγραφείς.

SDT — ονόματα υπηρεσιών και πάροχοι (αυτό που εμφανίζει το STB στη λίστα).

TDT/TOT — ώρα και ημερομηνία + τοπική μετατόπιση (ρολόι STB).