24/7-suoratoisto, joka ei yhdistä uudelleen videoiden välillä: yksi ffmpeg putken läpi
Video
Kanava, joka toistaa valmiita videoita vuorokauden ympäri, on toteutettavissa kahdella yksinkertaisella tavalla, ja molemmissa jokin menee rikki. ffmpeg:n käynnistäminen uudelleen joka videon jälkeen katkaisee RTMP-yhteyden jokaisella vaihdolla. Concat-soittolista luetaan kerran käynnistyksessä, joten uusi video joutuu odottamaan seuraavaa uudelleenkäynnistystä.
Ratkaisu
Jokainen video muunnetaan kerran MPEG-TS-muotoon suoratoiston resoluutioon ja kuvataajuuteen; pystysuora video asetetaan sumennetun kopionsa päälle mustien reunojen sijaan. Yksi ffmpeg-prosessi lukee MPEG-TS-dataa vakiosyötteestä ja koodaa sen vakiospeedrateella avainkuvalla kahden sekunnin välein, kuten suoratoiston vastaanotto edellyttää. Pieni syöttöohjelma kirjoittaa valmiit tiedostot putkeen peräkkäin reaaliaikaisella tahdilla ja valitsee seuraavan tiedoston jokaisella vaihdolla: ensin vielä toistamattomat videot, sitten pisimpään toistamattomat. ffmpeg:n MPEG-TS-lukija näkee, että kunkin tiedoston aikaleimat alkavat alusta, ja siirtää ne, joten tulos jatkuu katkeamatta.
Yksityiskohta 1: tahti ensimmäisestä tavusta
Ensimmäisessä versiossa kello käynnistettiin ffmpeg:n käynnistyessä. Ensimmäisen tiedoston valmistelu kesti yhdeksän sekuntia, joten syöttöohjelma luuli olevansa yhdeksän sekuntia jäljessä ja lähetti ne kaikki kerralla. Kellon käynnistäminen ensimmäisestä kirjoitetusta tavusta korjasi asian: 53 sekunnin ajossa syntyi 53 sekuntia suoratoistoa.
Yksityiskohta 2: ääni saumassa
Vaihdossa seuraavan tiedoston ääni alkoi 17 millisekuntia ennen edellisen tiedoston äänen päättymistä. Koodautaja varoitti, että syöte meni "ajassa taaksepäin", ja muxer korjasi aikaleiman. Uudelleennäytteistys asetuksella aresample=async=1:min_hard_comp=0.01:first_pts=0 leikkaa tai täydentää tällaiset päällekkäisyydet ennen kuin koodautaja näkee ne. Reilun minuutin ajossa, jossa oli viisi vaihtoa, kaikki vastaanotetun suoratoiston ääni- ja videoaikaleimat nousivat, ja suoratoisto dekoodattiin ilman yhtään virhettä.
Yksityiskohta 3: jotkin varoitukset ovat normaaleja
Jokainen tiedosto käynnistää MPEG-TS-laskimensa ja kellonsa uudelleen, joten ffmpeg ilmoittaa "Packet corrupt" ja "timestamp discontinuity" jokaisessa vaihdossa. Nämä rivit ovat odotettuja, ja pidämme ne pois lokista, jotta todelliset virheet erottuvat.
Vahti
Jos ffmpeg sulkeutuu tai sen eteneminen pysähtyy minuutiksi, striimi käynnistyy uudelleen kasvavilla tauoilla ja lähettää viestin toistuvien epäonnistumisten jälkeen. Testissämme sammutimme koodaimen käsin; striimi oli takaisin seitsemän sekunnin kuluttua, ja kesken ajon lisätty video liittyi kiertoon ilman uudelleenyhteyttä. Uudelleenkäynnistys on lyhyt uudelleenyhteys, joten aseta YouTube-lähetyksen käynnistyvän automaattisesti eikä pysähtyvän automaattisesti. Striimiavain on peitetty jokaisessa lokirivillä, myös ffmpegin omassa. Studio toimittaa tämän livestriimin systemd-palveluna.