Un flux 24/7 care nu se reconectează între videoclipuri: un singur ffmpeg alimentat printr-o conductă
Video
Un canal live care difuzează videoclipuri finite non-stop are două designuri simple, iar ambele pierd ceva. Repornirea ffmpeg pentru fiecare videoclip întrerupe conexiunea RTMP la fiecare comutare. O listă de redare concat este citită o singură dată la pornire, astfel încât un videoclip nou așteaptă următoarea repornire.
Designul
Fiecare videoclip este convertit o singură dată în MPEG-TS la dimensiunea și rata de cadre ale fluxului; un videoclip vertical este plasat peste o copie estompată a sa, în loc de benzi negre. Un proces ffmpeg citește MPEG-TS de la intrarea standard și codifică la o rată de biți constantă, cu un keyframe la fiecare două secunde, așa cum se așteaptă ingestia live. Un mic alimentator scrie fișierele pregătite în acea conductă, unul după altul, în timp real, alegând fișierul următor la fiecare comutare: videoclipuri niciodată redate primele, apoi cele redate cel mai rar. Cititorul MPEG-TS al ffmpeg observă că marcajele de timp ale fiecărui fișier încep de la zero și le deplasează, astfel încât ieșirea rulează fără întrerupere.
Detaliul unu: ritmul pornit de la primul octet
Prima noastră versiune pornea ceasul când pornea ffmpeg. Pregătirea primului fișier a durat nouă secunde, astfel încât alimentatorul a crezut că este cu nouă secunde în urmă și le-a trimis pe toate deodată. Pornirea ceasului la primul octet scris a rezolvat problema: o rulare de 53 de secunde a produs 53 de secunde de flux.
Detaliul doi: sunetul la îmbinare
La o comutare, sunetul fișierului următor începea cu 17 milisecunde înainte ca sunetul fișierului anterior să se termine. Codificatorul a avertizat că intrarea sa mergea „înapoi în timp”, iar muxerul a corectat marcajul de timp. Reeșantionarea cu aresample=async=1:min_hard_comp=0.01:first_pts=0 taie sau completează astfel de suprapuneri înainte ca codificatorul să le vadă. Într-o rulare de puțin peste un minut cu cinci comutări, fiecare marcaj de timp audio și video din fluxul primit a crescut, iar fluxul a fost decodat fără nicio eroare.
Detaliul trei: unele avertismente sunt normale
Fiecare fișier reia contoarele MPEG-TS și ceasul, astfel încât ffmpeg raportează „Packet corrupt” și „timestamp discontinuity” la fiecare comutare. Aceste linii sunt așteptate și le ținem în afara jurnalului, astfel încât erorile reale să iasă în evidență.
Watchdog
Dacă ffmpeg se oprește sau progresul lui se întrerupe timp de un minut, fluxul repornește cu pauze din ce în ce mai mari și trimite un mesaj după eșecuri repetate. În testul nostru, am oprit manual codificatorul; fluxul a revenit după șapte secunde, iar un videoclip adăugat în timpul rulării s-a alăturat rotației fără reconectare. O repornire este o reconectare scurtă, deci configurați difuzarea pe YouTube pentru a porni automat și a nu se opri automat. Cheia de flux este mascată în fiecare linie de jurnal, inclusiv în cele ale lui ffmpeg. Studio livrează acest canal live ca serviciu systemd.