A 24/7-es stream, amely nem kapcsolódik újra a videók között: egyetlen ffmpeg, csövön keresztül táplálva

Videó

Egy élő csatorna, amely kész videókat játszik a nap 24 órájában, két egyszerű megoldást kínál, és mindkettőben van valami hiányosság. Az ffmpeg újraindítása minden videónál megszakítja az RTMP kapcsolatot minden váltásnál. A concat lejátszási listát induláskor egyszer olvassa be, így egy új videó a következő újraindításig vár.

A megoldás

Minden videót egyszer konvertálunk MPEG-TS formátumba a stream felbontásában és képkockasebességében; egy függőleges videó egy elmosott másolatán jelenik meg fekete sávok helyett. Egy ffmpeg folyamat MPEG-TS-t olvas a szabványos bemenetéről, és állandó bitrátával kódol másodpercenkénti kulcsképpel, ahogy azt az élő betáplálás várja. Egy kis betöltő folyamat valós idejű ütemben írja a előkészített fájlokat a csőbe egymás után, minden váltásnál kiválasztva a következő fájlt: először a még nem lejátszott videók, majd a legrégebben lejátszottak. Az ffmpeg MPEG-TS olvasója észleli, hogy minden fájl időbélyegei újrakezdődnek, és eltolja őket, így a kimenet megszakítás nélkül fut.

1. részlet: ütemezés az első bájttól

Az első verzió az ffmpeg indulásakor indította az órát. Az első fájl előkészítése kilenc másodpercet vett igénybe, így a betöltő azt hitte, hogy kilenc másodperccel lemaradt, és mindet egyszerre küldte el. Az óra indítása az első kiírt bájtnál megoldotta a problémát: egy 53 másodperces futás 53 másodpercnyi streamet eredményezett.

2. részlet: az hang az illesztésnél

Egy váltásnál a következő fájl hangja 17 milliszekundummal a előző fájl hangjának vége előtt kezdődött. A kódoló figyelmeztetett, hogy a bemenet „időben visszafelé” megy, és a muxer javította az időbélyeget. Az aresample=async=1:min_hard_comp=0.01:first_pts=0 paraméterekkel végzett újramintavételezés levágja vagy kiegészíti az ilyen átfedéseket, mielőtt a kódoló látná őket. Egy alig több mint egy perces futásban öt váltással a fogadott stream minden hang- és videó-időbélyege nőtt, és a stream egyetlen hiba nélkül dekódolódott.

3. részlet: egyes figyelmeztetések normálisak

Minden fájl újraindítja az MPEG-TS számlálóit és az óráját, így az ffmpeg minden váltásnál „Packet corrupt” és „timestamp discontinuity” üzeneteket jelent. Ezek a sorok várhatóak, és kizárjuk őket a naplóból, hogy a valódi hibák kiemelkedjenek.

Az őrszem

Ha az ffmpeg kilép, vagy a haladása egy percre megáll, a stream növekvő szünetekkel újraindul, és ismételt hibák után üzenetet küld. A tesztünkben kézzel lőttük le a kódolót; a stream hét másodperc múlva visszaállt, és egy futás közben hozzáadott videó csatlakozott a rotációhoz újracsatlakozás nélkül. Az újraindítás egy rövid újracsatlakozás, ezért állítsd be a YouTube-adást úgy, hogy automatikusan induljon, de ne álljon le automatikusan. A stream kulcsa minden naplósorban maszkolva van, beleértve az ffmpeg sajátját is. A Studio ezt az élő csatornát systemd szolgáltatásként szállítja.

Frissítve: