Een 24/7-stream die tussen video's niet opnieuw verbindt: één ffmpeg gevoed via een pipe
Video
Een live-kanaal dat voltooide video's dag en nacht afspeelt, heeft twee eenvoudige ontwerpen, en beide laten iets vallen. ffmpeg opnieuw starten voor elke video verliest de RTMP-verbinding bij elke wissel. Een concat-playlist wordt één keer bij de start gelezen, dus een nieuwe video wacht op de volgende herstart.
Het ontwerp
Elke video wordt één keer omgezet naar MPEG-TS op de resolutie en framerate van de stream; een verticale video staat op een vervaagde kopie van zichzelf in plaats van op zwarte balken. Eén ffmpeg-proces leest MPEG-TS van zijn standaard invoer en codeert met een constante bitrate met een keyframe elke twee seconden, zoals live-ingest verwacht. Een kleine feeder schrijft de voorbereide bestanden één voor één in die pipe, op real-time tempo, en kiest bij elke wissel het volgende bestand: video's die nog niet zijn afgespeeld, daarna de minst recent afgespeelde. De MPEG-TS-lezer van ffmpeg ziet dat de tijdstempels van elk bestand opnieuw beginnen en verschuift ze, zodat de uitvoer zonder onderbreking doorloopt.
Detail één: tempo vanaf de eerste byte
Onze eerste versie startte de klok toen ffmpeg startte. Het voorbereiden van het eerste bestand duurde negen seconden, dus de feeder dacht dat hij negen seconden achterliep en stuurde ze allemaal tegelijk. De klok starten bij de eerste geschreven byte loste dit op: een run van 53 seconden produceerde 53 seconden stream.
Detail twee: de audio bij de overgang
Bij een wissel begon de audio van het volgende bestand 17 milliseconden voordat de audio van het vorige bestand eindigde. De encoder waarschuwde dat de invoer "achteruit in de tijd" ging en de muxer repareerde een tijdstempel. Resampling met aresample=async=1:min_hard_comp=0.01:first_pts=0 knipt of vult dergelijke overlappingen bij voordat de encoder ze ziet. In een run van iets meer dan een minuut met vijf wissels stegen alle audio- en videotijdstempels in de ontvangen stream, en de stream werd zonder één enkele fout gedecodeerd.
Detail drie: sommige waarschuwingen zijn normaal
Elk bestand start zijn MPEG-TS-tellers en zijn klok opnieuw, dus ffmpeg meldt "Packet corrupt" en "timestamp discontinuity" bij elke wissel. Deze regels zijn verwacht, en we houden ze uit het logboek zodat echte fouten opvallen.
De watchdog
Als ffmpeg afsluit of de voortgang een minuut stilvalt, start de stream opnieuw met oplopende pauzes en wordt er na herhaalde mislukkingen een bericht verzonden. In onze test hebben we de encoder handmatig afgebroken; de stream was zeven seconden later terug, en een video die tijdens het draaien werd toegevoegd, sloot zich aan bij de rotatie zonder opnieuw verbinding te maken. Een herstart is een korte herverbinding, dus stel de YouTube-uitzending zo in dat deze automatisch start en niet automatisch stopt. De stream key is in elke logregel gemaskeerd, inclusief die van ffmpeg zelf. Studio levert dit livekanaal als systemd-service.