Konfiguracja serwera streamingowego: jedno wysyłanie dla dowolnej liczby widzów

Opublikowano 9 min czytania

Wysyłasz do serwera jeden jedyny strumień, a serwer zasila nim wszystkich widzów. Twoje własne łącze przenosi dzięki temu zawsze tylko jedno wysyłanie, niezależnie od tego, czy patrzy dziesięć osób, czy tysiąc. Ten poradnik pokazuje budowę, protokoły i rachunek pasma, który za tym stoi.

Kto streamuje bez własnego serwera, wysyła swój obraz osobno do każdego widza. Dziesięciu widzów to dziesięć razy te same dane, stu widzów sto razy. Łącze wychodzące w domu albo w biurze jest przez to zapchane już po kilku widzach, a obraz zaczyna się zacinać, choć komputer się nudzi.

Serwer streamingowy odwraca ten układ: wysyłasz do serwera dokładnie jeden strumień, a serwer zasila nim wszystkich widzów. Twoje własne łącze przenosi dzięki temu zawsze tylko jedno jedyne wysyłanie, całkiem niezależnie od tego, czy patrzy dziesięć osób, czy dziesięć tysięcy. Ten artykuł pokazuje, dlaczego działa to tak dobrze, jak postawić taki serwer, które protokoły ile opóźnienia kosztują i ile transferu naprawdę się przy tym zbiera.

Problem: Twoje łącze wychodzące jest wąskim gardłem

Wideo to stały strumień. Strumień w 1080p przy 60 klatkach na sekundę potrzebuje, zależnie od treści, od 4,5 do 8 Mbit/s, 720p mieści się w 3 do 5 Mbit/s. Ten bitrate płynie na każdego widza osobno, cały czas, bez przerwy.

Przeciętne łącze domowe w Niemczech osiąga w górę od 10 do 50 Mbit/s, nawet wiele łączy światłowodowych kończy się w górę na 50 do 100 Mbit/s. Rachunek jest więc szybko zamknięty:

Widzowieprzy 3 Mbit/sprzy 6 Mbit/sŁącze domowe wystarczy?
515 Mbit/s30 Mbit/sna granicy
2060 Mbit/s120 Mbit/snie
100300 Mbit/s600 Mbit/snie
10003 Gbit/s6 Gbit/snie

Dochodzi do tego drugi problem, który często się przeocza: Twoje łącze dzieli się z wszystkim innym w domu albo w biurze. Gdy tylko ktoś wysyła duży plik albo startuje kopia zapasowa, strumień się załamuje. Serwer w centrum danych tego problemu nie ma, tam łącze stoi wyłącznie do Twojej dyspozycji.

Zasada: raz w górę, wielokrotnie w dół

Konstrukcja składa się z trzech części:

  • Nadajnik, czyli OBS, ffmpeg albo sprzętowy enkoder, wysyła jeden strumień do serwera. To się nazywa ingest.
  • Serwer przyjmuje ten jeden strumień, przekłada go na wybrany format odtwarzania i trzyma w gotowości.
  • Widzowie odbierają strumień z serwera. To się nazywa egress i jest tą częścią, która rośnie wraz z liczbą widzów.

Decydująca jest asymetria: drogę od Ciebie do serwera przechodzi się raz, drogę od serwera do widzów tysiąc razy. Dlatego Twoje łącze potrzebuje tylko tyle pasma w górę, ile zajmuje jeden strumień, natomiast serwer potrzebuje łącza, które nadąży za publicznością.

Ile transferu naprawdę się zbiera

Pasmo to tylko połowa rachunku. Ciekawszy jest wolumen, bo według niego wielu dostawców wystawia rachunki. Wzór jest prosty:

wolumen w GB = bitrate w Mbit/s × sekundy × widzowie ÷ 8000

Kilka realistycznych przykładów:

ScenariuszBitrateCzasWidzowieWolumen
Cotygodniowy wykład3 Mbit/s2 h50135 GB
Codzienna audycja6 Mbit/s3 h2001,6 TB na dobę
Kanał całodobowy4 Mbit/s24 h301,3 TB na dobę
Jednorazowe duże wydarzenie6 Mbit/s4 h200021,6 TB

Liczby w ostatniej kolumnie są powodem, dla którego streaming i rozliczanie według wolumenu pasują do siebie słabo. Jedna jedyna dobrze odwiedzona transmisja potrafi zużyć wolumen wliczony w cały miesiąc, a każdy kolejny terabajt jest wtedy liczony osobno. W taryfie z nielimitowanym transferem ten rachunek znika całkowicie: cena miesięczna jest ustalona, niezależnie od tego, czy przez łącze przejdzie 200 GB, czy 50 TB.

Jakie oprogramowanie do Ciebie pasuje

OprogramowanieMocna stronaDobrze nadaje się do
nginx z modułem RTMPlekki, stabilny, obsługuje RTMP i HLS jednocześnieklasyczny start, przekazywanie na platformy
MediaMTXjeden jedyny plik binarny, SRT i WebRTC od razu po instalacjiniskie opóźnienie bez wielkiego grzebania
SRSbardzo dużo funkcji, praca w klastrzewiększe instalacje z kilkoma węzłami
Owncastkompletne rozwiązanie z interfejsem webowym i czatemwłasna mała strona ze streamem

Na początek nginx z modułem RTMP jest wyborem najbardziej oczywistym: jest dostępny wszędzie, dobrze udokumentowany, a ten sam serwer możesz później bez przebudowy wykorzystać jako serwer WWW dla strony dla widzów.

Stawianie serwera streamingowego na nginx i RTMP

Instalacja

W Debianie i Ubuntu moduł przynosi pakiet libnginx-mod-rtmp, nie musisz niczego kompilować samodzielnie:

apt update
apt install -y nginx libnginx-mod-rtmp ffmpeg

W AlmaLinux i Rocky Linux moduł pochodzi z repozytorium EPEL:

dnf install -y epel-release
dnf install -y nginx nginx-mod-rtmp ffmpeg

Konfiguracja

Część RTMP stoi w pliku nginx.conf poza blokiem http, to najczęstszy błąd początkujących. Lekka, działająca wersja wygląda tak:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # HLS dla zwykłych widzów
            hls on;
            hls_path /var/www/stream/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;

            # nadawać wolno tylko z własnego adresu
            allow publish 203.0.113.10;
            deny publish all;

            # patrzeć może każdy
            allow play all;
        }
    }
}

Pliki HLS wydaje potem zwykły serwer WWW. Wystarczy do tego mały blok w części http:

server {
    listen 80;
    server_name stream.example.com;

    location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        root /var/www/stream;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
}

Utwórz katalog, sprawdź konfigurację, uruchom ponownie:

mkdir -p /var/www/stream/hls
chown -R www-data:www-data /var/www/stream
nginx -t && systemctl reload nginx

Otwieranie portów

RTMP działa na porcie 1935, wydawanie treści przez 80 i 443. Z nftables albo ufw:

ufw allow from 203.0.113.10 to any port 1935 proto tcp
ufw allow 80/tcp
ufw allow 443/tcp

Zwróć uwagę na pierwszą linię: port nadawania jest otwarty tylko dla Twojego własnego adresu. Otwarty na cały świat port RTMP zostanie znaleziony w ciągu kilku dni, bo całe zakresy adresów są automatycznie przeszukiwane, a wtedy ktoś inny nadaje przez Twoje łącze.

Nadawanie z OBS

W OBS, w Ustawieniach, w zakładce Transmisja, wpisz usługę „Własna”:

PoleWartość
Serwerrtmp://stream.example.com/live
Klucz strumieniadowolnie wybrana nazwa, na przykład kanal1

Bitrate ustawiasz w sekcji Wyjście. Jako wartości orientacyjne: 1080p60 przy 6000 kbit/s, 1080p30 przy 4500 kbit/s, 720p30 przy 3000 kbit/s. Ustaw odstęp między klatkami kluczowymi na 2 sekundy, inaczej przy HLS powstaną nieregularne segmenty i odtwarzacz będzie się zacinać przy przełączaniu.

Oglądanie

Strumień leży potem pod adresem https://stream.example.com/hls/kanal1.m3u8 i da się otworzyć dowolnym odtwarzaczem obsługującym HLS, w przeglądarce na przykład przez hls.js albo Video.js. Do szybkiego sprawdzenia wystarczy VLC przez „Otwórz strumień sieciowy”.

Nadawanie jednocześnie na kilka platform

To druga duża zaleta własnego serwera. Zamiast rozsadzać swoje łącze trzema równoległymi wysyłkami, wysyłasz raz do serwera, a ten rozdziela dalej. Dopisujesz do tego w bloku application jedną linię na każdy cel:

application live {
    live on;
    record off;

    push rtmp://live.plattform-a.example/app/STREAM_KEY;
    push rtmp://live.plattform-b.example/app/STREAM_KEY;
}

Twoje wysyłanie zostaje przy tym na jednym jedynym strumieniu. Zwielokrotnienie przejmuje serwer, a tam pasmo jest dokładnie tym, do czego on służy.

Opóźnienie: który protokół do czego

Opóźnienie powstaje niemal w całości po stronie odtwarzania, a nie nadawania. Warto to zrozumieć, bo wielu szuka w złym miejscu:

Sposób odtwarzaniaOpóźnieniePasuje do
HLS, ustawienia domyślne20 do 30 swykłady, nabożeństwa, sport bez zakładów
HLS z krótkimi segmentami6 do 10 szwykły kompromis
Low-Latency HLS2 do 5 stransmisje z czatem
SRTponiżej 1 sprzesył między lokalizacjami
WebRTCponiżej 0,5 srozmowy, aukcje, zdalne sterowanie

Im niższe opóźnienie, tym droższy staje się pojedynczy widz. HLS jest najtańszy, bo składa się ze zwykłych plików, które wyda każdy serwer WWW i każdy cache. WebRTC natomiast trzyma dla każdego widza otwarte osobne połączenie i kosztuje przez to wyraźnie więcej mocy obliczeniowej. Bierz niskie opóźnienie tylko tam, gdzie naprawdę go potrzebujesz.

Transkodowanie: kiedy się opłaca

Dopóki serwer tylko przekazuje strumień dalej, prawie nie potrzebuje mocy obliczeniowej. Jeden nowoczesny rdzeń obsługuje w ten sposób kilkuset widzów, wąskim gardłem jest wyłącznie łącze.

Gdy tylko zechcesz oferować kilka poziomów jakości, żeby mogli patrzeć także widzowie ze słabym połączeniem, sytuacja się zmienia. Każdy dodatkowy poziom musi zostać przeliczony:

ffmpeg -i rtmp://127.0.0.1/live/kanal1 \
  -c:v libx264 -preset veryfast -b:v 3000k -s 1280x720 -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_720 \
  -c:v libx264 -preset veryfast -b:v 1200k -s 854x480  -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_480

Licz się z dwoma do czterech rdzeniami na poziom. Trzy poziomy wiążą więc już osiem do dwunastu rdzeni na stałe. Przemyśl więc dokładnie, czy ich potrzebujesz: dla publiczności, która siedzi głównie przy komputerze albo w Wi-Fi, często wystarcza jeden dobrze wybrany poziom.

Zabezpieczenie: kto może nadawać

Serwer streamingowy jest widoczny z zewnątrz i zostanie znaleziony. Do codzienności wystarczą trzy działania:

  • Firewall na porcie nadawania. Na port 1935 wolno tylko Twojemu własnemu adresowi. Jeśli Twój adres się zmienia, użyj zamiast tego dostępu VPN do serwera.
  • Sprawdzanie klucza strumienia. Przez on_publish nginx wywołuje przy każdej próbie nadawania mały skrypt, który sprawdza klucz na liście i przy niezgodności odrzuca połączenie.
  • Podstawowa ochrona przed przeciążeniem. Serwer streamingowy jest atrakcyjnym celem, bo awaria jest natychmiast widoczna. W KernelHost na każdym serwerze leży ochrona przed zalewaniem o wydajności 3,2 Tbps, bez żadnej konfiguracji z Twojej strony. Więcej na stronie o ochronie DDoS.

Wybór lokalizacji i kilka serwerów

Serwer nie należy w Twoje sąsiedztwo, a w sąsiedztwo Twoich widzów. Twoje własne połączenie z serwerem zestawia się raz i potem działa stabilnie, nawet przez pół kontynentu. Natomiast połączenie do widzów decyduje o czasie ładowania i o tym, ilu zrezygnuje.

Jeśli Twoja publiczność siedzi głównie w Europie, lokalizacja w Niemczech jest właściwa. Gdy rozkłada się na kilka kontynentów, opłaca się drugi serwer i rozdzielanie przez DNS, tak żeby każdy widz trafiał na najbliższy. KernelHost oferuje do tego lokalizacje w Niemczech, na zachodnim i wschodnim wybrzeżu USA oraz w Singapurze i Korei Południowej, przegląd znajdziesz pod lokalizacje serwerów.

Jeśli rozdzielasz pliki, a nie obraz na żywo, czyli aktualizacje, zdjęcia albo archiwa wideo, właściwym narzędziem nie jest serwer streamingowy, a cache przed źródłem. Jak to działa, opisuje artykuł Budowa własnego serwera CDN.

Jaki serwer pasuje

Przy serwerze streamingowym liczy się inna kolejność niż przy serwerze WWW:

  1. Łącze i transfer. To jest wąskie gardło, i to zawsze. Prawdziwe łącze gigabitowe bez dławienia przenosi około 160 widzów przy 6 Mbit/s.
  2. Nielimitowany transfer. Taryfy rozliczane według wolumenu są przy streamingu praktycznie niemożliwe do policzenia, bo jeden jedyny udany wieczór zużywa wolumen miesiąca.
  3. Procesor. Drugorzędny, dopóki nie transkodujesz. Przy transkodowaniu staje się drugim wąskim gardłem.
  4. RAM i dysk. Najmniej krytyczne. Miejsce na dysku staje się tematem dopiero wtedy, gdy zachowujesz nagrania.

Dokładnie na ten przypadek skrojone są nasze serwery root z nielimitowanym transferem: prawdziwe łącze 2 × 1 Gbit/s na serwer, nielimitowany wolumen bez dławienia, stała cena miesięczna niezależna od przesłanej ilości danych oraz ochrona przed zalewaniem o wydajności 3,2 Tbps od razu po uruchomieniu. Serwer jest udostępniany w niecałe 30 sekund, z pełnym dostępem root, IPv4 i siecią IPv6 /64. Rozliczenie działa na zasadzie przedpłaty z możliwością rezygnacji co miesiąc, możesz więc zacząć od małej taryfy i rosnąć wtedy, gdy rośnie Twoja publiczność.

Najczęstsze pytania

Do czego w ogóle potrzebuję serwera streamingowego?
Bez serwera Twój komputer wysyła strumień osobno do każdego widza. Przy dziesięciu widzach i 6 Mbit/s to 60 Mbit/s wysyłania, przy stu już 600 Mbit/s. Typowe łącze domowe daje w górę od 10 do 50 Mbit/s. Z serwerem streamingowym wysyłasz dokładnie raz, a rozdzielanie przejmuje serwer.
Ile pasma potrzebuje serwer?
Pomnóż bitrate przez liczbę jednoczesnych widzów. 500 widzów przy 6 Mbit/s daje 3 Gbit/s. Ważniejszy od szczytu jest jednak miesięczny wolumen: ci sami 500 widzów generują w dwie godziny około 2,7 TB. Dlatego przy streamingu decydującą cechą jest nielimitowany transfer, a nie procesor.
Jakie oprogramowanie wybrać najlepiej?
Na początek nginx z modułem RTMP, bo jest lekki i obsługuje jednocześnie RTMP oraz HLS. MediaMTX to nowocześniejsza alternatywa z SRT i WebRTC od razu po instalacji. SRS ma najwięcej funkcji, wymaga jednak więcej nauki. Owncast to kompletne rozwiązanie z interfejsem webowym i czatem.
Jak duże jest opóźnienie?
RTMP do serwera kosztuje mniej niż sekundę. Opóźnienie powstaje niemal w całości po stronie odtwarzania: HLS z ustawieniami domyślnymi daje 20 do 30 sekund, z krótkimi segmentami 6 do 10, Low-Latency HLS 2 do 5. SRT i WebRTC schodzą poniżej jednej sekundy, kosztują za to więcej mocy obliczeniowej na widza.
Czy potrzebuję transkodowania i ile ono kosztuje?
Tylko wtedy, gdy chcesz oferować kilka poziomów jakości. Samo przekazywanie bez przeliczania prawie nie obciąża procesora, jeden rdzeń obsługuje setki widzów. Gdy strumień 1080p wydajesz dodatkowo w 720p i 480p, potrzebujesz na każdy poziom około dwóch do czterech nowoczesnych rdzeni. Planuj transkodowanie dopiero wtedy, gdy naprawdę go potrzebujesz.
Czy mogę nadawać jednocześnie na Twitcha i YouTube?
Tak, dokładnie do tego serwer się przydaje. Wysyłasz raz na swój serwer, a on przekazuje ten sam strumień do dowolnej liczby platform. W nginx-RTMP wystarczy na każdy cel jedna linia push. Twoje własne łącze przenosi przy tym nadal tylko jedno jedyne wysyłanie.
Jak nie dopuścić, żeby obcy nadawali na moim serwerze?
Ogranicz port przyjmowania strumienia w firewallu do własnego adresu i dodatkowo sprawdzaj klucz strumienia przez on_publish. Bez obu tych rzeczy każdy otwarty serwer RTMP w ciągu kilku dni zbierze obce transmisje, bo całe zakresy adresów są skanowane.
Gdzie powinien stać serwer?
Nie blisko Ciebie, a blisko Twoich widzów. Drogę od Ciebie do serwera przechodzi się raz, drogę od serwera do widzów tysiąc razy. Jeśli Twoja publiczność siedzi w Europie, serwer stoi w Europie. Gdy rozkłada się na kilka kontynentów, opłaca się drugi serwer i rozdzielanie przez DNS.
Wystarczy VPS, czy potrzebuję serwera dedykowanego?
Do samego przekazywania bez transkodowania bez problemu wystarczy VPS z kilkoma rdzeniami, bo wąskim gardłem jest łącze, a nie moc obliczeniowa. Dedykowany sprzęt opłaca się dopiero przy transkodowaniu kilku poziomów jakości albo przy wielu równoległych kanałach.
Jak sprawdzić, czy serwer wytrzyma obciążenie?
Uruchom transmisję i otwórz ją jednocześnie kilkoma narzędziami, na przykład ffmpeg w trybie jałowym. Obserwuj przy tym przepustowość sieci i obciążenie. Jeśli dojdziesz do granicy łącza, zanim procesor się rozgrzeje, rachunek się zgadza i potrzebujesz więcej pasma, a nie więcej rdzeni.

Streaming RTMP HLS SRT nginx OBS Restream Unlimited Traffic