TSDuck-based MPEG Transport Stream multiplexer with full PSI/SI support


Stream Manager mux מרכיב מספר זרמי SPTS לפלט CBR MPTS אחד (DVB/IPTV).
כאשר ה-mux האב מופעל, כל מקודד FFmpeg מפעיל capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>.
tsp -I null (∞ NULL packets @ rate line) → -P merge tsp -I ip <stream> (שכבת על מנות אמיתיות) → -P המשכיות (אזעקת ירידה) → -P pcradjust --bitrate X (משכתב PCRs) → -P pcrverify --jitter-max → P
regulate plugin פולט בדיוק mux.bitrate bps על החוט.
הסרגל העליון Mux מציג 3 סכומים עם מצב צבע.
Σ ממוצע ≤ 85% mux.bitrate — סכום יעד ממוצע בכל הערוצים בתוספת אודיו.
Σ max ≤ 160% mux.bitrate — סכום שיא התקרה.
Σ min ≤ 50% mux.bitrate — סכום רצפת מקודד.
תקציב זמין לאחר PSI/SI/EIT: ~18.5 Mbps.
ב-≥ 10 אזעקות בשנות ה-60 מופיעה התראת הבזק בממשק המשתמש של Mux הממליצה על הפחתת קצב הסיביות.
-P bitrate_monitor --periodic 60 --min/max ±5% - אזעקה אם הקצב בפועל חורג מ-±5% מהיעד.
-P המשכיות - עוקב אחר מוני המשכיות TS.
-P pcrverify --jitter-max 500000 — DVB מאפשר ריצוד PCR ≤ 500 µs.
צירוף מקרים של GOP - כל המקודדים פולטים I-frames בו-זמנית, צירוף מקרים שיא.
אובדן אות קלט - ערוץ בודד הופך לשחור, mux ממשיך (הודות ל-I null base).
מנוי יתר (פסגות מתמשכות > קיבולת) - בלוקים/גמגום שמע ~50-200 אלפיות השנייה.
סחף PCR - גמגום STB כל כמה שניות.
STB VBV underrun - STB מאבד סנכרון ומשיג מחדש (~2-3 שניות).
--max-input-packets 4096 / --max-flushed-packets 4096 (FIFO פנימי ≈ 0.3 שניות @ 19 Mbps).
תג הסרגל העליון `📐 rec X.XM` מציג את קיבולת ה-mux המומלצת הנגזרת ממשפט הגבול המרכזי.
צבע התג: 🟢 ירוק = מכסה ≥ 99.7% rec (שמרני) · 🟡 ענבר = בין 99% ל- 99.7% · 🔴 אדום = מכסה < 99% (הקצאה מועטה, סיכון לנפילות) · 🔵 כחול = מכסה לא מוגדר.
ציון z לכל יעד סיקור: 90% z=1.28 · 95% z=1.65 · 99% z=2.33 · 99.7% z=3.00 (ברירת מחדל) · 99.99% z=3.72 (דרגת שידור).
σ_eff = σ_total × statmux_factor (statmux_factor = 0.7 כאשר Statmux מופעל, אחרת 1.0)
ערוץ HD 1080p25: ממוצע = 4000-5000 kbps, min = ממוצע × 0.75 (~3000-3750), מקסימום = ממוצע × 1.5 (~6000-7500).
Adaptive Hybrid Statmux הוא מנגנון זמן ריצה שמעביר קיבולת לא מנוצלת מזרמי ליבה (מוגנים, VBR מלא) לזרמים מאוזנים (הקרבה).
קיבולת Mux 38 Mbps
ללא Adaptive Hybrid Statmux עליך להתאים את ה-mux למקרה הגרוע ביותר של Σ max.
CBR טהור (מקודד קבוע)
VBR ללא Statmux
סטמוקס היברידי אדפטיבי מופעל
עקיפה של קלט כתובת אתר מותאמת אישית ו-Statmux סותרים זה את זה.
┌─────────────────────────┐
רווח סטטיסטי מתרחש רק כאשר למקודדים יש טווח VBR רחב - כאשר מקסימום ≈ ממוצע המקודד הוא למעשה CBR ולנתב אין מה להפיץ מחדש.
דוגמה עובדת - 38 Mbps mux, 10 ליבות HD + 2 מאוזנים:
טווח מומלץ לכל זרם ליבה:
לפחות זרם מאוזן אחד - בלי אחד לנתב ההיבריד האדפטיבי אין מה למחוץ בזמן השיאים, אז רווח = 0
ערוצי מוזיקה ומידע הם המועמדים הטובים ביותר - 90%+ סובלנות להורדת דירוג
עקוב אחר רשומות יומן "[איזון-נתב]" - מציג את 'core_max', 'נותרים', מעברי שכבה עבור כל סימון של 1.
אם 'core_max > capacity' (אזהרת CORE OVERPEAK ביומן), הפחת את ספירת זרם הליבה או הקטן את קצב המקודד המקסימלי
הוסף זרמים ל-mux (הקצאת הערוץ נשארת ידנית)
החלף את Statmux בכותרת mux (שבב צהוב).
סמן זרמי קורבנות באמצעות תיבת הסימון הכתומה בצד ימין - בדרך כלל ערוצי מוזיקה/מידע שבהם הפחתת שיעורים אינה נראית
נַעֲשָׂה.
מספר ערוצים בקצב סיביות משתנה חולקים זרם תחבורה קבוע אחד (MPTS).
מחלקה: סטטמוקס משוב בלולאה סגורה עם מבט קדימה (הזנה קדימה) של C1 על מקודדי VBR - עקרון שידור statmux, המונע ממורכבות המקור.
UDP multicast SSM, לכל ערוץ
מקודדים
מורכבות המקור
Loopback
קו / זרם משלו
מקצה (Σ ≤ מאגר)
בַּלָם
ריפוד null → CBR
חוט CBR במכסה
צפו לסצנה מורכבת לפני הטבילה
חוט נמדד - כיול
קצב סיביות יעד
כל ערוץ פועל בקו משלו עד ל-mux (מקודד נפרד + חיבור loopback), שם כולם מתמזגים לקו אחד של MPTS ריבוי שידור בקצב סיביות קבוע בדיוק.
המקצה משלב שני אותות - חיזוי ממורכבות המקור (קדימה) והחוט הנמדד (אחורה).
C1 מודד את מורכבות התוכן במפענח - מה שמוביל את פלט המקודד על ידי חביון הצינור.
ביטים מדויקים לכל זרם הנפלטים על ידי ה-mux (מונים בצד השולח) מכיילים את מיפוי המורכבות → קצב סיביות ומחזיקים את הסכום בדיוק בבריכה.
הטענה של זרם מגובה במה שהמקודד מייצר בפועל (× שיא מרווח הראש).
המטרה היא לא קצב סיביות שווה אלא איכות שווה - לחץ מתמשך מעביר ביטים מערוצים באיכות גבוהה (QP נמוך) לאיכות נמוכה (QP גבוהה).
כאשר C1 מאותת על נפילה של ערוץ, רוחב הפס שלו נמסר לאחרים באותו סימון - הם מתגברים לפני שהצניחה מגיעה למעשה לחוט.
בריכה = מכסה N − תקורה (PSI/EIT) − שמע − רזרבה (מחוון).
דרישה לכל זרם = חוט שניתן לספק × C1 מבט קדימה (שינוי מורכבות יחסית) + לחץ משווה איכות.
הקצאת מאגר פרופורציונלית לפי דרישה, מהודקת ל-[min, max] מפרופיל הווידאו;
יעד מקודד = הקצאה / כיול (לכל זרם EMA נמדד/יעד);
סרוו החזקת מאגר שומר על רמת התור ב-~1 שניות (רצועה), מעצור חירום בעת עומס יתר;
הפלט הוא זרם CBR מדויק במכסה המוגדר.
תור השליחה מחזיק ברמת עמידה של ~1 שניות של חוט הסופג נפילות GOP של תת-שנייה (בין I-frames).
כאשר התוכן מתחת למכסה, ההפרש מתמלא בחבילות Null של MPEG-TS (PID 0x1FFF).
היציאה מתבצעת עד למגבלה המדויקת (תפוס-ספין ABSTIME);
גרף מוערם חי של החוט האמיתי - כל פס הוא ערוץ אחד, זורם בצורה חלקה מימין.
לכל ערוץ יש צבע יציב;
הקו המקווקו בחלק העליון = כובע מוגדר (תקרת חוט).
הרצועה הלבנה המנוקדת למעלה = ריפוד אפס (קיבולת חופשית).
סימנים אדומים על ציר הזמן = שליחה-תור גלישה (ירידה).
הלחצנים מחליפים את חלון הזמן באופן מיידי (בצד הלקוח), לפעיל יש רקע אפור.
הרחף מציג קצב סיביות לכל ערוץ, QP ואינדקס איכות באותו רגע (ערך היסטורי, לא חי).
רמת ויסות הבריכה הנוכחית (בריכה/(בריכה-קצץ)).
רצועת סובלנות מעל כובע - כמה לשמור כאפס רזרבה.
הכותרת מציגה % שימוש בתור שליחה וירידה מצטברת.
אורך GOP משותף לכל הערוצים ב-mux (נעול בפרופילי וידאו בהתחלה).
גודל מאגר VBV של מקודד (ms).
לכל ערוץ ב-mux יש כרטיס עם שם, PNR, קצב סיביות נוכחי ויעד, ומצב:
פועל - הערוץ מקודד וזורם אל החוט.
מתחיל - המקודד מסתובב / מתיישב.
כבוי - הערוץ נמצא ב-mux אך אינו פועל (0 kbps).
תקלה - קלט אבד / המקודד קרס.
StatMux מייצר את הסט המלא של טבלאות MPEG-TS / DVB החובה ישירות ב-NIF mux - ללא מוסיף SI חיצוני.
לוּחַ
PID
הַפסָקָה
מטרה / מקור
EIT (Event Information Table, PID 0x12) אינו סטטי - הוא מחובר במלואו למערכת ה-EPG של האפליקציה.
min = קומה תחתונה (סצנה סטטית).
avg = רמת יעד.
מקסימום = תקרה (מרווח ראש VBR לפסגות/חתכים).
דוגמאות (ממוצע): SD 1.5–2.5M · HD 2.5–4M · FHD 4–6M · UHD 12–18M.
אנחנו עושים ריבוי סטטיסטי אמיתי - חלוקה דינמית של סיביות על פני ערוצי VBR חולקים חוט קבוע, עם השוואת איכות.
חוט CBR במכסה · חיץ של 1 שניות · הקצאה פרופורציונלית לכל זרם · הזנה קדימה של C1 מבט קדימה · השוואת איכות · חלוקה מחדש חזויה · ריפוד אפס · קצב מדויק.
Statmux שידור משתמש באומדן עיוות הקצב של המקודד (עלות מסגרת מדויקת, המקודד הוא עבד למקצה).
סִימפּטוֹם
סיבה/תיקון
פערים / קוצים אפס (5-7M) בתרשים
ירידה בתוכן - או GOP בין I-frames (נקלט במאגר של 1 s) או דוכן תוכן קולקטיבי (מטופל על ידי הפצה מחדש).
טיפות > 0 טיפוס
שלח תור על גדותיו - תוכן מעל המכסה.
ערוץ אחד נשאר קצב סיביות נמוך / QP גבוה
או תוכן סטטי (נכון - זה משחרר רוחב פס) או מקסימום נמוך מדי בפרופיל.
מגמגמים בתרשים / מחיקת קצה שמאל
בצד הלקוח - רענון קשה (Ctrl+Shift+R) עבור החבילה החדשה של JS.
cap % / buffer אינו משתנה לאחר העריכה
עיבוד מחדש של LiveView - רענון קשה.
SAT UDP SSM ─┐
gst_encoder.py לכל זרם: קלט SAT UDP SSM → nvh264enc rc-mode=cbr.
טבעת לכל קלט (TCP loopback מהמקודד), ניקוז 2 מעברים (עדיפות אודיו, וידאו מלא), מקצה פרופורציונלי, כרית NULL בדיוק למכסה חוט (CBR), מעבר PCR מהמקודד.
MPTS אחד (PAT/PMT/SDT שנוצר על ידי NIF) ← UDP ריבוי שידור ב-VLAN הפלט.
שורה 1: ⚠ (בעיות אימות) · PNR · שם במסגרת (צבע = מצב).
שורה 2+: min·avg·max kbps · מורכבות חזויה Δ low/med/high/peak · INPUT LOST · ⚙URL · מקודד Mbps · SID · service_type.
צבע שם = מצב זרם:
Mbps
קו 'כובע' אדום: תקרת CBR תיל (mux.bitrate) - NULL מתמלא עד כאן.
שורת 'headroom N%' כתומה: = כובע × מחוון מרווח ראש / 100. מטרות set_bitrate של המקודד מכוונות לכאן.
אזור אפור עם נקודות שחורות בין התוכן והכובע = ריפוד NULL (רזרבה לא בשימוש).
לחץ על פס הצבעים של ערוץ → מרחיב אוטומטית את כרטיס הערוץ למטה.
MuxEitAdapter קורא אירועים ממערכת ה-EPG לכל שירות, בונה קטעי DVB EIT (שם, זמן, משך, תיאור, ז'אנר) ומעביר אותם ל-PID 0x12.
EIT מוזרק ישירות ב-NIF mux, באופן שווה לתוך החלל האפס (1 חבילה / פלט N + p/f מעת לעת) - מחליף את מפל ה-tsp החיצוני הפרוץ.
טבלה 0x4E - האירוע הפועל כעת + הבא.
ה-mux מחדש מעת לעת את ה-EIT .bin מ-EPG (~15 שניות) - שינוי בלוח הזמנים של EPG מגיע לחוט ללא הפעלה מחדש.
טבלאות 0x50/0x51 - לוח הזמנים המלא שעות/ימים קדימה (מקטעים).
אינדיקטור של זרימה אמיתית לעומת מכסה.
-5 Mbps CAP 37000 kbps +5 Mbps
תחתון (→78): יותר עתודה NULL, ניצול מכסה בטוח יותר, פחות הדוק.
גבוה יותר (→90): ניצול מכסה הדוק יותר, פחות NULL.
⚠ ≥88%: המחוון הופך לצהוב - קרוב לתקרת הקפאת הצפת הטבעת.
אסימטריה: הורדה מהימנה מוסיפה רזרבה;
שולט בכמה מהמכסה המקודדים מכוונים: יעד המקודד = תקציב × מרווח% / 100 (קו כתום בתרשים).
ערוץ אחד נכשל (קריסת מקודד / אובדן אות) ⇒ ה-mux ממשיך לפעול, ערוצים אחרים לא מושפעים, חוט מחזיק את המכסה (NULL סופג את ההפסקה), CC=0 על ניצולים.
PCR ו-PES PTS/DTS עוברים מהמקודד (תחום שעון יחיד ⇒ קוהרנטי, ללא סחיפה).
CAT - גישה מותנית (רק בעת ערבול / ECM).
EIT - מידע על אירועים (EPG) - ממערכת ה-EPG, ראה להלן.
NIT - מידע רשת (מזהה רשת, שם, זרם תחבורה).
PAT - רשימת תוכניות (מפה PNR → PMT PID).
PMT — לכל תוכנית: וידאו/אודיו/PCR PIDs, קודקים, מתארים.
SDT - שמות שירותים וספקים (מה שה-STB מציג ברשימה).
TDT/TOT - שעה ותאריך + היסט מקומי (שעון STB).