استریم 24/7 که بین ویدیوها قطع نمیشود: یک ffmpeg که از طریق یک pipe تغذیه میشود
ویدیو
یک کانال زنده که ویدیوهای آماده را بهصورت شبانهروزی پخش میکند، دو طراحی ساده دارد و هر دو چیزی را از دست میدهند. راهاندازی مجدد ffmpeg برای هر ویدیو، اتصال RTMP را در هر تعویض قطع میکند. یک پلیلیست concat فقط یک بار در ابتدا خوانده میشود، بنابراین یک ویدیوی جدید باید منتظر راهاندازی مجدد بعدی بماند.
طراحی
هر ویدیو یک بار به MPEG-TS در ابعاد و نرخ فریم استریم تبدیل میشود؛ یک ویدیوی عمودی روی یک کپی تار از خودش قرار میگیرد بهجای نوارهای سیاه. یک پروسه ffmpeg فایلهای MPEG-TS را از ورودی استاندارد خود میخواند و با بیتریت ثابت و یک کلیدفریم هر دو ثانیه، همانطور که ingest زنده انتظار دارد، کدگذاری میکند. یک feeder کوچک فایلهای آمادهشده را بهصورت پشتسرهم و با سرعت واقعی در آن pipe مینویسد و در هر تعویض فایل بعدی را انتخاب میکند: ویدیوهایی که هرگز پخش نشدهاند، سپس کمترین ویدیوی پخششده اخیراً. خواننده MPEG-TS در ffmpeg میبیند که زمانبندی هر فایل از نو شروع میشود و آنها را جابهجا میکند، بنابراین خروجی بدون وقفه ادامه مییابد.
جزئیات اول: سرعت از اولین بایت
نسخه اول ما ساعت خود را هنگام شروع ffmpeg راهاندازی میکرد. آمادهسازی فایل اول نه ثانیه طول کشید، بنابراین feeder فکر کرد نه ثانیه عقب است و همه را یکجا فرستاد. راهاندازی ساعت در اولین بایت نوشتهشده مشکل را حل کرد: یک اجرای 53 ثانیهای، 53 ثانیه استریم تولید کرد.
جزئیات دوم: صدا در نقطه اتصال
در یک تعویض، صدای فایل بعدی 17 میلیثانیه قبل از پایان صدای فایل قبلی شروع میشد. انکودر هشدار میداد که ورودیاش «به عقب در زمان» میرود و ماکسر یک timestamp را اصلاح میکرد. نمونهبرداری مجدد با aresample=async=1:min_hard_comp=0.01:first_pts=0 چنین همپوشانیهایی را قبل از دیدن توسط انکودر کوتاه یا پر میکند. در یک اجرای کمی بیش از یک دقیقه با پنج تعویض، تمام timestampهای صوتی و ویدیویی در استریم دریافتی افزایش یافتند و استریم بدون حتی یک خطا دیکد شد.
جزئیات سوم: برخی هشدارها طبیعی هستند
هر فایل شمارندههای MPEG-TS و ساعت خود را از نو راهاندازی میکند، بنابراین ffmpeg در هر تعویض «Packet corrupt» و «timestamp discontinuity» را گزارش میدهد. این خطوط مورد انتظار هستند و ما آنها را از لاگ خارج میکنیم تا خطاهای واقعی برجسته شوند.
واچداگ
اگر ffmpeg خارج شود یا پیشرفت آن برای یک دقیقه متوقف گردد، استریم با مکثهای فزاینده دوباره راهاندازی میشود و پس از چند بار شکست، پیامی ارسال میکند. در تست ما، انکودر را بهصورت دستی متوقف کردیم؛ استریم هفت ثانیه بعد دوباره فعال شد و ویدیویی که در میانه اجرا اضافه شده بود، بدون نیاز به اتصال مجدد به چرخه پخش پیوست. راهاندازی مجدد یک اتصال مجدد کوتاه است، بنابراین پخش YouTube را طوری تنظیم کنید که بهصورت خودکار شروع شود و بهصورت خودکار متوقف نشود. کلید استریم در تمام خطوط لاگ، از جمله لاگهای خود ffmpeg، پوشیده (mask) میشود. Studio این کانال زنده را بهصورت یک سرویس systemd ارائه میکند.