18.06.2026 21:20

mPainter: Studio transmisji — streaming i nagrywanie jak w OBS

⏱️ 6 min czytania
Udostępnij:

mPainter: Studio transmisji — streaming i nagrywanie jak w OBS

Moonlight Painter dostał własne Studio transmisji — wbudowany moduł do streamowania i nagrywania pracy nad rysunkiem, bez odpalania OBS-a obok. Nadajesz prosto na YouTube, Twitcha, Rumble, Kick czy Facebooka (RTMP/RTMPS/SRT), albo po prostu nagrywasz lokalnie do pliku MP4. Ten odcinek opisuje, co Studio potrafi — i jak długą drogę przeszliśmy, żeby obraz faktycznie pojawił się na żywo, a całość działała na poziomie, do którego przyzwyczaił nas OBS.

Co potrafi Studio transmisji

  • Sceny i źródła — każda scena to własny zestaw źródeł: płótno / scena animacji, okno aplikacji, cały ekran, kamera, obraz oraz nakładki tekstu, czatu i alertów. Źródła układasz i skalujesz wprost w podglądzie, z uchwytami i przyciąganiem do krawędzi kadru.
  • Kompozytor obrazu — wszystkie widoczne źródła są składane w jedną klatkę z zachowaniem proporcji, z chroma key (greenscreen) dla nakładek i własnym kursorem.
  • Kilka wyjść naraz — możesz nadawać do wielu celów jednocześnie i opcjonalnie nagrywać lokalnie równolegle ze streamem, albo wejść w tryb tylko nagrywanie (sam plik MP4, bez wysyłki).
  • Audio jak w OBS — osobne tory mikrofonu i dźwięku pulpitu, z faderami głośności, miernikami VU na żywo, wyciszaniem i duckingiem.
  • Czat i alerty na żywo — integracje z Twitchem (czat + EventSub) oraz czatem YouTube.

Najtrudniejsze: doprowadzić obraz na YouTube

Połączenie potrafiło raportować „Excellent", a mimo to widz widział czerń. To była seria osobnych, podstępnych przyczyn — każdą trzeba było wyłuskać z potoku enkoder → mux → wysyłka:

  • Brak SPS/PPS w nagłówku FLV (kluczowe) — muxer FLV (RTMP) przenosi konfigurację H.264 w polu, które enkoder wypełnia tylko przy ustawionej fladze globalnego nagłówka. FLV jej nie wymusza, więc strumień szedł bez „instrukcji dekodowania" — YouTube odbierał bajty, ale nie miał jak złożyć z nich obrazu. Flaga jest teraz wymuszana dla FLV (wideo i audio).
  • Rozjechane timestampy A/V — zegar wideo startował przy otwarciu okna, a audio przy starcie streamu, więc pierwsza klatka trafiała „w przyszłość". Oba zegary mają teraz wspólną bazę zerową; mux zawsze zaczyna od PTS 0.
  • Pusta ścieżka audio = czerń — gdy mikrofon był odłączony, nie szły żadne pakiety audio, a zadeklarowana, lecz pusta ścieżka sprawiała, że YouTube czekał na synchronizację i pokazywał czerń. Mikser audio jest teraz napędzany timerem i emituje ciągle (cisza + pulpit + mikrofon), więc tor audio nigdy nie jest pusty.
  • Statyczny kadr = zbyt niski bitrate — białe płótno na enkoderze VBR schodziło do ~3 kbps, których YouTube po prostu nie wyświetla. Dodaliśmy libx264 w trybie CBR (ze stałym wypełnieniem), więc nawet nieruchomy kadr leci ze stabilnym, docelowym bitrate.
  • Niemonotoniczny DTS — przy ~33 kl/s dwie klatki zaokrąglały się do tego samego ticka i muxer je odrzucał (bitrate skakał 3↔166). Podstawa czasu zmieniona na milisekundy — każdy timestamp jest unikalny i rosnący.
  • Wymiary i częstotliwość audio — wymiary wyrównane do parzystych (wymóg H.264), a enkoder audio przestawiony na 48 kHz (preferowane przez ingest), bez zbędnego resamplingu.

Stabilność: koniec z zawieszeniami i crashami

  • GUI nie zamarza przy starcie — blokujące wywołania sieciowe (handshake RTMP, zapis nagłówka) wykonują się teraz na wątku roboczym; klik „Start" wraca natychmiast z „Łączenie...". Rdzennym winowajcą był sposób podpięcia pętli enkodera — biegła na wątku głównym; poprawione.
  • Drugi start nie wywala aplikacji — teardown wątku roboczego zawsze sprząta żywy wątek.
  • Jedna wersja FFmpeg w procesie — przypadkowy konflikt dwóch wersji FFmpeg (naszej i tej z pluginu Qt) kończył się crashem; FFmpeg jest teraz przypięty do wersji zgodnej z Qt.

Inteligentny dobór enkodera

Zamiast wybierać jeden enkoder „w ciemno", Studio realnie próbuje otworzyć kolejnych kandydatów: sprzętowe (NVENC / QSV / AMF) → Media Foundation → software (x264 / OpenH264) i bierze pierwszego, który zadziała w danej rozdzielczości. Dla RTMP dodatkowo odrzucamy enkodery, które nie produkują koniecznego nagłówka H.264 — dzięki temu na żywo zawsze leci dekodowalny obraz.

Diagnostyka „stats for nerds" pod klawiszem H

Żeby takich problemów nie zgadywać, Studio ma własną nakładkę diagnostyczną — wzorowaną na „statystykach dla nerdów" z YouTube. Włączasz ją klawiszem H wprost na podglądzie (rysowana na półprzezroczystym tle, nie wchodzi do strumienia). Pokazuje na żywo: użyty enkoder i format pikseli, rozdzielczość/fps, rozmiar nagłówka H.264 (z ostrzeżeniem, gdy 0), bitrate osobno dla wideo i audio, liczbę klatek i dropów, stan połączenia i ostatni błąd. Do tego pełne, rozbudowane zarządzanie błędami: każda awaria niesie konkretny etap (sieć / publikacja / enkoder / nadawanie), zdekodowany kod FFmpeg i wewnętrzny dziennik FFmpeg — zamiast samego „nieudane".

Szlify w stylu OBS

  • Okno Studia znika ze streamu — przy przechwytywaniu okna/ekranu samo okno Studia jest pomijane przez przechwytywanie (jak OBS ukrywa własne okna), choć dla Ciebie pozostaje widoczne.
  • Skróty malarki nie przeciekają — gdy fokus jest w Studiu, pojedyncze klawisze narzędzi (b/e/h/…) nie odpalają się pod spodem w oknie rysowania.
  • Uchwyty z przyciąganiem do krawędzi — przeciągając źródło w podglądzie, jego krawędzie i środek przyciągają się do granic kadru (model „bounding box" jak w OBS); Shift zachowuje proporcje przy skalowaniu.
  • Studio pamięta Twój układ — ostatni URL i klucz, a także sceny wraz z ich źródłami są zapisywane i odtwarzane przy kolejnym otwarciu. Koniec z ustawianiem wszystkiego od zera.

Słowo o licencji

Tryb CBR opiera się na x264 (licencja GPL), więc build streamingowy w tej konfiguracji staje się GPL — w sam raz do użytku własnego i testów. Przed komercyjnym wydaniem rozważymy pozostanie przy OpenH264 (LGPL), akceptując kompromis przy całkowicie statycznym kadrze.

Podsumowanie

Studio transmisji jest już w pełni grywalne: nadaje na żywo na YouTube z obrazem i dźwiękiem, nagrywa lokalnie, a komfortem (audio, diagnostyka, sceny, przyciąganie, pamięć ustawień) celuje w to, do czego przyzwyczaił nas OBS — tyle że bez wychodzenia z mPaintera. Streamuj swoją pracę od pierwszej kreski.

📚 Powiązane posty

14.07.2026 22:19

Silnik gier: od szablonu do grywalnej gry RPG top-down

Startowy szablon silnika gier to teraz kompletny, grywalny wycinek gry RPG top-down: chodzenie po siatce, rozmowy z postaciami, przeciwnik goniący gdy...
Czytaj dalej →
14.07.2026 19:16

Moonlight Animate — system dialogów w grach

Silnik gier 2D w Moonlight Animate ma teraz kompletny system dialogów: kwestie z efektem maszyny do pisania, wybory z warunkami, zmienne fabularne i g...
Czytaj dalej →
14.07.2026 18:40

Moonlight Animate: ruchoma panorama dźwięku także w wyeksportowanym wideo

Dźwięk przejeżdżający z lewego do prawego głośnika brzmiał dobrze w podglądzie, ale eksport przez serwer zamrażał go w miejscu. Ostatnia luka parytetu...
Czytaj dalej →

📧 Bądź na bieżąco!

Zapisz się na listę oczekujących, aby otrzymywać powiadomienia o nowych postach na Dev Blog oraz informacje o starcie platformy Moonlight.