mPainter: Studio transmisji — streaming i nagrywanie jak w OBS
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.