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