Hallo,
ich arbeite gerade mit Mp3 Dateien die ich mit
einem selber gebastelten Editor an bestimmte Events synchronisieren möchte.
Dazu verwende ich die Jars:
jl1.0.1.jar
mp3spi1.9.5.jar
tritonus_share.jar
Mein Editor ist so aufgebaut, dass man ein Lied einliest, und dann Events zu bestimmten
Zeitpunkten erstellen kann. Dazu habe ich festgelegt dass 1s = 100 Zeiteinheiten sind.
Somit hat eine Minute den Wert 6000 in meinem System.
(ich habe keine Millliskendunden verwendet weil 100er Schritte Genauigkeit reichen)
Weiterhin kann ich schon die Lieder abspielen und zu einer bestimmten Stelle zb. 6500 (1 Minute 5 Sekunden) springen. Momentan besteht mein Problem darin, dass wenn das Lied abgespielt wird
ich nicht weiß wie bei der wievielten Zeiteinheit es gerade ist.
Nun aber ein bisschen Code:
Einlesen des Lieds
Und die Stelle wo alles abgespielt wird:
Als ich das jetzt mit einem Lied der Länge 5:56 getestet habe,
gibt er die richtige maximale Länge in Minuten/Sekunden und meiner Zeiteinheit aus.
Bloß die aktuelle Zeiteinheit stimmt nicht, bei meiner Debug Ausgabe ist
der Prozentwert wieviele Bytes schon gelesen wurden auf 11 (also 1100%) am Ende gewesen
bei einer konstanten Steigung von 4069 Bytes (was ja logisch ist)
Bloß wie kann das Ding 11 mal mehr Bytes aus dem InputStream lesen als tatsächlich enthalten sind?
Oder stimmt der maximal Wert (max) der Bytes nicht?
Momentan finde ich keine Lösung :/
Wäre nett wenn jemand mit mehr Ahnung mir helfen könnte,
hab noch nicht viel in Richtung Musikverwaltung gemacht.
Gruß BRoll
ich arbeite gerade mit Mp3 Dateien die ich mit
einem selber gebastelten Editor an bestimmte Events synchronisieren möchte.
Dazu verwende ich die Jars:
jl1.0.1.jar
mp3spi1.9.5.jar
tritonus_share.jar
Mein Editor ist so aufgebaut, dass man ein Lied einliest, und dann Events zu bestimmten
Zeitpunkten erstellen kann. Dazu habe ich festgelegt dass 1s = 100 Zeiteinheiten sind.
Somit hat eine Minute den Wert 6000 in meinem System.
(ich habe keine Millliskendunden verwendet weil 100er Schritte Genauigkeit reichen)
Weiterhin kann ich schon die Lieder abspielen und zu einer bestimmten Stelle zb. 6500 (1 Minute 5 Sekunden) springen. Momentan besteht mein Problem darin, dass wenn das Lied abgespielt wird
ich nicht weiß wie bei der wievielten Zeiteinheit es gerade ist.
Nun aber ein bisschen Code:
Einlesen des Lieds
Java:
AudioInputStream in = AudioSystem.getAudioInputStream(file);
din = null;
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(),
16, baseFormat.getChannels(), baseFormat.getChannels() * 2,
baseFormat.getSampleRate(), false);
din = AudioSystem.getAudioInputStream(decodedFormat, in);
// Länge des Lieds in Bytes
max = in.available();
AudioFileFormat baseFileFormat = new MpegAudioFileReader().getAudioFileFormat(file);
Map<String, Object> properties = baseFileFormat.properties();
Long duration = (Long) properties.get("duration");
double d=duration/10000;
length=(int) d; // Länge des Lieds in Zeiteinheit 100=1s
d/=100;
minutes=(int) (d/60); // Anzahl der Minuten
seconds=(int) (d%60); //Anzal der Sekunden
sFactor=(double)max/(double)length; // Wie viele Bytes pro Zeiteinheit
Und die Stelle wo alles abgespielt wird:
Java:
byte[] data = new byte[4096];
int anz=0; //Anzahl der gelesenen Bytes
while (nBytesRead != -1) {
if (!pause) {
nBytesRead = din.read(data, 0, data.length);
if (nBytesRead != -1)
line.write(data, 0, nBytesRead);
if (stop) {
nBytesRead = -1;
}
anz+=nBytesRead; //gelesene Bytes addieren
System.out.println((double)anz/(double)max); // Debug
//aktuelle Position in Zeiteinheit ergibt sich aus
// %gelesene Bytes * Länge des Lieds in Zeiteinheit
currentPosition=(int) (((double)anz/(double)max)*length);
}
}
Als ich das jetzt mit einem Lied der Länge 5:56 getestet habe,
gibt er die richtige maximale Länge in Minuten/Sekunden und meiner Zeiteinheit aus.
Bloß die aktuelle Zeiteinheit stimmt nicht, bei meiner Debug Ausgabe ist
der Prozentwert wieviele Bytes schon gelesen wurden auf 11 (also 1100%) am Ende gewesen
bei einer konstanten Steigung von 4069 Bytes (was ja logisch ist)
Bloß wie kann das Ding 11 mal mehr Bytes aus dem InputStream lesen als tatsächlich enthalten sind?
Oder stimmt der maximal Wert (max) der Bytes nicht?
Momentan finde ich keine Lösung :/
Wäre nett wenn jemand mit mehr Ahnung mir helfen könnte,
hab noch nicht viel in Richtung Musikverwaltung gemacht.
Gruß BRoll