24/7 strim koji se ne ponovo povezuje između videa: jedan ffmpeg napajan kroz cev

Video

Live kanal koji non-stop prikazuje gotove videe ima dva jednostavna dizajna, i oba nešto propuštaju. Ponovno pokretanje ffmpeg-a za svaki video prekida RTMP vezu pri svakom prebacivanju. Concat playlista se čita jednom pri startu, pa novi video čeka sledeće ponovno pokretanje.

Dizajn

Svaki video se konvertuje jednom u MPEG-TS na rezoluciji i broju kadrova strima; vertikalni video se prikazuje na zamućenoj kopiji samog sebe umesto na crnim trakama. Jedan ffmpeg proces čita MPEG-TS sa svog standardnog ulaza i enkoduje konstantnim bitrejtom sa ključnim kadrom na svake dve sekunde, kako to očekuje live ingest. Mali feeder upisuje pripremljene fajlove u tu cev jedan za drugim, u realnom vremenu, birajući sledeći fajl pri svakom prebacivanju: videi koji nikada nisu prikazani prvi, pa zatim oni najmanje nedavno prikazani. ffmpeg-ov MPEG-TS čitalac vidi da se vremenske oznake svakog fajla resetuju i pomera ih, tako da njegov izlaz teče bez prekida.

Detal jedan: ritam od prvog bajta

Naša prva verzija je pokretala sat kada se ffmpeg pokrenuo. Priprema prvog fajla je trajala devet sekundi, pa je feeder mislio da kasni devet sekundi i poslao ih sve odjednom. Pokretanje sata pri upisu prvog bajta je rešilo problem: trčanje od 53 sekunde je proizvelo 53 sekunde strima.

Detal dva: audio na spoju

Pri prebacivanju, audio sledećeg fajla je počinjao 17 milisekundi pre nego što je audio prethodnog fajla završio. Enkoder je upozorio da njegov ulaz ide „nazad u vremenu“, a muxe je ispravio vremensku oznaku. Resampling sa aresample=async=1:min_hard_comp=0.01:first_pts=0 skraćuje ili dodaje takva preklapanja pre nego što ih enkoder vidi. U trčanju od malo više od minuta sa pet prebacivanja, svaka vremenska oznaka zvuka i videa u primljenom strimu je rasla, a strim je dekodiran bez ijedne greške.

Detal tri: neka upozorenja su normalna

Svaki fajl resetuje svoje MPEG-TS brojače i svoj sat, pa ffmpeg prijavljuje „Packet corrupt“ i „timestamp discontinuity“ pri svakom prebacivanju. Ove linije su očekivane i mi ih izbacujemo iz loga kako bi se prave greške istakle.

Nadzorni proces

Ako ffmpeg izađe ili mu napredak stane na minut, strim se restartuje sa sve dužim pauzama i šalje poruku nakon ponovljenih neuspeha. U našem testu ručno smo ubili enkoder; strim se vratio sedam sekundi kasnije, a video dodat tokom rada pridružio se rotaciji bez ponovnog povezivanja. Restart je kratko ponovno povezivanje, pa podesite da se YouTube prenos automatski pokreće i da se ne zaustavlja automatski. Ključ strima je maskiran u svakoj liniji loga, uključujući i one koje generiše ffmpeg. Studio isporučuje ovaj live kanal kao systemd servis.

Ažurirano: