# AudioInputStream (Mp3) aktuelle Position



## BRoll (19. Feb 2014)

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

```
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:

```
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


----------

