Strumień 24/7, który nie rozłącza się między filmami: jeden ffmpeg zasilany przez potok

Wideo

Kanał na żywo, który odtwarza gotowe filmy przez całą dobę, ma dwa proste warianty, a oba coś tracą. Restartowanie ffmpeg dla każdego filmu zrywa połączenie RTMP przy każdej zmianie. Lista odtwarzania concat jest odczytywana raz na starcie, więc nowy film czeka na kolejny restart.

Rozwiązanie

Każdy film jest konwertowany raz do formatu MPEG-TS w rozmiarze i przy częstotliwości klatek strumienia; film pionowy jest osadzony na rozmytej kopii samego siebie zamiast na czarnych paskach. Jeden proces ffmpeg odczytuje MPEG-TS ze standardowego wejścia i koduje przy stałej przepływności z klatką kluczową co dwie sekundy, zgodnie z oczekiwaniami wejścia na żywo. Mały moduł podający zapisuje przygotowane pliki do tego potoku jeden po drugim, w tempie rzeczywistym, wybierając następny plik przy każdej zmianie: najpierw filmy nigdy nieodtwarzane, a następnie te odtwarzane najdawniej. Czytnik MPEG-TS w ffmpeg widzi, że znaczniki czasu każdego pliku zaczynają się od nowa, i przesuwa je, dzięki czemu jego wyjście działa bez przerwy.

Szczegół pierwszy: tempo od pierwszego bajtu

Nasza pierwsza wersja uruchamiała zegar w momencie startu ffmpeg. Przygotowanie pierwszego pliku zajęło dziewięć sekund, więc moduł podający uznał, że jest dziewięć sekund w tyle, i wysłał wszystko naraz. Uruchomienie zegara przy pierwszym zapisanym bajcie naprawiło to: 53-sekundowy przebieg dał 53 sekundy strumienia.

Szczegół drugi: dźwięk na styku

Przy zmianie dźwięk następnego pliku zaczynał się 17 milisekund przed zakończeniem dźwięku poprzedniego pliku. Enkoder ostrzegał, że jego wejście cofa się „w czasie”, a multiplekser łatał znacznik czasu. Resampling z aresample=async=1:min_hard_comp=0.01:first_pts=0 przycina lub uzupełnia takie nakładki, zanim zobaczy je enkoder. W przebiegu trwającym nieco ponad minutę z pięcioma zmianami każdy znacznik czasu dźwięku i obrazu w odebranym strumieniu rósł, a strumień został zdekodowany bez ani jednego błędu.

Szczegół trzeci: niektóre ostrzeżenia są normalne

Każdy plik restartuje swoje liczniki MPEG-TS i swój zegar, więc ffmpeg zgłasza „Packet corrupt” i „timestamp discontinuity” przy każdej zmianie. Te linie są oczekiwane i pomijamy je w logu, aby prawdziwe błędy były widoczne.

Watchdog

Jeśli ffmpeg zakończy działanie lub jego postęp zatrzyma się na minutę, strumień restartuje się z coraz dłuższymi przerwami i wysyła wiadomość po powtarzających się awariach. W naszym teście ręcznie zabiliśmy enkoder; strumień wrócił siedem sekund później, a wideo dodane w trakcie pracy dołączyło do rotacji bez ponownego łączenia. Restart to krótkie ponowne połączenie, więc ustaw transmisję na YouTube tak, aby startowała automatycznie i nie zatrzymywała się automatycznie. Klucz strumienia jest zamaskowany w każdej linii logu, łącznie z logami samego ffmpeg. Studio dostarcza ten kanał na żywo jako usługę systemd.

Zaktualizowano: