Nepřerušovaný stream 24/7, který se mezi videi nerekonektuje: jeden ffmpeg napájený přes rouru

Video

Živý kanál, který nonstop přehrává hotová videa, má dvě jednoduchá řešení a obě něco ztratí. Restartování ffmpegu pro každé video přeruší RTMP připojení při každém přepnutí. Seznam stopážních videí (concat playlist) se načte jednou na začátku, takže nové video čeká na další restart.

Řešení

Každé video se jednou převede do MPEG-TS v rozlišení a snímkové frekvenci streamu; vertikální video je umístěno na rozmazané kopii sebe sama místo na černé pruhy. Jeden proces ffmpegu čte MPEG-TS ze standardního vstupu a kóduje s konstantním datovým tokem s klíčovým snímkem každé dvě sekundy, jak se očekává pro živý ingest. Malý dávkovač zapisuje připravené soubory do této roury jeden za druhým v reálném čase a při každém přepnutí volí další soubor: nejdříve videa, která ještě nebyla přehrána, poté ta, která byla přehrána nejdéle zpět. Čtečka MPEG-TS v ffmpegu vidí, že časové razítka každého souboru začínají znovu, a posouvá je, takže výstup běží bez přerušení.

Detail 1: tempo od prvního bajtu

Naše první verze spustila hodiny při spuštění ffmpegu. Příprava prvního souboru trvala devět sekund, takže dávkovač si myslel, že je o devět sekund pozadu, a poslal je všechny najednou. Spuštění hodin při zápisu prvního bajtu to opravilo: běh dlouhý 53 sekund vytvořil 53 sekund streamu.

Detail 2: zvuk na přechodu

Při přepnutí začal zvuk dalšího souboru 17 milisekund před koncem zvuku předchozího souboru. Kodér varoval, že jeho vstup jde „v čase pozpátku“, a multiplexer opravil časové razítko. Převzorkování pomocí aresample=async=1:min_hard_comp=0.01:first_pts=0 takové překryvy ořízne nebo doplní, než je uvidí kodér. Při běhu trvajícím něco přes minutu s pěti přepnutími všechna časová razítka zvuku i videa v přijatém streamu rostla a stream se dekodoval bez jediné chyby.

Detail 3: některá varování jsou normální

Každý soubor restartuje své čítače MPEG-TS a své hodiny, takže ffmpeg při každém přepnutí hlásí „Packet corrupt“ a „timestamp discontinuity“. Tyto řádky jsou očekávané a my je držíme mimo log, aby skutečné chyby vynikly.

Hlídač

Pokud ffmpeg skončí nebo se jeho průběh na minutu zastaví, stream se restartuje s rostoucími pauzami a po opakovaných selháních odešle zprávu. V našem testu jsme enkodér zabili ručně; stream byl zpět za sedm sekund a video přidané během běhu se zařadilo do rotace bez nutnosti znovu připojit. Restart je krátké znovu připojení, proto nastavte vysílání na YouTube tak, aby startovalo automaticky a automaticky se nezastavovalo. Streamovací klíč je maskován v každém řádku logu, včetně těch od ffmpegu. Studio dodává tento živý kanál jako službu systemd.

Aktualizováno: