Oddaję głos naszemu firmowemu mastah od streamingu, który nie ma tutaj konta, ale chciał się podzielić doświadczeniem ;):
W związku z tym, że byłem (w ramach Ideamotiv) zaangażowany w projekt realizacji złożonego rozwiązania dla IPTV chciałbym podzielić się moim doświadczeniem.
Odniosę się do tego co napisał @y3ti, ale postaram się to trochę usystematyzować.
Dobrym podejściem jest jednoznaczne podzielenie systemu na odrębne części,
tak aby niezależne moduły mogły powstawać asynchronicznie.
I. Webcam Streaming
Aplikacja kliencka, mająca na celu przechwycenie obrazu z kamery i re-streamingu do media servera.
II. Madia/Streaming server
Aplikacja/serwis serwerowa:
- Umożliwiająca publikowanie/zapis strumieni video (pochodzących z Webcam Streaming)
- Udostępniająca strumienie video w różnych formatach poprzez rożne protokoły.
Między punktem 1 i 2 ukryta jest skomplikowana część tego typu systemu.
Zaawansowane Media Servers (Flussonic / Wowza) dają kompleksowe rozwiazanie umożliwiające odbieranie i publikowanie video w większości formatach i protokołach, dbając o:
Dlaczego to jest wazne? Aktualna sytuacja odnośnie standaryzacji video w kontekście różnych urządzeń/platform/aplikacji jest w ogóle nieustandaryzowana (teraz się to zmienia).
Znaczy to tyle, że nie jesteś w stanie stworzyć rozwiązania opierając się o mały zbiór formatow/protokołów, które zagwarantują Ci poprawne działanie u Twoich końcowych użytkowników.
Dla przykładu, porównanie supportowanych formatow w przeglądarkach:
HTML5 video tag support

Flash player (jwPlayer) video support

Ważne fakty:
- transcoding jest kosztowny jeżeli chodzi o zasoby (hardware)
- streaming jest kosztowny w kontekście łącza internetowago (+ powinno sie rozważyć łącze alternatywne od innego providera)
III. Video player
Aplikacja kliencka grająca video. Kompleksowe rozwiazania mają wbudowaną logikę detekcji supportowanych formatów i wybierają rozwiazanie pasujące do platformy np.:
- Flash player
- HTML5 video player
- VLC webplugin
- Silverlight
##PROPONOWANE ROZWIĄZANIE
Ad I.
Musisz odpowiedzieć sobie na pytanie, czy w wymaganiach niefunkcjonalnych jest uwzględniony support do streamingu z urzadzen mobilnych (iOS/Android).
- Rozwiazanie oparte tylko o Flash (bez supportu dla większości urządzeń mobilnych)
Potrzebujesz Flash build, ktory przechwyci video z webcam i wyśle strumień na zadany atrybutem zasób (na Twoim Streaming Server) po RTMP.
Tutaj (https://github.com/AF83/webcam-streaming) masz przykładowe (nie jedyne) rozwiazanie, które da Ci dobry pogląd jak to powinno być zrealizowane.
- Rozwiązanie wykorzystujące HTML5 (support dla urządzeń mobilnych)
Nie korzystałem z tego, więc zostawiam tylko link do dobrego źrodła: http://www.html5rocks.com/en/tutorials/getusermedia/intro/
Osobiscie wybrałbym stworzenie dedykowanej aplikacji mobilnej dla tego celu, niż adaptywną wersje mobilną webaplikacji, ale to pewnie wynika z braku doświadczenia
Ad II.
Tutaj pojawia się podobne pytanie jak w I. - jakie urządzenia/platformy u końcowych użytkowników mają być supportowane. Pytanie jest o tyle ważne, że determinuje zlożoność rozwiązania dla streaming server.
Zaproponuję 2 rozwiązania:
###Darmowe i calkowicie oparte o Open Source (z wyjatkiem wybranych zamkniętych codeców, ktore są częścią ffmpeg:-)
Twój streaming server bedzie skladal się z:
- nginx
- nginx-rtmp-module
- ffmpeg / avconv
- nginx-secure-link (aby limitować dostęp do zasobów)
- Http Lua Module (opcjonalnie, aby zachować czytelność logiki w configach)
Na wiki nginx-rtmp-module sa juz gotowe configi pod takie rozwiazanie: https://github.com/arut/nginx-rtmp-module
Jeżeli ograniczysz rozwiazanie Video Player do rozwiazania opartego o Flash, nie musisz kombinowac z transcodinem/segmentacją i konfiguracja serwera jest prosta. Jeśli natomiast zechcesz zapewnić support np. dla iOS to będziesz zmuszony do dodania zasobu udostepniającego video po HLS (też możesz znaleźć rozwiązanie na wiki projektu) .
- sa tez darmowe alternatywy media serverów, z ktorymi nie miałem doświadczenia: Icecast/2, ffserver
###Kupujesz licencję na jedną instancję komercyjnego media servera.
Slyszalem dobre opinie o Wowza, lecz sam mam dlugie i dobre doświadczenie z napisanym w Erlangu: Flussonic Media Server.
W rozwiazaniu, ktore stworzyłem Flussonic nie jest końcowym nodem dla streamingu i wokół niego stworzyliśmy mini CDN (dfs/nfs + serwery nginx jako reverse proxies). Aktualnie system utrzymuje 30k aktywnych ogladających, przy strumieniowaniu kilku kanalow HD lub zbliżonej.
Główną zaletą użycia zaawansowanego media servera w kontekscie Twojego projektu bylyby:
- video, które publikujesz do servera, mozesz udostępniać w dowolnych formatach i protokołach (bez jakiejkolwiek konfiguracji)
- jeżeli zdecydujesz się na archiwizację video, wszystko sprowadza sie do zaznaczenia odpowiedniej opcji (i Twoje streamy beda zapisywane i indeksowane po timestampach)
- zapewnia wysoką wydajność, stabilność i mozliwości optymalizacji pod konkretne rozwiazanie (poprzez mnóstwo mniej lub bardziej zaawansowanych opcji)
AD III.
Jedynym sensownym wyjściem jest imho skorzystanie z gotowego rozwiazania:
Projekktor i Clappr sa darmowe. Sam mam doświadczenie z Clappr (i polecam!), ciekawe jest to, ze ma wbudowany p2p streaming po webRTC, co w przypadku live streamingu może sporo odciażyc Twoje łącze.
Zabawa z dostarczaniem ciężkiego contentu zaczyna sie w momencie, gdy pojawia sie traffic. Wtedy pojawiają się problemy takiego typu jak:
-
optymalizacja cache
-
stworzenie i optymalizacja swojego CDN
-
strategia failover
-
optymalizacja ustawien kernela na pojedynczych maszynach (np.: http://erlyvideo.org/doc/performance)
-
optymalizacja kodeków lub serwerów dla transcodingu