2014-02-10 14 views
9

Leider MP3-Unterstützung in Java fehlt. Ich entwickle eine App, die Stücke von MP3 empfangen und abspielen muss. Ich war mit JLayer MP3-Bibliothek wie folgt aus:MP3 in Blöcken mit Java wiedergeben?

import javazoom.jl.player.Player; 
public class MP3 { 
    private String filename; 
    private Player player; 

    // constructor that takes the name of an MP3 file 
    public MP3(String filename) { 
     this.filename = filename; 
    } 

    public void close() { if (player != null) player.close(); } 

    // play the MP3 file to the sound card 
    public void play() { 
     try { 
      FileInputStream fis  = new FileInputStream(filename); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      player = new Player(bis); 
     } 
     catch (Exception e) { 
      System.out.println("Problem playing file " + filename); 
      System.out.println(e); 
     } 

     player.play(); 
} 

Aber mein Problem ist, dass ich nur Stücke der vollen MP3-Datei haben, und ich brauche sie zu spielen, wie sie ankommen. Gibt es eine bessere Alternative?

bearbeiten

eine interessante ähnliche Frage gefunden: MP3 won't stream with JMF auch: Decoding MP3 files with JLayer

+0

Sie sollten sich diesen Thread anschauen, bereits ein Problem gelöst, das diese einfachen Schritte hinterlässt http://stackoverflow.com/questions/14410344/jersey-rest-support-resume-medi-a-streaming/14476402#14476402 – GhostDerfel

+0

@GhostDerfel: I denke, das funktioniert nur innerhalb von Browsern? ... Ich muss das von einer Desktop-App aus spielen – dynamic

+3

Mmmm du hast Recht, noch nie für Desktop-Anwendung getan ... nur Web und Android, sorry :(. Wenn ich etwas finde, werde ich posten hier als Referenz – GhostDerfel

Antwort

1

Erstellen Sie eine Klasse, die Input implementiert und arbeitet, um die Stücke zu erhalten, wie sie ankommen, aber die Bytes auf die serviert Spieler. Stellen Sie sicher, dass Sie verfolgen, wo Sie sich in jedem Chunk befinden, während er Bytes anfordert, und verwerfen Sie den Chunk dann, wenn Sie ihn durchgebrannt haben und beginnen, Daten von dem nächsten zu verarbeiten.

Da der Spieler erwartet, mit einem InputStream zu arbeiten, wird es nicht klüger sein. Sie werden das wahrscheinlich nicht in einen BufferedInputStream einbinden müssen, da Sie das in Ihrer Klasse handhaben werden.

+0

können Sie bitte eine Code-Demonstration zu Ihrer Antwort hinzufügen? – avidProgrammer

+0

@avidProgrammer Nicht ohne weitere Informationen darüber, wie die Daten geliefert werden. – Bill

+0

In meinem Fall werden die Daten kontinuierlich in eine temporäre Datei geschrieben und der Player spielt diese Datei als Eingangsstrom ab. Hier ist eine Frage, die ich über das gleiche Problem fragte http://stackoverflow.com/questions/35157247/playing-streamed-mp3-data-repeatedly-with-jlayer – avidProgrammer