# AAC abspielen



## Seppl22 (26. Mai 2018)

Hallo,
ich versuche gerade mit JAAD AAC-Streams abzuspielen. Dafür habe ich folgende Mehtode:


```
public void play(File[] files) {

        try {
            // for-next loop to play each titel from the playlist once
            for (currentTrack = 0; currentTrack < files.length; currentTrack++) {
                InputStream in = url.openStream();
//                InputStreamReader isr = new InputStreamReader(in);
//                BufferedReader br = new BufferedReader(isr);
//                String zeile = br.readLine();
//                while (zeile != null) {
//                    System.err.println(zeile);
//                    zeile = br.readLine();
//                }

                cont = new MP4Container(in);// open titel with random access
                movie = cont.getMovie();                          // get content from container,
                List<Track> content = movie.getTracks();
                System.err.println(content.isEmpty());
                if (content.isEmpty())// check if container HAS content
                    throw new Exception("content is empty");  // if so,
                track = (AudioTrack) movie.getTracks().get(0);// grab first track and set the audioformat
                af = new AudioFormat(track.getSampleRate(), track.getSampleSize(), track.getChannelCount(), true, true);
                line = AudioSystem.getSourceDataLine(af);        // get a DataLine from the AudioSystem
                line.open();                                        // open and
                line.start();                                       // start it

                dec = new Decoder(track.getDecoderSpecificInfo());

                buf = new SampleBuffer();
                while (track.hasMoreFrames())                // while we have frames left
                {
                    frame = track.readNextFrame();          // read next frame,
                    dec.decodeFrame(frame.getData(), buf);  // decode it and put into the buffer
                    b = buf.getData();                      // write the frame data from the buffer to our byte-array
                    line.write(b, 0, b.length);             // and from there write the byte array into our open AudioSystem DataLine

                    while (paused)                  // check if we should pause
                    {
                        Thread.sleep(500);          // if yes, stay half a second

                        if (Thread.interrupted())   // check if we should stop possibly
                        {
                            line.close();           // if yes, close line and
                            return;                 // exit thread
                        }
                    }

                    if (Thread.interrupted())       // if not in pause, still check on each frame if we should
                    {                               // stop. If so
                        line.close();               // close line and
                        return;                     // exit thread
                    }
                }

                line.close();           // after titel is over, close line

                if (loop)               // if we should loop current titel, set currentTrack -1,
                    currentTrack--;     // as on bottom of for-next it get's +1 and so the same titel get's played again
                else if (repeat && (currentTrack == files.length - 1)) // else check if we are at the end of the playlist
                    currentTrack = -1;  // and should repeat the whole list. If so, set currentTrack -1, so it get's 0 on for-next bottom
            }
        } catch (LineUnavailableException | IOException | InterruptedException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
```

Der Stream hinter der URL lautet: 
http://streams.bigfm.de/bigfm-deutschland-128-aac?usid=0-0-H-A-D-30

Ich übergebe der Methode ein FileArray der Größe 1. Leider kommt der Code nicht weiter als cont = new MP4Container(in).
Wenn ich mir über den auskommentierten BufferedReader den Stream der URL ausgeben lasse, bekomme ich Daten (allerdings stellt die Konsole nur kryptische Zeichen da, was ich bei AAC mal als 'positiv' werte).
Wenn ich dem MP4-Container eine MP4-Datei übegebe (als RandomAccessFile), funktioniert es. Ich höre da zwar auch kein Audio, aber ich komme immerhin in die while-Schleife.
Laut der Doku von JAAD akzeptiert der Mp4-Container aber auch einen InputStream.
Kennt sich jemand mit JAAD aus und kann hier weiterhelfen?  Oder kennt jemand eine ander Möglichkeit AAC aus einem Webstream abzuspielen?


----------



## httpdigest (26. Mai 2018)

Seppl22 hat gesagt.:


> Oder kennt jemand eine ander Möglichkeit AAC aus einem Webstream abzuspielen?


Muss es denn ein selbstgeschriebenes Programm und/oder ein Java-Programm sein? Oder brauchst du einfach nur irgendein Programm, um diesen Stream abspielen, weil du ihn einfach nur hören willst und nicht irgendwie weiterverarbeiten willst?
Also: Was willst du denn mit dem Stream dann machen?


----------



## Seppl22 (26. Mai 2018)

Es muss ein Java Programm sein und ich möchte den Stream in meiner Anwendung abspielen, sprich dekorieren und an die Soundkarte geben.
Edit: mein webradio soll Mp3 und AAC abspielen und aufnehmen können von daher wäre die Weiterverarbeitung später mal das Schreiben in eine lokale Datei .


----------



## Seppl22 (26. Mai 2018)

Ich habe jetzt mal noch mit den Usage Examples von JAAD rumprobiert, komme aber nicht auf einen grünen Zweig :/


----------



## mrBrown (26. Mai 2018)

Auf den ersten Blick würde ich sagen, MP4Container liest den InputStream bis zum Ende ein, was bei einem Stream erstmal nicht kommt.


----------



## Seppl22 (26. Mai 2018)

mrBrown hat gesagt.:


> Auf den ersten Blick würde ich sagen, MP4Container liest den InputStream bis zum Ende ein, was bei einem Stream erstmal nicht kommt.


Das habe ich jetzt auch rausgefunden. Dan sollte JAAD aber nicht behaupten es komme mit allen InputStreams klar .
Ich werde noch etwas mit dem AAC Decoder rumprobieren  vielleicht bekomme ich ja tatsächlich noch Ton


----------



## mrBrown (26. Mai 2018)

Naja, endlos-Streams dürften eben ein Sonderfall, und nicht der Normalfall sein, das ist schon verständlich, dass sie nicht extra drauf eingehen


----------



## Seppl22 (26. Mai 2018)

"It can read MP4 container from almost every input-stream (files, network sockets etc.) and decode AAC-LC (Low Complexity) and HE-AAC (High Efficiency/AAC+)."


----------



## mrBrown (26. Mai 2018)

Seppl22 hat gesagt.:


> almost every


fast alle


----------



## Seppl22 (27. Mai 2018)

Ich habe es jetzt geschafft, nachdem ich das git von JAAD durchgeschaut habe und mir an verschiedenen Stellen was abgekuckt habe. Allerdings 'ruckelt' die Wiedergabe, wie wenn nur jedes zweite Zeichen 'interpretiert' werden würde.
Hier der Code:

```
public class AACPlayer extends AbstractPlayer implements Runnable {
    private Thread runnerThread = new Thread(this);
    @Override
    public void stop() {
        stop = true;
        GUIHandler.getInstance().resetComponents();
    }

    @Override
    public void play() {
        stop = false;
        if(!runnerThread.isAlive()) {
            runnerThread.start();
        }
    }

    @Override
    public void setUrl(URL url) {
        this.url = url;
    }

    @Override
    public void run() {
        decodeAndPlayAAC();
    }

    private void decodeAndPlayAAC() {
        SourceDataLine line = null;
        byte[] b;
        try {
            isPlaying = true;
            final ADTSDemultiplexer adts = new ADTSDemultiplexer(url.openStream());
            final Decoder dec = new Decoder(adts.getDecoderSpecificInfo());
            final SampleBuffer buf = new SampleBuffer();
            while(!stop) {
                b = adts.readNextFrame();
                dec.decodeFrame(b, buf);

                if(line==null) {
                    final AudioFormat aufmt = new AudioFormat(buf.getSampleRate(), buf.getBitsPerSample(), buf.getChannels(), true, true);
                    line = AudioSystem.getSourceDataLine(aufmt);
                    line.open();
                    line.start();
                }
                b = buf.getData();
                line.write(b, 0, b.length);
            }
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (AACException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(line!=null) {
                line.stop();
                line.close();
                isPlaying = false;
            }
        }
    }
}
```
Um das Problem zu hören, gerne mal die decodeAAC in die main kopieren und die URL mit http://streams.bigfm.de/bigfm-charts-128-aac?usid=0-0-H-A-D-30 setzen und reinhören.
Wenn mir da noch jemand helfen könnte wäre es top. Ich gehe mal davon aus, dass der Puffer einfach nicht groß genug ist.


----------

