====== Multistream přes OBS a ffmpeg ======
[[https://obsproject.com/cs|OBS Studio]] umí bez problému streamovat na jednu platformu, ale pokud je potřeba posílat stejný livestream současně na více služeb, samotné OBS nestačí. Jedna z možností je použít službu [[https://restream.io/|Restream.io]], ale technická varianta je postavit si vlastní mezivrstvu: OBS pošle stream do lokálního RTMP serveru a [[https://ffmpeg.org/|ffmpeg]] ho odtud rozešle dál.
===== Princip řešení =====
Celé řešení má tři části:
* OBS vytvoří jeden výstupní stream.
* Lokální RTMP server v nginx tento stream přijme.
* ffmpeg vezme vstup z lokálního RTMP serveru a odešle ho na jednotlivé platformy.
Výhoda je v tom, že OBS řeší jen jeden cíl a rozkopírování streamu se děje až mimo něj. Tohle je praktické hlavně tehdy, pokud se má vysílat současně třeba na YouTube, Facebook a další službu.
===== Lokální RTMP server přes nginx =====
Jako ingest server jsem použil nginx s RTMP modulem. V Ubuntu stačí nainstalovat balíčky:
sudo apt install nginx nginx-mod-rtmp
V mém případě jsem upravoval soubor ''/etc/nginx/sites-available/default''. Běžnou HTTP/S konfiguraci jsem zakomentoval, protože porty 80 a 443 už obsluhoval Apache. Přidaná byla jen RTMP část na portu 1935:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
Po úpravě konfigurace stačí nginx restartovat:
systemctl restart nginx
===== Nastavení OBS =====
OBS pak neposílá stream přímo na cílovou platformu, ale na lokální RTMP server. Výstupní adresa vypadá takto:
rtmp://localhost:1935/live/stream
Tím vznikne jeden lokální stream, který lze dál zpracovat nezávisle na OBS.
===== Streamovací URL jednotlivých služeb =====
Dalším krokem je získat streamovací URL a stream key jednotlivých služeb. Pro YouTube a Facebook je to relativně přímočaré v administračním rozhraní dané platformy.
V době vzniku původního článku byl komplikovanější Instagram. Streamovací URL nebyla jednoduše dostupná a použil jsem tehdy aplikaci [[https://getstreamon.com/|Streamon]]. Praktická zkušenost byla taková, že URL měla jen krátkou platnost a bylo nutné v aplikaci nejdřív spustit stream a teprve potom do něj začít posílat data.
Druhá tehdejší zkušenost byla, že Instagram počítal s vertikálním výstupem a obraz si ořezával na výšku. Bylo tedy potřeba připravit scénu tak, aby hlavní objekt zůstal ve středu. To ber jako dobovou poznámku, ne jako aktuálně ověřený univerzální postup.
===== Rozkopírování streamu pomocí ffmpeg =====
Jakmile lokální RTMP server přijímá stream z OBS, může ffmpeg vzít vstup z ''rtmp://localhost:1935/live/stream'' a přeposlat ho na jednotlivé platformy. V původním řešení jsem spouštěl samostatné příkazy pro jednotlivé cíle a jeden další příkaz pro lokální záznam.
Facebook:
ffmpeg -i rtmp://localhost:1935/live/stream -c:v copy -c:a copy -map 0 -f tee "[f=flv]rtmps://live-api-s.facebook.com:443/rtmp/..."
Instagram:
ffmpeg -i rtmp://localhost:1935/live/stream -c:v copy -c:a copy -map 0 -f tee "[f=flv]rtmps://live-upload.instagram.com:443/rtmp/..."
YouTube:
ffmpeg -i rtmp://localhost:1935/live/stream -c:v copy -c:a copy -map 0 -f tee "[f=flv]rtmp://a.rtmp.youtube.com/live2/..."
Lokální záznam do souboru:
ffmpeg -i rtmp://localhost:1935/live/stream -c:v copy -c:a copy -f mp4 lokalni-zaznam.mp4
Použité parametry ''-c:v copy'' a ''-c:a copy'' znamenají, že ffmpeg video ani audio nepřekóduje, ale jen je přeposílá dál. To snižuje výpočetní náročnost, pokud je vstupní stream už připravený v kompatibilním formátu.
===== Omezení a praktické poznámky =====
* OBS samo o sobě neumí poslat jeden stream na více serverů najednou, proto je potřeba mezivrstva.
* Lokální RTMP server je jednoduché řešení, pokud se stream rozděluje na jednom počítači.
* Pokud se mají použít sociální sítě s odlišnými požadavky na formát obrazu, je potřeba na to myslet už při přípravě scény.
* U služeb třetích stran nebo neoficiálních aplikací se může workflow v čase změnit, takže hlavní hodnota článku je princip řešení přes OBS + nginx-rtmp + ffmpeg.
===== Zdroje =====
* [[https://obsproject.com/cs|OBS Studio]]
* [[https://restream.io/|Restream.io]]
* [[https://getstreamon.com/|Streamon]]
* [[https://obsproject.com/forum/resources/obs-studio-stream-to-multiple-platforms-or-channels-at-once.932/|OBS fórum – stream to multiple platforms or channels at once]]
* [[https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/|OBS fórum – private RTMP server using nginx]]
* [[https://ffmpeg.org/|ffmpeg]]