Audiolänge in sekunden bekommen

Wie bekomme ich die Audiolänge in Sekunden einer geladenen Audio-Datei? Ich hab es bereits gegooglet, aber nur Möglichkeiten über das standard-Api und JAudioTagger gefunden, ersteres liefert nur ne Exception beim laden und mit zweiteres komme ich nicht zurecht, kamen auch dauernd nur Exceptions :stuck_out_tongue: Habt ihr noch ne Idee? Will ne ProgressBar in mein Programm reintun, die das Maximum in Sekunden der Datei bekommt und jede Sekunde um ein upgedatet wird.

Was verwendest du eigentlich um die Audio-Datein abzuspielen.
Wenn du JMF nutzt gibt es eine Methode die Player.getDuration()

Wobei wie ich lese, dass diese Methode ein Paar probleme mit MP3s hat.

Die Länge einer Audiodatei bekommt man eigentlich mit “.getFrameLength() / .getSampleRate()” (in Sekunden) am schnellsten. Leider kann es sein, dass manche (eigentlich viele) AudioInputStreams diese FrameLength nicht spezifizieren und -1 zurückgeben. In diesem Fall könnte man, sofern das File-Protokoll verwendet wird (alles andere kann tatsächlich endlos sein) den AudioStream an einen Clip übergeben und dann mit “.getMicroSecondsLength() / 1000000.0” die Länge (in Sekunden) feststellen.

EDITH sagt: Wegen dem Umstand, das MP3s eben jenes NOT_SPECIFIED zurückgeben, hat der JMF-Player auch diese Probleme damit. Die “Clip”-Methode aber schafft auch die.

Also ich benutze JLayer zum abspielen, was mir lediglich die momentane Position zurückgeben kann.

@Spacerat : wenn ich eine .mp3 benutze kommt aber wieder die UnsupportedAudioFileException bei raus :stuck_out_tongue:

Oder muss ich hier was ändern?


  File audioFile = new File("E:\\another_way.mp3");

    public static void main(String[] args) {
        MusikTest m = new MusikTest();
        m.init();
        m.play();
    }
    Clip clip;

    public void init() {
        try {
            clip = AudioSystem.getClip();
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audioFile);
            clip.open(audioInputStream);
        } catch (LineUnavailableException | UnsupportedAudioFileException | IOException ex) {
            System.err.println("Fehler: " + ex.getMessage());
        }
    }
    
    public void play() {
        clip.start();
    }```

Wegen genau dieser Exception bin ich ja eig zu JLayer gewechselt. Wenn das schonmal nicht klappt, brauch ich ja glaub ich damit nicht weiter zu machen^^

Also JLayer benötigst du schon, weil die MP3-Reader davon abhängig sind. Nur den Player davon brauchst in den meisten Fällen nicht.

OK, hab nochma gegooglet und das da gefunden:

Die meinen zumindest das baut auf JLayer auf, ist ja auch javazoom. Wenn ich das aber bei mir umsetze, bekomme ich nen Error:

import java.util.Map;
import javax.sound.sampled.AudioFileFormat;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;

public class MusikTest {

    File audioFile = new File("E:\\another_way.mp3");

    public static void main(String[] args) {
        MusikTest m = new MusikTest();
        long duration = m.getDuration();
        System.out.println(duration);
    }

    public long getDuration() {
        long duration;
        AudioFileFormat fileFormat = null;
        try {
            fileFormat = new MpegAudioFileReader().getAudioFileFormat(audioFile);
        } catch (Exception ex) {
            System.err.println("Fehler: " + ex);
        } catch (Error err) {
            System.err.println("Error: " + err);
        }

        if (fileFormat != null) {
            Map properties = fileFormat.properties();
            duration = (Long) properties.get("duration");
            return duration;
        } else {
            return -1;
        }

    }
}```

> Error: java.lang.NoClassDefFoundError: org/tritonus/share/sampled/file/TAudioFileReader


Und einen Error hatte ich auch noch nie in einem meiner Projekte^^ Hab den dazu mal gecatched, weil die Fehlermeldung immens lang war. Was passt da den jetz wieder nicht?

Hast du denn auch schön artig alle drei benötigten jars installiert?

  1. mp3spi (denke mal ja)
  2. jl (denke mal ja)
  3. tritonus_share (denke mal nicht)

Tritonus ist nicht drin, ja, ganz überlesen^^ Aber wo bekomme ich das her, weil mir HP komm ich nich klar
http://www.tritonus.org/download.html
Klick ich da auf Web Interface, kommt nur eine Seite nicht gefunden von Google Chrome :confused:

Wenn ich auf Instructions klicke, komme ich nur zur Version 0.3.0, die zuletzt im september 00 geändert wurde, was aber die selbe ist wie die nicht empfohlene auf der Download-Seite. :confused: Und wenn ich das runterlade und entpacke, ist da keine jar drin^^
Das alleine wäre zwar kein Problem, gibt ja den src Ordner, allerdings gibt es das Package org/tritonus/share nicht^^ in tritonus gibts da nur „lowlevel“,„midi“,„sampled“ und „util“

Die findest du neben jl im lib-Verzeichnis des MP3-Ziparchivs

Wenn es nur um mp3 geht, da könnte man die Datei auch selber durchlaufen, dabei die Frames zählen und die gefundene Anzahl mit 26ms multiplizieren. Ist möglicherweise einfacher als mit drei Libs zu hantieren. :coding:

Hätte ich auch eigentlich selbst drauf kommen können xD Okay, es klappt nun^^

Jetzt nurnoch versuche, die ProgressBar updaten zu lassen^^