[JAVA] Bepaalde bitrate over een socket sturen?

Pagina: 1
Acties:

  • Blubber
  • Registratie: Mei 2000
  • Niet online
Ik ben met JAVA een ICY server aan het maken. Dus net zoiets als Shoutcast. ICY is in princiepe gewoon HTTP met een aantal extra headers. De code die ik tot nu toe heb is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;
import java.net.*;


public class Apl {
    
    private BufferedReader in;
    private PrintWriter out;
    Socket s;
    ServerSocket ss;
    
    
    public static void main(String args[]) {
        new Apl();
    }
    
    
    public Apl() {
        try {
            BufferedReader in = new BufferedReader(
                new FileReader(
                new File("test.mp3")));
            
            ss = new ServerSocket(8000);
            s = ss.accept();
            out = new PrintWriter(s.getOutputStream());
        
            out.println("ICY 200 OK");
            out.println("icy-notice1:blaat");   
            out.println("icy-notice2:blaat");
            out.println("icy-name:Unnamed Server");
            out.println("icy-genre:");
            out.println("icy-url:http://www.shoutcast.com");
            out.println("icy-pub:1");
            out.println("icy-br:192");
            out.println("Datastream");
            
            while(in.ready()) {
                out.print(in.read());   
            }
            s.close();
            
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0); 
        }
    }   
}


Niet erg netjes, dat weet ik :).
Als ik de server opstart kan ik er met winamp op port 8000 op inloggen. Maar het streamen werkt niet. Winamp komt met de melding "Error syncing to mpeg". Dit komt volgens mij omdat het mp3'tje een bitrate van 192kb/s heeft, maar mijn java progsel probeert zoveel mogelijk data tegelijk over de socket te sturen. Is er een manier in JAVA om het verkeer dat over de socket gaat te limiteren?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:12
Je zult zelf bij moeten houden hoeveel data je verstuurt per tijdseenheid. Waarschijnlijk zul je dan een of ander buffer mechanisme moet inbouwen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Blubber
  • Registratie: Mei 2000
  • Niet online
Ik kan wel een Thread maken en die om de byte een aantal nanos te laten sleepen. Maar ik vraag me af hoe dat gaat werken :)

Geprobeerd, maar dat werkt ook niet. Met sleep (0,42). Maar dan nog krijg ik een error van winamp. Misschien mis ik toch ergens een header...

Verwijderd

Dit heeft niets met de bitrate over je sockets te maken, maar zoals je al zegt broadcast je bepaalde headers niet. Winamp verwacht eerst nl. een redirect naar de URI van de stream. Bekijk deze sample-code eens (basic helaas, maar het concept is duidelijk).

  • Blubber
  • Registratie: Mei 2000
  • Niet online
He koel, bedankt. Ik denk dat ik er zo wel uiit kom :)

  • Blubber
  • Registratie: Mei 2000
  • Niet online
HIj werkt nu. Ik stuurde een header teveel. Voor de geintreseerden, hier is een werkende JAVA shoutcast server:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.*;
import java.io.*;
import java.net.*;


public class Apl extends Thread {
    
    private FileInputStream in;
    private OutputStream out;
    Socket s;
    ServerSocket ss;
    
    
    public static void main(String args[]) {
        new Apl();
    }
    
    
    public Apl() {
        try {
            in = new FileInputStream( new File("test.mp3") );           
            ss = new ServerSocket(8000);
            s = ss.accept();            
            start();
            
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0); 
        }
    }   
    
    
    public void run() {
        try {   
            sleep(1000);
            PrintWriter pout = new PrintWriter(s.getOutputStream());
            pout.println("ICY 200 OK");
            pout.println("icy-notice1:blaat");  
            pout.println("icy-notice2:blaat");
            pout.println("icy-name:Unnamed Server");
            pout.println("icy-genre:");
            pout.println("icy-url:http://www.shoutcast.com");
            pout.println("icy-pub:1");
            pout.println("icy-br:192");
            //pout.println("icy-metaint:8192\r\n");
            pout.flush();
            //pout.close();
            
            out = s.getOutputStream();
            
            byte b[] = new byte[1024];
            while(in.available() > 1024) {
                in.read(b);
                out.write(b);
                out.flush();
                sleep(1);               
            }
    
            
        } catch (Exception e) {
            System.out.println("Stream error");
            e.printStackTrace();
            System.exit(0); 
        }   
    }
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Dit kon ook wel met een shellscriptje hoor. :)

Jammer ook dat je 't laatste stukje van je bestand niet wegstuurt, als de bestandsgrootte geen veelvoud van 1024 is. Is het in Java ook niet mogelijk om de ene stream direct in de andere te stoppen? Ik kan me zo voorstellen dat dat veel efficienter is.

  • Blubber
  • Registratie: Mei 2000
  • Niet online
Ja hebt wel zoiets als een piped input en ouputstream. Maar die kan je niet direct aan een Socket kopellen, dus dan heb je nog steeds die read en write's nodig. En wat betreft die van 1024. DIt is een test :) ik ben nu met de uiteindelijk versie bezig.
Pagina: 1