Muxer — Statistical Multiplex

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

MPTS Multiplexer & סטטמוקס היברידי אדפטיבי

Stream Manager mux מרכיב מספר זרמי SPTS לפלט CBR MPTS אחד (DVB/IPTV).

1. שכבת מקודד (FFmpeg לכל זרם)

כאשר ה-mux האב מופעל, כל מקודד FFmpeg מפעיל capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>.

2. שכבת Mux (TSDuck tsp pipeline)

tsp -I null (∞ NULL packets @ rate line) → -P merge tsp -I ip <stream> (שכבת על מנות אמיתיות) → -P המשכיות (אזעקת ירידה) → -P pcradjust --bitrate X (משכתב PCRs) → -P pcrverify --jitter-max → P

3. שכבת פלט (UDP)

regulate plugin פולט בדיוק mux.bitrate bps על החוט.

גודל מומלץ (Σ min / avg / max לעומת mux.bitrate)

הסרגל העליון Mux מציג 3 סכומים עם מצב צבע.

Σ ממוצע ≤ 85% mux.bitrate — סכום יעד ממוצע בכל הערוצים בתוספת אודיו.

Σ max ≤ 160% mux.bitrate — סכום שיא התקרה.

Σ min ≤ 50% mux.bitrate — סכום רצפת מקודד.

דוגמה: 4 ערוצי HD ב-19 Mbps DVB-T mux

תקציב זמין לאחר 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 שניות).

tsp pipeline פרמטרים (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (FIFO פנימי ≈ 0.3 שניות @ 19 Mbps).

חישוב קיבולת אמפירית (CLT)

תג הסרגל העליון `📐 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 H.264)

ערוץ HD 1080p25: ממוצע = 4000-5000 kbps, min = ממוצע × 0.75 (~3000-3750), מקסימום = ממוצע × 1.5 (~6000-7500).

סטטמוקס היברידי אדפטיבי

Adaptive Hybrid Statmux הוא מנגנון זמן ריצה שמעביר קיבולת לא מנוצלת מזרמי ליבה (מוגנים, VBR מלא) לזרמים מאוזנים (הקרבה).

קיבולת - כיצד מתחלק קצב הסיביות

קיבולת Mux 38 Mbps

רווח מעשי (10 זרמים × 3 Mbps ממוצע, 4 Mbps מקסימום)

ללא Adaptive Hybrid Statmux עליך להתאים את ה-mux למקרה הגרוע ביותר של Σ max.

CBR טהור (מקודד קבוע)

VBR ללא Statmux

סטמוקס היברידי אדפטיבי מופעל

כתובת URL ↔ בלעדיות של Statmux

עקיפה של קלט כתובת אתר מותאמת אישית ו-Statmux סותרים זה את זה.

צינור (מקודד → מתמר מאוזן → mux ffmpeg → tsp)

┌─────────────────────────┐

גודל ליבת VBR min/avg/max עבור statmux

רווח סטטיסטי מתרחש רק כאשר למקודדים יש טווח VBR רחב - כאשר מקסימום ≈ ממוצע המקודד הוא למעשה CBR ולנתב אין מה להפיץ מחדש.

דוגמה עובדת - 38 Mbps mux, 10 ליבות HD + 2 מאוזנים:

טווח מומלץ לכל זרם ליבה:

טיפים ופתרון בעיות

לפחות זרם מאוזן אחד - בלי אחד לנתב ההיבריד האדפטיבי אין מה למחוץ בזמן השיאים, אז רווח = 0

ערוצי מוזיקה ומידע הם המועמדים הטובים ביותר - 90%+ סובלנות להורדת דירוג

עקוב אחר רשומות יומן "[איזון-נתב]" - מציג את 'core_max', 'נותרים', מעברי שכבה עבור כל סימון של 1.

אם 'core_max > capacity' (אזהרת CORE OVERPEAK ביומן), הפחת את ספירת זרם הליבה או הקטן את קצב המקודד המקסימלי

זרימת עבודה של מפעיל

הוסף זרמים ל-mux (הקצאת הערוץ נשארת ידנית)

החלף את Statmux בכותרת mux (שבב צהוב).

סמן זרמי קורבנות באמצעות תיבת הסימון הכתומה בצד ימין - בדרך כלל ערוצי מוזיקה/מידע שבהם הפחתת שיעורים אינה נראית

נַעֲשָׂה.

StatMux - מולטיפלקס סטטיסטי מקורי

מספר ערוצים בקצב סיביות משתנה חולקים זרם תחבורה קבוע אחד (MPTS).

מחלקה: סטטמוקס משוב בלולאה סגורה עם מבט קדימה (הזנה קדימה) של C1 על מקודדי VBR - עקרון שידור statmux, המונע ממורכבות המקור.

ארכיטקטורה וזרימת נתונים

Architecture diagram

UDP multicast SSM, לכל ערוץ

מקודדים

מורכבות המקור

Loopback

קו / זרם משלו

מקצה (Σ ≤ מאגר)

בַּלָם

ריפוד null → CBR

חוט CBR במכסה

צפו לסצנה מורכבת לפני הטבילה

חוט נמדד - כיול

קצב סיביות יעד

כל ערוץ פועל בקו משלו עד ל-mux (מקודד נפרד + חיבור loopback), שם כולם מתמזגים לקו אחד של MPTS ריבוי שידור בקצב סיביות קבוע בדיוק.

מוח: משוב + C1 מבט קדימה

המקצה משלב שני אותות - חיזוי ממורכבות המקור (קדימה) והחוט הנמדד (אחורה).

C1 מודד את מורכבות התוכן במפענח - מה שמוביל את פלט המקודד על ידי חביון הצינור.

חוט מדוד (משוב)

ביטים מדויקים לכל זרם הנפלטים על ידי ה-mux (מונים בצד השולח) מכיילים את מיפוי המורכבות → קצב סיביות ומחזיקים את הסכום בדיוק בבריכה.

יכולת מסירה

הטענה של זרם מגובה במה שהמקודד מייצר בפועל (× שיא מרווח הראש).

איכות שווה

המטרה היא לא קצב סיביות שווה אלא איכות שווה - לחץ מתמשך מעביר ביטים מערוצים באיכות גבוהה (QP נמוך) לאיכות נמוכה (QP גבוהה).

חלוקה מחדש חזויה

כאשר C1 מאותת על נפילה של ערוץ, רוחב הפס שלו נמסר לאחרים באותו סימון - הם מתגברים לפני שהצניחה מגיעה למעשה לחוט.

בריכה = מכסה N − תקורה (PSI/EIT) − שמע − רזרבה (מחוון).

דרישה לכל זרם = חוט שניתן לספק × C1 מבט קדימה (שינוי מורכבות יחסית) + לחץ משווה איכות.

הקצאת מאגר פרופורציונלית לפי דרישה, מהודקת ל-[min, max] מפרופיל הווידאו;

יעד מקודד = הקצאה / כיול (לכל זרם EMA נמדד/יעד);

סרוו החזקת מאגר שומר על רמת התור ב-~1 שניות (רצועה), מעצור חירום בעת עומס יתר;

חוט CBR: חיץ + ריפוד אפס + קצב

הפלט הוא זרם CBR מדויק במכסה המוגדר.

חיץ עומד ~1 שניות

תור השליחה מחזיק ברמת עמידה של ~1 שניות של חוט הסופג נפילות GOP של תת-שנייה (בין I-frames).

ריפוד אפס

כאשר התוכן מתחת למכסה, ההפרש מתמלא בחבילות Null של MPEG-TS (PID 0x1FFF).

קצב מדויק

היציאה מתבצעת עד למגבלה המדויקת (תפוס-ספין ABSTIME);

תרשים פלט (נהר)

גרף מוערם חי של החוט האמיתי - כל פס הוא ערוץ אחד, זורם בצורה חלקה מימין.

להקות צבעוניות

לכל ערוץ יש צבע יציב;

קו כובע / מקסימום

הקו המקווקו בחלק העליון = כובע מוגדר (תקרת חוט).

להקת אפס

הרצועה הלבנה המנוקדת למעלה = ריפוד אפס (קיבולת חופשית).

סימני ירידה

סימנים אדומים על ציר הזמן = שליחה-תור גלישה (ירידה).

טווח (30-30 מ')

הלחצנים מחליפים את חלון הזמן באופן מיידי (בצד הלקוח), לפעיל יש רקע אפור.

טיפים לכלי עבודה

הרחף מציג קצב סיביות לכל ערוץ, QP ואינדקס איכות באותו רגע (ערך היסטורי, לא חי).

מכסה אחוז

רמת ויסות הבריכה הנוכחית (בריכה/(בריכה-קצץ)).

שמור (מחוון)

רצועת סובלנות מעל כובע - כמה לשמור כאפס רזרבה.

מאגר (טיפות)

הכותרת מציגה % שימוש בתור שליחה וירידה מצטברת.

GOP

אורך GOP משותף לכל הערוצים ב-mux (נעול בפרופילי וידאו בהתחלה).

VBV

גודל מאגר VBV של מקודד (ms).

כרטיסי זרם ומדינות

לכל ערוץ ב-mux יש כרטיס עם שם, PNR, קצב סיביות נוכחי ויעד, ומצב:

פועל - הערוץ מקודד וזורם אל החוט.

מתחיל - המקודד מסתובב / מתיישב.

כבוי - הערוץ נמצא ב-mux אך אינו פועל (0 kbps).

תקלה - קלט אבד / המקודד קרס.

טבלאות PSI/SI (סט DVB שלם)

StatMux מייצר את הסט המלא של טבלאות MPEG-TS / DVB החובה ישירות ב-NIF mux - ללא מוסיף SI חיצוני.

לוּחַ

PID

הַפסָקָה

מטרה / מקור

EIT ↔ EPG: אינטגרציה מלאה

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–90%, ברירת מחדל 85)

תחתון (→78): יותר עתודה NULL, ניצול מכסה בטוח יותר, פחות הדוק.

גבוה יותר (→90): ניצול מכסה הדוק יותר, פחות NULL.

⚠ ≥88%: המחוון הופך לצהוב - קרוב לתקרת הקפאת הצפת הטבעת.

אסימטריה: הורדה מהימנה מוסיפה רזרבה;

שולט בכמה מהמכסה המקודדים מכוונים: יעד המקודד = תקציב × מרווח% / 100 (קו כתום בתרשים).

אובדן אות / כשל בערוץ (בידוד)

ערוץ אחד נכשל (קריסת מקודד / אובדן אות) ⇒ ה-mux ממשיך לפעול, ערוצים אחרים לא מושפעים, חוט מחזיק את המכסה (NULL סופג את ההפסקה), CC=0 על ניצולים.

PCR / תזמון

PCR ו-PES PTS/DTS עוברים מהמקודד (תחום שעון יחיד ⇒ קוהרנטי, ללא סחיפה).

CAT - גישה מותנית (רק בעת ערבול / ECM).

EIT - מידע על אירועים (EPG) - ממערכת ה-EPG, ראה להלן.

NIT - מידע רשת (מזהה רשת, שם, זרם תחבורה).

PAT - רשימת תוכניות (מפה PNR → PMT PID).

PMT — לכל תוכנית: וידאו/אודיו/PCR PIDs, קודקים, מתארים.

SDT - שמות שירותים וספקים (מה שה-STB מציג ברשימה).

TDT/TOT - שעה ותאריך + היסט מקומי (שעון STB).

TSDuck Plugins Used

merge
regulate
pat
pmt
sdt
nit
eitinject
timeref
bitrate_monitor
continuity
psimerge
count