Dlaczego transmisja na żywo się zacina i co z tym zrobić
Objaw jest zawsze jeden — zamarła klatka. Winowajców jest trzech, zupełnie różnych, i każdego leczy się inaczej. Wszystkie trzy zobaczysz w OBS-ie albo na sprzętowym enkoderze, niezależnie od tego, na czym pracujesz.
Siedzisz sobie, montujesz wydarzenie na żywo, nagle dostajesz wiadomość „W internecie od minuty gościu się nie poruszył” – a miało być tak pięknie…
Pamiętam moment, w którym pierwszy raz dostałem taką wiadomość – białe spodnie zrobiły się brązowe, a mózg krzyczał „Helena, mam zawał”. Chciałem tylko, żeby ktokolwiek mi powiedział, co się właściwie dzieje. Zamiast tego dostawałem ciszę i klatkę, która stała w miejscu jak sołtys na zebraniu wiejskim, kiedy nikt nie chce pierwszy zabrać głosu.
Zacinanie wygląda zawsze tak samo z zewnątrz — stop-klatka, czasem urwany dźwięk, czasem sekunda ciszy, która ciągnie się jak godzina. Ale pod spodem to prawie zawsze jeden z trzech zupełnie różnych wypadków. Każdy zostawia inny ślad i każdy leczy się czym innym. Ja się tego nauczyłem, budując własny system do transmisji, ale trafiłbym na dokładnie to samo w OBS-ie, w vMiksie i na Blackmagicu — bo to nie są choroby konkretnego programu, tylko trzy miejsca, w których transmisja na żywo może się zatkać.
Winowajca pierwszy: droga jest za wąska
Wyobraź sobie jednopasmową drogę do małej miejscowości, a na niej naraz korowód weselny, karawan i wóz strażacki jadący do pożaru. Coś musi zjechać na pobocze i poczekać. W transmisji tym „czymś” są kawałki obrazu: jeśli łącze nie wyrabia z ilością danych, którą wypychasz, pakiety czekają w kolejce, aż w końcu część z nich się gubi.
Robiłem kiedyś transmisję ze stupięćdziesięciolecia OSP Garwolin — jednostki, której jestem czynnym członkiem, więc za frajer. Nagle kolega mówi, że na YouTubie coś się przycina. Myślę sobie: ta, pewnie przez to, że oglądasz na swoim gównianym smartfonie. Ale patrzę w webprezenter, a tam zamiast ile megabitów na sekundę pali się na czerwono napis „full”.
Przystąpiłem do gaszenia pożaru w zarodku. Całe szczęście miałem dwa webprezentery, a na drugim ustawiony zapasowy klucz transmisji na YouTubie. Zjechałem na nim z przepływnością, zszedłem z 4K na Full HD i zatrzymałem główny. Dla widza wyglądało to jak ostatnie małe zacięcie — a od tej pory obraz płynął jak woda z prądownicy przy pełnej mocy motopompy.
Jak to rozpoznać: w OBS-ie masz to podane wprost. Kropka w prawym dolnym rogu robi się żółta albo czerwona, a w oknie statystyk (menu Widok → Statystyki) rośnie pozycja klatki pominięte z powodu sieci. Jeśli ta liczba rośnie, a procesor się nudzi — masz winowajcę numer jeden. Na sprzętowym enkoderze zobaczysz to jako spadający wskaźnik jakości połączenia.
Co z tym zrobić, po kolei od najskuteczniejszego:
- Kabel zamiast Wi-Fi. Nudne i skuteczne. Wi-Fi w sali pełnej ludzi z telefonami to nie jest łącze, to loteria.
- Zejdź z przepływności. Zasada, którą sobie ustaliłem: wysyłaj najwyżej połowę tego, co Twoje łącze pokazuje w teście prędkości wysyłania. Test robi się w idealnych warunkach, a Ty transmitujesz w prawdziwych.
- W OBS-ie włącz zmienną przepływność (Ustawienia → Zaawansowane → Sieć → dynamicznie zmieniaj bitrate). Zamiast gubić klatki, program sam przyduszy jakość na czas zatoru i wróci, gdy przejdzie.
- Przygotuj drugą drogę wyjścia, zanim będzie potrzebna. Zapasowy klucz transmisji na tej samej platformie, wpisany wcześniej w drugie urządzenie albo drugi profil. Wtedy ratunek polega na przełączeniu, a nie na klikaniu w ustawieniach przy ludziach patrzących na zamrożony obraz. U mnie to była różnica między jednym zacięciem a odwołaną transmisją.
- Jeśli platforma pozwala, jedź SRT zamiast RTMP — potrafi odzyskać zgubione paczki, kosztem paru sekund opóźnienia. Napisałem o tym osobny tekst, bo mam w tej sprawie ulubieńca.
Winowajca drugi: maszyna nie nadąża ze składaniem obrazu
To nie ma nic wspólnego z internetem. Komputer po prostu dostaje więcej roboty na sekundę, niż jest w stanie przerobić: ma złożyć obraz z kilku źródeł, dołożyć nakładki, przeliczyć wszystko na strumień — i nie wyrabia w tempie, w jakim leci życie.
Pamiętam pierwsze covidowe transmisje konferencji prasowych prof. Glapińskiego. Używaliśmy wtedy MacBooka Pro z 2017 roku z Wirecastem, a sygnał z kamer wpuszczaliśmy przez AJA Io 4K — pudełko, przez które obraz z kamer wchodzi do komputera. Swoją drogą całkiem porządna maszyna, ale wtedy miałem ją za najgorsze ścierwo.
Mówię sobie: skoro na Adży pisze, że jest 4K, to robimy transmisję w 4K. Niestety Adża może obsłużyć w 4K tylko jedno źródło. Trudno, w takim razie trzy kamery w Full HD i nakładki animacyjne w 4K, do tego kodowanie z Wirecasta. I zapomniałem zmienić płótno na Full HD, więc program powiększał wszystko do 4K.
Wiatraczki w MacBooku robiły z niego poduszkowiec. Jakież było moje zdziwienie, kiedy po pierwszych kilku minutach transmisja się zawiesiła. Teraz już wiem: omal nie ugotowałem tamtego MacBooka.
Jak to rozpoznać: OBS wypisuje wtedy wprost komunikat „Kodowanie przeciążone” (Encoding overloaded), a w statystykach rośnie pozycja klatki pominięte z powodu przeciążenia kodowania — i to jest zupełnie inna pozycja niż ta od sieci. Dwa różne liczniki, dwie różne choroby. Warto je rozróżniać, bo wyglądają identycznie na wizji.
Co najczęściej go dobija — w kolejności, w jakiej to spotykałem:
- Nakładki będące stronami internetowymi. Źródło typu przeglądarka z animowanym paskiem, licznikiem albo czatem potrafi zjeść więcej mocy niż całe kodowanie obrazu. U mnie taki sposób składania obrazu wziął ponad dwa i pół raza więcej mocy, niż maszyna w ogóle miała. Statyczny plik graficzny robi dokładnie to samo na ekranie i nie kosztuje prawie nic.
- Kodowanie procesorem na wysokiej jakości. Ustawienie preset na „wolniejszy” znaczy „ładniej, ale drożej”. Przy transmisji na żywo prawie zawsze lepiej zejść na szybsze ustawienie, bo widz nie zobaczy różnicy, a zamrożoną klatkę zobaczy na pewno.
- Kodowanie procesorem w ogóle. Jeśli masz kartę NVIDIA (NVENC), procesor Intela z Quick Sync albo Maca z Apple Silicon — przełącz kodowanie na sprzętowe. To osobny kawałek układu zrobiony wyłącznie do tego. Procesor wraca do składania obrazu, czyli do tego, w czym jest potrzebny.
- Rozdzielczość płótna ustawiona wyżej niż wszystko, co na nim leży. Ten sam błąd, co z MacBookiem wyżej: jeśli program ma płótno w 4K, a źródła w Full HD, to każdą klatkę z każdej kamery powiększa, zanim cokolwiek złoży. Robota za darmo, płacona przez procesor. W OBS-ie sprawdzisz to w Ustawienia → Wideo: rozdzielczość bazowa ma odpowiadać temu, z czym naprawdę pracujesz.
- Za dużo naraz. Cztery kamery w 4K, do tego filtry na każdym źródle i podgląd wielu scen. Zejście z 4K na 1080p albo z 60 na 30 klatek to nie jest wstyd, tylko decyzja.
Winowajca trzeci: zgubiona klatka kluczowa
Ten jest najbardziej podstępny, bo z zewnątrz wygląda identycznie jak dwa poprzednie, a leczy się zupełnie inaczej — i to nie u Ciebie, tylko po drugiej stronie.
Obraz w transmisji nie leci jako ciąg pełnych zdjęć. Co jakiś czas idzie jedna klatka pełna (klatka kluczowa), a między nimi lecą same różnice — „tu się ręka przesunęła, tu się usta ruszyły”. Kiedy odbiornik zgubi tę pełną klatkę, ma same różnice i nie ma do czego ich doliczyć. Stoi więc i czeka na następną pełną.
To jest jak stary magnetowid, który przy przewijaniu zgubił moment cięcia sceny: obraz zamiera, bo mechanizm czeka na wyraźny znacznik początku, żeby wiedzieć, od czego zacząć. Znacznik w końcu przyjdzie sam, bo nadawca wysyła go regularnie — tylko czasem po kilkunastu sekundach, a w najgorszym przypadku, jaki u siebie zmierzyłem, po prawie minucie. Widz przez ten czas patrzy na zamrożoną klatkę i zastanawia się, czy transmisja jeszcze żyje.
Co z tym zrobić: ustaw odstęp między klatkami kluczowymi na 2 sekundy. W OBS-ie to Ustawienia → Wyjście → tryb zaawansowany → Keyframe Interval, na sprzętowym enkoderze pozycja o tej samej nazwie. Domyślne „auto” bywa dużo rzadsze, a YouTube, Facebook i Twitch i tak oczekują dwóch sekund. Ta jedna zmiana skraca zamrożenie z kilkunastu sekund do dwóch — nie zapobiega gubieniu klatek, ale sprawia, że przestaje to być widowiskiem.
Nie umiem przypomnieć sobie jednej konkretnej transmisji, na której mnie to dopadło — i to jest w tym najgorsze. Bo teraz wiem, że za każdym razem, kiedy mówiłem „to nie moja wina, YouTube coś pewnie spierdzielił”, chodziło dokładnie o to. O zgubioną klatkę kluczową. Ta wiedza przyszła do mnie dopiero, kiedy zacząłem budować własne rozwiązania do streamingu. Gdybym wiedział wcześniej, nie zwalałbym winy na niewinnego YouTube’a, tylko naprawił to w locie.
Zanim zaczniesz cokolwiek naprawiać
Cała trudność polega na tym, że objaw jest jeden, a choroby trzy. Zejdziesz z przepływności, kiedy problemem jest przeciążony komputer — nic się nie zmieni. Kupisz mocniejszy komputer, kiedy problemem jest hotelowe Wi-Fi — też nic się nie zmieni, tylko drożej.
Dlatego kolejność jest zawsze ta sama: otwórz statystyki i zobacz, który licznik rośnie. Sieć czy kodowanie. To zajmuje pięć sekund i oszczędza wieczór. Jeśli nie rośnie żaden, a obraz i tak zamarza — masz trzeciego winowajcę i idziesz do ustawienia klatek kluczowych.
Ja przez dobry czas próbowałem leczyć wszystkie trzy jednym lekarstwem i dziwiłem się, że działa tylko czasem. Dziś, kiedy widzę zamrożoną klatkę, już się tak nie boję — patrzę, sprawdzam, który to z trzech, i naprawiam dokładnie to. Białe spodnie zostają białe.
Tematy: streaming · warsztat · OBS