Configurezi un server de streaming: un upload pentru oricâți spectatori

Publicat pe 10 min de citit

Trimiți un singur flux către server, iar serverul alimentează cu el toți spectatorii. Linia ta duce astfel mereu un singur upload, fie că privesc zece oameni, fie că privesc o mie. Ghidul arată structura, protocoalele și calculul de bandă din spate.

Cine transmite fără un server propriu își trimite imaginea separat către fiecare spectator. Zece spectatori înseamnă de zece ori aceleași date, o sută de spectatori de o sută de ori. Uploadul de acasă sau din birou este astfel înfundat după câțiva spectatori, iar imaginea începe să se întrerupă, deși calculatorul nu are aproape nimic de făcut.

Un server de streaming întoarce situația: tu trimiți către server exact un flux, iar serverul alimentează cu el toți spectatorii. Linia ta duce astfel mereu un singur upload, complet indiferent dacă privesc zece sau zece mii de oameni. Articolul arată de ce funcționează atât de bine, cum ridici un astfel de server, ce întârziere costă fiecare protocol și cât trafic se adună în realitate.

Problema: uploadul tău este punctul de strangulare

Videoul este un flux continuu. Un flux în 1080p cu 60 de imagini pe secundă are nevoie, în funcție de conținut, de 4,5 până la 8 Mbit/s, 720p stă între 3 și 5 Mbit/s. Acest bitrate curge pentru fiecare spectator, tot timpul, fără pauză.

O conexiune casnică medie în Germania duce la upload între 10 și 50 Mbit/s, iar chiar și multe racorduri de fibră optică stau la upload între 50 și 100 Mbit/s. De aceea socoteala se termină repede:

Spectatorila 3 Mbit/sla 6 Mbit/sAjunge conexiunea casnică?
515 Mbit/s30 Mbit/sla limită
2060 Mbit/s120 Mbit/snu
100300 Mbit/s600 Mbit/snu
10003 Gbit/s6 Gbit/snu

Mai apare o a doua problemă, trecută deseori cu vederea: racordul tău împarte această linie cu tot restul din casă sau din birou. Din clipa în care cineva încarcă un fișier mare sau pornește un backup, fluxul se prăbușește. Un server din centrul de date nu are problema asta, acolo conectivitatea îți stă la dispoziție exclusiv ție.

Principiul: o dată în sus, de multe ori în jos

Structura are trei părți:

  • Emițătorul, adică OBS, ffmpeg sau o cutie hardware, trimite un flux către server. Asta se numește ingest.
  • Serverul preia acest singur flux, îl trece în formatul de livrare dorit și îl ține pregătit.
  • Spectatorii își iau fluxul de la server. Asta se numește egress și este partea care crește odată cu numărul de spectatori.

Decisivă este asimetria: drumul de la tine la server se face o singură dată, drumul de la server la spectatori de mii de ori. De aceea racordul tău are nevoie doar de atât upload cât cere un singur flux, în timp ce serverul are nevoie de o conectivitate care ține pasul cu publicul.

Cât trafic se adună în realitate

Banda este doar jumătate din socoteală. Mai interesant este volumul, pentru că la mulți furnizori factura se face după el. Formula este simplă:

Volum în GB = bitrate în Mbit/s × secunde × spectatori ÷ 8000

Câteva exemple realiste:

ScenariuBitrateDuratăSpectatoriVolum
Prezentare săptămânală3 Mbit/s2 h50135 GB
Emisiune zilnică6 Mbit/s3 h2001,6 TB pe zi
Canal continuu, non-stop4 Mbit/s24 h301,3 TB pe zi
Eveniment mare, singular6 Mbit/s4 h200021,6 TB

Cifrele din ultima coloană sunt motivul pentru care streamingul și facturarea la volum se potrivesc prost. O singură transmisiune bine vizitată poate consuma volumul inclus al unei luni întregi, iar fiecare terabyte în plus se socotește apoi separat. La un tarif cu trafic nelimitat socoteala asta dispare complet: prețul lunar este fix, fie că trec 200 GB, fie că trec 50 TB pe linie.

Ce software ți se potrivește

SoftwarePunct fortePotrivit pentru
nginx cu modulul RTMPzvelt, stabil, poate RTMP și HLS în același timpintrarea clasică, retransmisia către platforme
MediaMTXun singur fișier binar, SRT și WebRTC din fabricăîntârziere mică fără multă bătaie de cap
SRSfoarte multe funcții, capabil de clustermontaje mai mari, cu mai multe noduri
Owncastsoluție completă, cu interfață web și chatpropriul site mic de streaming

Pentru început, nginx cu modulul RTMP este alegerea cea mai la îndemână: este disponibil peste tot, bine documentat, iar același server îl poți folosi mai târziu, fără modificări, ca server web pentru pagina spectatorilor.

Ridici un server de streaming cu nginx și RTMP

Instalare

Pe Debian și Ubuntu, pachetul libnginx-mod-rtmp aduce modulul cu el, nu trebuie să compilezi nimic:

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

Pe AlmaLinux și Rocky Linux, modulul vine din depozitul EPEL:

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

Configurare

Partea RTMP stă în nginx.conf în afara blocului http, asta este cea mai frecventă greșeală de început. O variantă zveltă și funcțională arată așa:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # HLS pentru spectatorii normali
            hls on;
            hls_path /var/www/stream/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;

            # se poate publica doar de la propria adresă
            allow publish 203.0.113.10;
            deny publish all;

            # privit are voie oricine
            allow play all;
        }
    }
}

Fișierele HLS le livrează apoi serverul web normal. Pentru asta ajunge un bloc mic în partea 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 *;
    }
}

Creezi directorul, verifici configurația, repornești:

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

Deschizi porturile

RTMP merge pe portul 1935, livrarea trece prin 80 și 443. Cu nftables sau ufw:

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

Fii atent la prima linie: portul de publicare este deschis doar pentru propria adresă. Un port RTMP deschis către toată lumea este găsit în câteva zile, pentru că intervale întregi de adrese sunt scanate automat, iar atunci transmite altcineva pe linia ta.

Transmiți cu OBS

În OBS, la Setări, Transmisiune, treci serviciul „Personalizat”:

CâmpValoare
Serverrtmp://stream.example.com/live
Cheie de streamun nume ales de tine, de exemplu kanal1

La Ieșire setezi bitrate-ul. Ca reper: 1080p60 cu 6000 kbit/s, 1080p30 cu 4500 kbit/s, 720p30 cu 3000 kbit/s. Pune distanța dintre keyframe-uri la 2 secunde, altfel la HLS apar segmente neregulate și playerul se bâlbâie la comutare.

Privești transmisiunea

Fluxul stă apoi la https://stream.example.com/hls/kanal1.m3u8 și se deschide cu orice player care știe HLS, în browser de exemplu cu hls.js sau Video.js. Pentru o verificare rapidă ajunge VLC, prin „Deschide flux de rețea”.

Transmiți simultan către mai multe platforme

Acesta este al doilea mare avantaj al unui server propriu. În loc să îți arunci linia în aer cu trei uploaduri paralele, trimiți o dată către server, iar el distribuie mai departe. Pentru asta completezi în blocul application o linie pentru fiecare destinație:

application live {
    live on;
    record off;

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

Uploadul tău rămâne la un singur flux. Multiplicarea o preia serverul, iar acolo banda este exact lucrul pentru care există.

Întârzierea: ce protocol pentru ce

Întârzierea apare aproape integral la livrare, nu la transmitere. Este important de înțeles, pentru că mulți caută în locul greșit:

Cale de livrareÎntârzierePotrivit pentru
HLS, setare implicită20 până la 30 sprezentări, slujbe, sport fără pariuri
HLS cu segmente scurte6 până la 10 scompromisul obișnuit
Low-Latency HLS2 până la 5 stransmisiuni cu chat
SRTsub 1 saducerea semnalului între locații
WebRTCsub 0,5 sdiscuții, licitații, telecomandă

Cu cât întârzierea este mai mică, cu atât devine mai scump fiecare spectator. HLS este cel mai ieftin, pentru că este făcut din fișiere simple, pe care orice server web și orice cache le pot livra. WebRTC ține în schimb o conexiune proprie deschisă pentru fiecare spectator și costă astfel mult mai multă putere de calcul. Ia întârzierea mică numai acolo unde ai nevoie de ea cu adevărat.

Transcodarea: când merită

Cât timp serverul doar retransmite fluxul, nu are nevoie aproape de nicio putere de calcul. Un singur nucleu modern servește în felul acesta câteva sute de spectatori, singura strangulare este conectivitatea.

Din clipa în care vrei să oferi mai multe niveluri de calitate, ca să poată privi și spectatorii cu conexiune slabă, lucrurile se schimbă. Fiecare nivel suplimentar trebuie calculat:

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

Socotește două până la patru nuclee pe nivel. Trei niveluri leagă astfel permanent între opt și douăsprezece nuclee. De aceea gândește-te bine dacă ai nevoie de ele: pentru un public care stă în majoritate la calculator sau în WLAN ajunge deseori un singur nivel, bine ales.

Securizare: cine are voie să transmită

Un server de streaming este vizibil din afară și va fi găsit. Trei măsuri ajung pentru uzul zilnic:

  • Firewall pe portul de publicare. Doar propria adresă are voie pe 1935. Dacă adresa ta se schimbă, folosește în locul ei un acces VPN către server.
  • Verifică cheia de stream. Cu on_publish, nginx apelează la fiecare încercare de publicare un script mic, care compară cheia cu o listă și refuză orice nepotrivire.
  • Protecție de bază împotriva supraîncărcării. Un server de streaming este o țintă atractivă, pentru că o cădere se vede imediat. La KernelHost, o protecție antiflood cu 3,2 Tbps capacitate stă în fața fiecărui server, fără să fie nevoie să configurezi ceva. Mai multe pe pagina despre protecția DDoS.

Alegerea locației și mai multe servere

Serverul nu stă în apropierea ta, ci în apropierea spectatorilor tăi. Propria ta conexiune către server se stabilește o singură dată și apoi merge stabil, chiar și peste jumătate de continent. Conexiunea către spectatori decide în schimb timpul de încărcare și rata de abandon.

Dacă publicul tău stă în majoritate în Europa, o locație în Germania este cea potrivită. Dacă se întinde peste mai multe continente, merită un al doilea server și o distribuție prin DNS, astfel încât fiecare spectator să ajungă la cel mai apropiat. KernelHost oferă pentru asta locații în Germania, pe Coasta de Vest a SUA, pe Coasta de Est a SUA, precum și în Singapore și Coreea de Sud, iar o privire de ansamblu găsești la locațiile serverelor.

Dacă distribui fișiere în loc de imagini live, adică actualizări, imagini sau arhive video, unealta potrivită nu este un server de streaming, ci un cache în fața originii. Cum funcționează asta stă în articolul Construiește-ți propriul server CDN.

Ce server se potrivește

Pentru un server de streaming contează o altă ordine decât la un server web:

  1. Conectivitate și trafic. Aici este strangularea, și anume mereu. O conectivitate gigabit reală, fără limitare, duce în jur de 160 de spectatori la 6 Mbit/s.
  2. Trafic nelimitat. Tarifele bazate pe volum sunt greu de calculat la streaming, pentru că o singură seară reușită consumă volumul lunar.
  3. Procesorul. Secundar, cât timp nu transcodezi. La transcodare devine a doua strangulare.
  4. RAM și disc. Cel mai puțin critice. Spațiul pe disc devine o temă abia când păstrezi înregistrări.

Exact pe acest caz sunt croite serverele root cu trafic nelimitat de la noi: conectivitate reală de 2 × 1 Gbit/s pe server, volum nelimitat fără limitare de viteză, un preț lunar fix independent de cantitatea transferată și 3,2 Tbps protecție antiflood din fabrică. Serverul este livrat în mai puțin de 30 de secunde, cu acces root complet, IPv4 și o rețea IPv6 /64. Facturarea se face pe bază PrePaid și se poate anula lunar, deci poți începe cu un tarif mic și crește atunci când publicul tău crește.

Întrebări frecvente

De ce am nevoie de un server de streaming?
Fără server, calculatorul tău trimite fluxul separat către fiecare spectator. La zece spectatori și 6 Mbit/s asta înseamnă 60 Mbit/s de upload, la o sută deja 600 Mbit/s. O conexiune casnică obișnuită duce între 10 și 50 Mbit/s la upload. Cu un server de streaming trimiți exact o singură dată, iar distribuția o preia serverul.
De câtă bandă are nevoie serverul?
Înmulțește bitrate-ul cu numărul de spectatori simultani. 500 de spectatori la 6 Mbit/s dau 3 Gbit/s. Mai important decât vârful este însă volumul lunar: aceiași 500 de spectatori generează în două ore în jur de 2,7 TB. De aceea, la streaming caracteristica decisivă este traficul nelimitat, nu procesorul.
Ce software este cel mai potrivit?
Pentru început nginx cu modulul RTMP, pentru că este zvelt și poate RTMP și HLS în același timp. MediaMTX este alternativa mai modernă, cu SRT și WebRTC din fabrică. SRS oferă cele mai multe funcții, dar cere mai mult studiu. Owncast este o soluție completă, cu interfață web și chat.
Cât de mare este întârzierea?
RTMP către server costă sub o secundă. Întârzierea apare aproape integral la livrare: HLS cu setările implicite stă între 20 și 30 de secunde, cu segmente scurte între 6 și 10, Low-Latency HLS între 2 și 5. SRT și WebRTC ajung sub o secundă, dar costă mai multă putere de calcul pentru fiecare spectator.
Am nevoie de transcodare și cât costă?
Doar dacă vrei să oferi mai multe niveluri de calitate. Simpla retransmitere, fără recodare, cere foarte puțin procesor, un nucleu servește sute de spectatori. Din clipa în care scoți un flux 1080p suplimentar în 720p și 480p, îți trebuie circa două până la patru nuclee moderne pe nivel. Planifică transcodarea abia atunci când ai nevoie de ea cu adevărat.
Pot transmite simultan pe Twitch și YouTube?
Da, exact pentru asta este bun serverul. Trimiți o dată către serverul tău, iar el retransmite același flux către oricâte platforme. La nginx-RTMP este suficientă o linie push pentru fiecare destinație. Linia ta duce oricum un singur upload.
Cum împiedic transmisiile străine pe serverul meu?
Limitează portul de ingest în firewall la propria adresă și verifică suplimentar cheia de stream prin on_publish. Fără aceste două măsuri, orice server RTMP deschis adună fluxuri străine în câteva zile, pentru că intervale întregi de adrese sunt scanate.
Unde ar trebui să stea serverul?
Nu în apropierea ta, ci în apropierea spectatorilor tăi. Drumul de la tine la server se face o singură dată, drumul de la server la spectatori de mii de ori. Dacă publicul tău este în Europa, serverul stă în Europa. Dacă se întinde peste mai multe continente, merită un al doilea server și o distribuție prin DNS.
Ajunge un VPS sau îmi trebuie un server dedicat?
Pentru simpla retransmitere, fără transcodare, ajunge fără probleme un VPS cu puține nuclee, pentru că strangularea vine din conectivitate și nu din puterea de calcul. Abia la transcodarea mai multor niveluri de calitate sau la multe canale paralele merită hardware dedicat.
Cum testez dacă serverul duce sarcina?
Pornește fluxul și deschide-l simultan cu mai multe instrumente, de exemplu cu ffmpeg pe ieșire nulă. Urmărește între timp debitul de rețea și încărcarea. Dacă atingi limita conectivității înainte ca procesorul să se încălzească, socoteala a ieșit: ai nevoie de mai multă bandă, nu de mai multe nuclee.

Streaming RTMP HLS SRT nginx OBS Restream Unlimited Traffic