Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.04.2014, 15:06

Java // Streaming Audio

Hey!

Ich probiere schon seit längerem mit Java Audio zu streamen. Dabei gibt es einen Server, der die entsprechenden bytes verteilt und einen Client der diese wiedergibt.
Nur eine Datei zu streamen, ist auch garnicht mein Problem. Sondern wie kann ich nur die letzten 50% einer Datei an einen Clienten streamen. Hier noch ein kurzes Beispiel zum besseren Verständnis ;)

Der Server startet und der erste Client verbindet sich. Dabei passiert noch nichts, weil der Server noch nichts sendet. Irgendwann fängt dann der Server, nach Auswahl einer Datei an zu senden und der Client bekommt die Pakete, auf die er gewartet hat. Wenn sich jetzt aber nach 2 Minuten nach dem Beginn des Liedes ein weiterer Client verbindet, dann würde dieser noch die restliche Minute (die das Lied noch läuft) warten müssen und er kann sich erst das nächste anhören.
Nun möchte ich es aber schaffen, das der Server dann quasi eine Position hat (also in dem Fall bei 2m0s) und dem neu verbundenen Client eben ab da die benötigten bytes sendet und der Client das Lied quasi zeitgleich mit den anderen Client's anhören kann!

So nun erstmal etwas Code für euch ;) (Das ist NUR EIN BEISPIEL, es funktioniert nur für 1 Client der sich zum Server verbindet und ist nicht Multi-Threaded!)
Der Server führt folgende Funktion aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
try {
        ServerSocket serverSocket = new ServerSocket(1000);
        Socket socket = serverSocket.accept();
        FileInputStream in = new FileInputStream(new File("musik.mp3"));
        BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
        byte[] b = new byte[4096];
        while (in.read(b) != -1) {
                out.write(b);
        }
        in.close();
        out.close();
        socket.close();
} catch(Exception e) {}

und der Client verbindet sich danach und fängt an, die gestreamtem bytes zu lesen:

Quellcode

1
2
3
4
5
6
try {
        Socket s = new Socket("server ip", 1000); // es geht auch mit unterschiedlichen PC's
        BufferedInputStream in = new BufferedInputStream(s.getInputStream());
        AudioPlayer aPlayer = new AudioPlayer(in); // *AudioPlayer
        aPlayer.play();
} catch(Exception e) {}


*AudioPlayer : ... ist eine selbstgeschriebene Klasse, die das auslesen von InputStream's ermögicht und diese in "Audio" umwandeln und ausgeben kann.

So, ich hoffe wirklich hier hat irgendjemand eine Idee, wie ich das Problem lösen kann.
LG Tom :)

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

07.04.2014, 15:32

Du musst dann schon auch in der Schleife prüfen ob per accept was neues reinkommt.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

3

07.04.2014, 16:39

Wie gesagt, der oben stehende Code funktioniert! Ich suche nach einer Möglichkeit vom Server aus immer eine bestimmte Position zu streamen.
Oder versteh ich dich gerade total falsch? Wenn ich dich falsch verstehe, wäre es echt cool wenn du das nochmal genauer beschreiben könntest!

LG

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

07.04.2014, 17:40

Wenn sich jetzt aber nach 2 Minuten nach dem Beginn des Liedes ein weiterer Client verbindet, dann würde dieser noch die restliche Minute (die das Lied noch läuft) warten müssen und (...)


Ich kann mir grade nicht vorstellen, dass dieses Szenario funktioniert, denn wenn du einmal angefangen hast zu streamen nimmst du nie mehr eine neue eingehende Verbindung an.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

5

07.04.2014, 18:48

Das ist mir durchausklar. Das habe ich auch im 1. Beitrag erwähnt!
Ich weiß schon wie ich das MutliThreaded ausbauen sodass es auch durchaus für mehrere Clients funktioniert.

Meine Frage ist ja mehr wie ich es schaffe dass der Server quasi eine Position vom Audio hat und dementsprechend bytes streamt.

LG

//edit: Problem gelöst, Bytes per Sekunde ermitteln (+Multithreaded Anwendung, da sonst kaum [flüssiges] Streaming möglich ist) und eine Position mit hochzählen lassen (ist zwar manchmal das Lied am Ende oder Anfang etwas abgehakt, aber es geht!)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »GamicStudio« (10.04.2014, 21:53)


Werbeanzeige