24/7 prenos, ki se med videoposnetki ne ponovno vzpostavi: en ffmpeg, napajan prek cevi

Video

Živi kanal, ki non-stop predvaja dokončane videoposnetke, ima dve preprosti zasnovi, pri obeh pa nekaj zmanjka. Ponovni zagon ffmpeg za vsak videoposnetek ob vsakem preklopu prekine povezavo RTMP. Seznam predvajanja concat se prebere ob zagonu, zato nov videoposnetek čaka na naslednji ponovni zagon.

Zasnova

Vsak videoposnetek se enkrat pretvori v MPEG-TS pri ločljivosti in hitrosti sličic prenosa; navpični videoposnetek je postavljen na zamegljeno kopijo samega sebe namesto na črne pasove. En proces ffmpeg bere MPEG-TS s svojega standardnega vhoda in kodira s konstantno bitno hitrostjo s ključno sličico vsaki dve sekundi, kot to pričakuje vnos za prenos v živo. Majhen dovodnik piše pripravljene datoteke v to cev eno za drugo v realnem času, pri vsakem preklopu izbere naslednjo datoteko: najprej videoposnetki, ki še niso bili predvajani, nato tisti, ki so bili predvajani najdlje nazaj. MPEG-TS bralnik v ffmpeg vidi, da se časovne oznake vsake datoteke začnejo znova, in jih premakne, tako da njegov izhod teče brez prekinitve.

Podrobnost 1: tempo od prvega bajta

Naša prva različica je začela šteti čas ob zagonu ffmpeg. Priprava prve datoteke je trajala devet sekund, zato je dovodnik mislil, da zaostaja za devet sekund, in jih je poslal vse naenkrat. Začetek štetja ob prvem zapisanem bajtu je to popravil: 53-sekundni zagon je ustvaril 53 sekund prenosa.

Podrobnost 2: zvok na stiku

Ob preklopu se je zvok naslednje datoteke začel 17 milisekund pred koncem zvoka prejšnje datoteke. Kodirnik je opozoril, da vhod »potuje nazaj v času«, in multiplekser je popravil časovno oznako. Ponovno vzorčenje z aresample=async=1:min_hard_comp=0.01:first_pts=0 take prekrivajoče se dele pred kodiranjem skrajša ali dopolni. Pri zagonu, ki je trajal malo več kot minuto s petimi preklopi, so vse časovne oznake zvoka in videa v prejetem prenosu naraščale, prenos pa se je dekodiral brez napake.

Podrobnost 3: nekatera opozorila so normalna

Vsaka datoteka ponastavi svoje števec MPEG-TS in svojo uro, zato ffmpeg ob vsakem preklopu poroča »Packet corrupt« in »timestamp discontinuity«. Te vrstice so pričakovane in jih iz loga izločimo, da se resnične napake jasno izpostavijo.

Varuh

Če ffmpeg zaključi delovanje ali se njegov napredek ustavi za minuto, se pretok znova zažene z naraščajočimi premori in pošlje sporočilo po ponavljajočih se napakah. V našem testu smo kodirnik ročno ustavili; pretok je bil nazaj sedem sekund pozneje, video, dodan med izvajanjem, pa se je pridružil rotaciji brez ponovne povezave. Ponovni zagon je kratka ponovna povezava, zato nastavite prenos v živo na YouTubu, da se začne samodejno in ne ustavi samodejno. Ključ pretoka je v vsaki vrstici dnevnika zamaskiran, vključno z lastnim dnevnikom ffmpeg. Studio ta prenos v živo dobavi kot storitev systemd.

Posodobljeno: