بثّ على مدار 24/7 لا يعيد الاتصال بين الفيديوهات: عملية ffmpeg واحدة تُغذّى عبر أنبوب (pipe)
الفيديو
توجد تصميمان سهلاان لقناة مباشرة تُشغّل فيديوهات جاهزة على مدار الساعة، وكلاهما يفقد شيئًا ما. إعادة تشغيل ffmpeg لكل فيديو تُسقط اتصال RTMP عند كل تبديل. قائمة التشغيل المتصلة (concat playlist) تُقرأ مرة واحدة عند البدء، لذا ينتظر الفيديو الجديد إعادة التشغيل التالية.
التصميم
يُحوَّل كل فيديو مرة واحدة إلى صيغة MPEG-TS بالحجم ومعدل الإطارات المطلوبين للبث؛ الفيديو العمودي يظهر فوق نسخة ضبابية من نفسه بدلاً من أشرطة سوداء. عملية ffmpeg واحدة تقرأ MPEG-TS من مدخلها القياسي وتُرمّز بمعدل بت ثابت مع إطار مفتاحي كل ثانيتين، كما يتوقع الاستقبال المباشر. كاتب صغير (feeder) يكتب الملفات المُجهّزة في ذلك الأنبوب واحدًا تلو الآخر، بإيقاع الوقت الحقيقي، مختارًا الملف التالي عند كل تبديل: فيديوهات لم تُشغّل أولاً، ثم الأقل تشغيلًا مؤخرًا. قارئ MPEG-TS في ffmpeg يرى أن طوابع زمنية كل ملف تبدأ من جديد فيزيحها، لذا يستمر مخرجاته دون انقطاع.
تفصيل أول: الإيقاع من البايت الأول
بدأت نسختنا الأولى الساعة عند بدء تشغيل ffmpeg. استغرق تجهيز الملف الأول تسع ثوانٍ، فظنّ الكاتب أنه متأخر تسع ثوانٍ وأرسلها كلها دفعة واحدة. بدء الساعة عند كتابة البايت الأول أصلح المشكلة: تشغيل مدته 53 ثانية أنتج 53 ثانية من البث.
تفصيل ثانٍ: الصوت عند نقطة الوصل
عند التبديل، بدأ صوت الملف التالي قبل 17 مللي ثانية من انتهاء صوت الملف السابق. حذّر المرمّز من أن مدخله يعود "إلى الورق في الزمن" وقام المدمج (muxer) بإصلاح طابع زمني. إعادة العينة باستخدام aresample=async=1:min_hard_comp=0.01:first_pts=0 تقصّ أو تضيف حشوًا لهذه التداخلات قبل أن يراها المرمّز. في تشغيل مدته دقيقة بقليل مع خمس تبديلات، ارتفعت كل طوابع زمنية الصوت والفيديو في البث المستلم، وفُكّ تشفير البث دون خطأ واحد.
تفصيل ثالث: بعض التحذيرات طبيعية
يعيد كل ملف تشغيل عدّادات MPEG-TS وساعته، لذا يُبلّغ ffmpeg عن "Packet corrupt" و"timestamp discontinuity" عند كل تبديل. هذه الأسطر متوقعة، ونُخرجها من السجل حتى تبرز الأخطاء الحقيقية.
المراقب
إذا خرج ffmpeg أو توقّف تقدّمه لمدة دقيقة، تُعاد تشغيل البث مع فترات انتظار متزايدة، وتُرسل رسالة بعد تكرار الإخفاقات. في اختبارنا، أوقفنا المُرمِّز يدويًا؛ وعاد البث بعد سبع ثوانٍ، وانضم فيديو أُضيف أثناء التشغيل إلى قائمة التشغيل الدورية دون إعادة اتصال. إعادة التشغيل هي إعادة اتصال قصيرة، لذا اضبط بث YouTube ليبدأ تلقائيًا ولا يتوقف تلقائيًا. يُحجب مفتاح البث في كل سطر من سجلات الأحداث، بما في ذلك السجلات الخاصة بـ ffmpeg نفسها. تُقدّم Studio هذه القناة المباشرة كخدمة systemd.