MP3 Datei abspielen funktioniert nicht

Diskutiere MP3 Datei abspielen funktioniert nicht im Allgemeine Java-Themen Bereich.
Dann07

Dann07

Guten Tag/Abend!
Ich versuche schon seit gestern eine MP3 Datei abzuspielen. Weil mir bewusst ist das Java kein MP3 unterstützt benutze ich als Library JLayer 1.0.1 zum dekodieren.
Man hört immer kurz ein Sound von der MP3 bevor der Code immer bei einer Zeile stecken bleibt und nicht weiter geht.
Hier der Code:

Java:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

import javazoom.jl.decoder.Bitstream;
import javazoom.jl.decoder.Decoder;
import javazoom.jl.decoder.Header;
import javazoom.jl.decoder.SampleBuffer;

public class Main {

    public static void main(String[] args) {
        try {
            InputStream is = new FileInputStream(new File("audioMp3.mp3"));
            byte[] buffer = new byte[1024 * 15];
            int len = 0;
            SourceDataLine sdl = (SourceDataLine) AudioSystem.getLine(new DataLine.Info(SourceDataLine.class, new AudioFormat(44100, 16, 2, true, false)));
            
            sdl.open();
            sdl.start();
            
            while((len = is.read(buffer, 0, buffer.length)) != -1) {
                byte[] pcm = decode(buffer, 0, len);
                
                sdl.write(pcm, 0, pcm.length); //<--- Hier genau bleibt er stecken!
            }
            
            sdl.stop();
            sdl.drain();
            sdl.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static byte[] decode(byte[] mp3, int off, int len) {
        try {
            Bitstream bitStream = new Bitstream(new ByteArrayInputStream(mp3, off, len));
            Decoder decoder = new Decoder();
            ByteBuffer byteBuffer = ByteBuffer.allocate(len * 2304 * 2).order(ByteOrder.LITTLE_ENDIAN);
            Header frameHeader = null;
            
            while((frameHeader = bitStream.readFrame()) != null) {
                SampleBuffer sampleBuffer = (SampleBuffer) decoder.decodeFrame(frameHeader, bitStream);
                short[] buffer = sampleBuffer.getBuffer();
                
                byteBuffer.asShortBuffer().put(buffer);
                
                bitStream.closeFrame();
            }
            
            bitStream.close();
            
            byteBuffer.flip();
            
            return byteBuffer.array();
        } catch(Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }

}
Falls jemand weiß warum das so ist oder ob ich was falsch gemacht hab bitte melden. :D
 
J

JustNobody

Wenn Du doch eh die Library verwendest: Warum nutzt Du dann nicht die Klassen, die diese Library Dir bietet? AdvancedPlayer zum Beispiel:
Java:
            InputStream is = new FileInputStream(new File("audioMp3.mp3"));
            AdvancedPlayer player = new AdvancedPlayer(is);
            player.play();
play() blockiert, bis das mp3 fertig gespielt wurde. Aber das kann man ja z.B. in einen Thread verlegen wenn notwendig.
 
Dann07

Dann07

Wenn Du doch eh die Library verwendest: Warum nutzt Du dann nicht die Klassen, die diese Library Dir bietet? AdvancedPlayer zum Beispiel:
Java:
            InputStream is = new FileInputStream(new File("audioMp3.mp3"));
            AdvancedPlayer player = new AdvancedPlayer(is);
            player.play();
play() blockiert, bis das mp3 fertig gespielt wurde. Aber das kann man ja z.B. in einen Thread verlegen wenn notwendig.
Ich wollte das wenn möglich ohne diese Klasse mache weil ich einen Radio Stream damit abspielen möchte. Und die MP3 dient als Test.
 
Zuletzt bearbeitet:
J

JustNobody

Ist das denn dennoch notwendig? Da könnte dann doch ggf. Clip ausreichen und die Daten gibst Du über einen AudioInputStream? Aber ich habe in dem Bereich bisher wenig gemacht.

Aber auch die Klassen Player und AdvancedPlayer sind ja nur universelle Klassen. Das ist ja nicht spezifisch für MP3. Daher sollten diese auch nutzbar sein.

Aber bezüglich Aufbau:
- Zum einen kannst Du Dir den Source von Player / AdvancedPlayer ansehen, um zu schauen, wie die Library es macht.
- es findet sich einiges auf StackOverflow z.B. BigClip in einer Antwort bei https://stackoverflow.com/questions/5667454/playing-mp3-using-java-sound-api
 
Dann07

Dann07

Erstmal danke für die Antwort und ich benutze das weil gerade die ganzen Internet Radio Streams auch mp3 Dateien sind. Ich hab die Player Klassen schon angeguckt und es mag auch an mir liegen aber ich werde daraus nicht schlau...
 
sascha-sphw

sascha-sphw

Normalerweise bekommt man hier keine fertige Lösung, aber da es buchstäblich nur 3 Zeilen Code sind... Here you go!
Java:
InputStream inputStream = new URL("http://rtlberlin.streamabc.net/rtlb-jamfmelektro-mp3-192-8706218?sABC=5rsn74rp%230%23r731s0685son37qn82q119rrn30n0ss5%23&=&amsparams=playerid:;skey:1593472236").openStream();
AdvancedPlayer advancedPlayer = new AdvancedPlayer(inputStream);
advancedPlayer.play();
Edit: Der schwierigere Task was es tatsächlich die URL herauszufinden. :-D
 
Dann07

Dann07

Ich hatte schon eine Lösung gefunden aber trotzdem danke obwohl ich genau das nicht verwenden wollte. Ich hab mir einen eigenen Player geschrieben mit JLayer um zu verstehen wie das funktioniert und um eigene Methoden mit rein zu bringen. :)
 
Thema: 

MP3 Datei abspielen funktioniert nicht

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben