שידור רציף 24/7 ללא התחברות מחדש בין סרטונים: תהליך ffmpeg אחד הזן דרך צינור

וידאו

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

העיצוב

כל סרטון מומר פעם אחת ל-MPEG-TS בגודל ובקצב הפריימים של השידור; סרטון אנכי מוצב על עותק מטושטש של עצמו במקום פסי שחור. תהליך ffmpeg אחד קורא MPEG-TS מקלט הסטנדרטי שלו ומקודד בקצב סיביות קבוע עם פריים מפתח כל שתי שניות, כמצופה מקלט שידור חי. מזין קטן כותב את הקבצים המוכנים לתוך הצינור הזה אחד אחרי השני, בקצב זמן אמת, ובוחר את הקובץ הבא בכל מעבר: סרטונים שמעולם לא הושמעו קודם, ואז אלו שהושמעו לפני זמן רב ביותר. קורא ה-MPEG-TS של ffmpeg רואה שחותמי הזמן של כל קובץ מתחילים מחדש ומזיז אותם, כך שהפלט שלו רץ ללא הפסקה.

פרט ראשון: קצב מהבית הראשון

הגרסה הראשונה שלנו התחילה את השעון כש-ffmpeg התחיל. הכנת הקובץ הראשון לקחה תשע שניות, ולכן המזין חשב שהוא מאחר בתשע שניות ושלח אותן בבת אחת. התחלת השעון בבית הראשון שנכתב תיקנה את זה: ריצה של 53 שניות ייצרה 53 שניות של שידור.

פרט שני: השמע בתפר

במעבר, השמע של הקובץ הבא התחיל 17 מילי-שניות לפני שהשמע של הקובץ הקודם הסתיים. המקודד הזהיר שהקלט שלו "חוזר בזמן" והמכפלת תיקנה חותם זמן. דגימה מחדש עם aresample=async=1:min_hard_comp=0.01:first_pts=0 חותכת או מוסיפה חפיפות כאלה לפני שהמקודד רואה אותן. בריצה של קצת יותר מדקה עם חמישה מעברים, כל חותמי הזמן של השמע והווידאו בשידור שהתקבל עלו, והשידור פוענח ללא שגיאה אחת.

פרט שלישי: חלק מהאזהרות הן נורמליות

כל קובץ מאפס את מוני ה-MPEG-TS ואת השעון שלו, ולכן ffmpeg מדווח על "Packet corrupt" ו-"timestamp discontinuity" בכל מעבר. השורות האלה צפויות, ואנחנו מוציאות אותן מהיומן כדי ששגיאות אמיתיות יבלטו.

שומר הסף

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

עודכן: