En 24/7-ström som inte återansluter mellan videor: en ffmpeg matad via ett rör
Video
En livekanal som spelar färdiga videor dygnet runt har två enkla konstruktioner, och båda tappar något. Att starta om ffmpeg för varje video tappar RTMP-anslutningen vid varje byte. En concat-spellista läses in en gång vid start, så en ny video väntar på nästa omstart.
Konstruktionen
Varje video konverteras en gång till MPEG-TS i strömmens storlek och bildfrekvens; en vertikal video ligger på en suddig kopia av sig själv i stället för svarta fält. En ffmpeg-process läser MPEG-TS från sin standardinmatning och kodar med konstant bitrate med en nyckelbildruta varannan sekund, som liveingest förväntar sig. En liten matarskrift skriver de förberedda filerna i det röret en efter en, i realtidstakt, och väljer nästa fil vid varje byte: videor som aldrig spelats först, sedan den som spelades minst nyligen. Ffmpeg:s MPEG-TS-läsare ser att varje filers tidsstämplar börjar om och förskjuter dem, så att utdatan fortsätter utan avbrott.
Detalj ett: takt från första byte
Vår första version startade klockan när ffmpeg startade. Att förbereda den första filen tog nio sekunder, så matarskriften trodde att den var nio sekunder efter och skickade alla på en gång. Att starta klockan vid första byte som skrivits löste det: en körning på 53 sekunder producerade 53 sekunder av ström.
Detalj två: ljudet vid skarven
Vid ett byte började nästa filers ljud 17 millisekunder innan föregående filers ljud slutade. Kodaren varnade för att inmatningen gick ”bakåt i tiden” och muxern lagade en tidsstämpel. Omprovning med aresample=async=1:min_hard_comp=0.01:first_pts=0 beskär eller fyller ut sådana överlappningar innan kodaren ser dem. I en körning på strax över en minut med fem byten steg varje ljud- och videotidsstämpel i den mottagna strömmen, och strömmen avkodades utan ett enda fel.
Detalj tre: vissa varningar är normala
Varje fil startar om sina MPEG-TS-räknare och sin klocka, så ffmpeg rapporterar ”Packet corrupt” och ”timestamp discontinuity” vid varje byte. Dessa rader förväntas, och vi håller dem utanför loggen så att riktiga fel framträder tydligt.
Bevakningsprocessen
Om ffmpeg avslutas eller om dess förlopp stannar av i en minut startas strömmen om med allt längre pauser och ett meddelande skickas efter upprepade fel. I vårt test dödade vi kodaren manuellt; strömmen var tillbaka efter sju sekunder, och en video som lades till under körningen anslöt sig till rotationen utan omkoppling. En omstart är en kort omkoppling, så ställ in YouTube-sändningen så att den startar automatiskt och inte stoppar automatiskt. Strömmenyckeln är maskerad i varje loggraderad, även i ffmpegs egna. Studio levererar denna livekanal som en systemd-tjänst.