# Java Streaming-Server & Streaming-Client



## TKausL (28. Nov 2012)

Hallo liebes Java-Forum,

da ich bereits die Theorie von Java (meiner Meinung nach) gut beherrsche aber leider noch keine großartige Praxiserfahrung habe möchte ich diese nun in einem eigenen Projekt sammeln. Bevor ich aber anfange frage ich lieber nochmal nach, ob es von Geschwindigkeit und Möglichkeiten überhaupt machbar ist.

Geplant ist ein LiveStream-Server (Video+Sound) in Java welcher natürlich von einem Streamer den Stream bekommt und an die Clients weitersendet.

Außerdem geplant ist ein Streaming-Client in Java, also das Programm welches die Bildschirmaufnahmen macht, Sound abhört und alles an den Streaming-Server sendet.

Als letztes fehlt nurnoch der Client welcher den Stream empfängt und diesen abspielt, dabei dachte ich an Flash.

Nun bitte ich also die Erfahrenen Programmierer, mir ein paar Informationen zu geben wie es Geschwindigkeitsmäßig so aussieht in Java mit Aufnahmen, Live konvertieren/Komprimieren und per TCP/UDP zu versenden. Der Server der letztendlich nur den Stream empfängt und weiterversendet sollte denke ich keine Probleme machen.

PS: Dies soll kein Komerzielles Produkt werden für 10.000 Streamer sondern lediglich ein Hobbyprojekt um Praxiserfahrung zu sammeln.


----------



## BuckRogers (28. Nov 2012)

Hallo lieber Java-Forum-Nutzer,

das ist ja ein ganz schön großes Projekt.
Da ich leider noch nicht sehr viel Erfahrung habe kann ich dir auch nicht viel helfen.
Was mir aber grundlegend auffällt ist, dass du TCP definitiv streichen solltest.
Jedenfalls für das Streamen der Bilder. Warum?
Weil das sonst nichts wird mit der Geschwindigkeit. 
TCP funktioniert mit Bestätigung nach Erhalt des Pakets. 
Der Vorteil ist zwar, dass du dann in HD streamen könntest, jedoch zwingt es fast jede Leitung in die Knie.
UDP hingegen feuert die Pakete ohne Rücksicht auf Verluste in den Äther und das Ausbessern der Bilder kann dann der jeweilige Player auf dem Client übernehmen. Kann dann u.U. pixelig werden aber dafür hat man dann einen flüssigen Stream.

Grüße


----------



## TKausL (28. Nov 2012)

Hallo,

habe jetzt etwa 30 Minuten gegoogled und ich habe bisher noch nichts darüber gefunden, ob/wie man eine Videoaufnahme vom Desktop machen kann. Ich denke also das kann ich erstmal vergessen mit Java. Vieleicht finde ich ja noch eine Cpp-Lib die ich mit Java dann ansprechen und nutzen kann.

ZU TCP/UDP: Ich habe mich mit Video/audio und deren Speicherformat noch nicht richtig beschäftigt, deswegen weiß ich garnicht inwiefern das Problematisch ist fals bei UDP Pakete garnicht erst ankommen.


----------



## trääät (28. Nov 2012)

wenn ich dabei mal auf ein thema aus dem netz-forum verweisen darf ...
es ging in diesem um einen clone von diesem web-chat oder wie auch immer der mist heißt ... also auch hier video/audio übertragung ...
oder auch ein anderer thread der sich lediglich um audio drehte (in richtung teamspeak-clone) ...

dort wurden mehrere dinge festgehalten

1) definitiv UDP ...
ein user hatte das problem das er unter verwendung von TCP einen immer größer werdenen "lagg" hatte ...
die begründung dahiter war einfach : die arbeits weise von TCP und das garantierte ankommen der pakete in richtiger reihenfolge ...
da auf verwendung eines vernünftigen audio-codecs verzichtet wurde liefen aber selbst über UDP noch ne ganze menge an daten ... die dann zwar keine immer größer werdenen verzägerung mehr zur fogle hatten aber nur noch die hälfte ankam ...

2) CODECS !
wie eben angerissen : wenn man "raw" daten sendet braucht man gewaltige leitungen ... gerade als uploader ...
hier muss man auf jeden fall codecs nutzen die bei relativ wenig qualitäts-verlust eine schnelle und gute komprimierung erreichen ...
es bringt nichts einfach nur die bitraten zu reduzieren wenn am ende immer noch mehr zu senden ist als es der upload zulässt ...
hier muss man halt zwischen qualität und daten-größe einen kompromiss finden ...

3) möglichst native-code nutzen
es wird so mit java schon mal schwer mit 60 fps den screen zu recorden ... selbst 30 fps stellen ein problem dar (gabs auch mal als vnc-clone hier) ...
also solltest du hier auf native-code zurückgreifen der leistungsstark genug ist um mit guter fps zahl möglichst hoch-qualitativ einen möglichst kleinen daten-strom erzeugt ...
mir fällt da jetzt nichts ein ... aber sollte sich was finden lassen ...
audio könnte man zur not noch mit java machen ... aber es wären dann spezielle einstellungen am system-mixer nötig die vielleicht nicht zum gewünschten ergebnis führen ..
es gibt native-libs die das deutlich besser können und direkt am system-mixer ansetzen ...
außerdem kann man dann gleich einen codec mit dransetzen und das mischen der audio-signale dem system überlassen


weiter zum "server"
in der regel hat ein streaming-server die aufgabe die daten die vom streamer kommen zu vervielfältigen und an alle clients zu senden ...
die beste möglichkeit ist wenn dies bereits die netz-hardware des hosts erledigt ... allerdings ist das nicht immer möglich ... dann kommt es auf einen leistungsstarken server an der nicht abhängig von der anzahl der clients ist ...
wie man das sinnvoll umsetzt würde ich auch gerne wissen ...
sicher dürfte es irgendeinen code geben der simultan daten von einem input auf x outputs dupliziert ... aber einfach mit nem loop über die verbindungen gehen und dann ein paket immer wieder zu kopieren führt bei größerer anzahl wieder zu laggs ...
glaube das ganze heißt irgendwie multiplexing oder sowas ... einfach mal nach googlen ....


und dann zum "view-client"
so lange du dafür sorgst das dieser die daten vom server versteht und daraus wieder ein video erzeugen kann dürfte es egal sein ob du ihn in java oder in flash implementierst ...
aber wenn man sich schon die mühe macht und den streamer in java schreibt sollte der viewer dann echt kein problem mehr sein ...
ist aber ne persönliche designentscheidung ...


//edit
zum record : siehe oben

zu tcp/up : in der regel verzeiht der stream das eine oder andere fehlende paket ohne das man größere aussetzer im video hat .. kommt dies jedoch zu oft vor kann es von bild/ton störungen zum abriss des streams kommen


----------



## TKausL (28. Nov 2012)

Nochmal etwas zu 3.: Ich mache mich dann mal auf die suche nach einer nativen Libary welche Bildschirmaufnahmen machen kann welche gleich durch nen encoder gejagt werden (richtiges wort?) und den output entweder direkt an eine IP leiten kann oder aber an Java. Ich hoffe doch sowas ist zu finden, wobei ich wie gesagt für Bildschirmaufnahmen in Java (noch) nichts brauchbares im Web gefunden habe, nichtmal ein Java-Programm welches Native-Libs nutzt. Schade...

zu 2: Müsste mich dann mal mit Hole-Punching beschäftigen. Wie ich ein UDP-Paket zum Server sende weiß ich, allerdings habe ich mich noch nie wirklich mit der anderen Richtung beschäftigt (Router, ohne PortForward).


----------

