ID3-Tag eines Online-Radios auslesen

stareck

Aktives Mitglied
Hallo Zusammen,

ich habe ein Problem mit dem Auslesen des ID3-Tags eines Online-Streams.

Ich habe mir ein kleines Porgramm geschrieben, welches mit Hilfe eines InputStreams
den Online-Stream in eine Datei schreibt.
Diese Datei kann ich dann später z.B. mit dem VLC-Player wiedergeben.

Was ich nun noch gerne realisieren möchte ist, dass ich während des Speicherns der Datei den ID3-Tag auslese.
Ich habe im Netz schon mehrfach gelesen, das ich das Byte-Array in einen String konvertiere und dann nach "TAG" oder "ID3" suchen soll. Allerdings enthält mein String diese ID3-Header-Infos nicht.

Es sieht mir auch so aus als wenn der Zeichensatz nicht passt.. Habe das Byte-Array schon mit mehreren Zeichensätzen konvertiert, allerdings klappt es nicht...

Hat von euch jemand eine Idee???

Hier ein kurzer Programmausschnitt:
Java:
InputStream inputStream = null;
FileOutputStream fileOut = null;
inputStream = url.openStream();

File f = new File("Test.mp3");
f.createNewFile();

fileOut = new FileOutputStream(f);

byte[] buffer = new byte[8192];
int r = -1;
while ((r = inputStream.read(buffer)) != -1)
{
    String buf = new String(buffer, "ISO-8859-1");
    //String buf = new String(buffer);
    //System.out.println(buf);
    if (buf.indexOf("TAG") != -1 || buf.indexOf("ID3") != -1)
        System.out.println("ID3 gefunden");
    fileOut.write(buffer, 0, r);
}
 
Zuletzt bearbeitet:

AlexSpritze

Bekanntes Mitglied
Bist du sicher, dass in dem Stream ID3-Tags enthalten sind? Es ist aber richtig, dass solche Tag-Informationen wie Künstler oder Album im Klartext im Stream liegen.

Es könnte auch sein, dass die Tags am Ende der Datei sind, dann müsstest du warten bis der Stream komplett geladen ist. Das macht für einen Online-Stream natürlich keinen Sinn. ;) Wäre als sinnvoll, wenn die Tags gleich am Anfang auftauchen. Also in den ersten 8192 Byte, die du einliest.
 

AlexSpritze

Bekanntes Mitglied
Wenn es ein Stream ist, dann erhälst du quasi ein beliebig große MP3, je nachdem, wann du beschließt, dass du "fertig" mit dem Lesen bist? Oder hast du auch irgendwie die Möglichkeit mitzubekommen, wann ein Lied zu Ende ist? Dass du dann die Lieder separiert in verschiedene Stücke teilen kannst?
 

stareck

Aktives Mitglied
Also ich lese den Stream die ganze Zeit durch, wüsste jetzt auch nicht, wie ich erkennen kann, ob das Lied zu Ende ist.
Es kann aber auch nicht sein, dass der Header immer am Liedende steht. Bei Winamp dauert es vielleicht 5 sec. auch mittem im Lied und der ID3-Tag wird angezeigt.

Oder werden diese Infos vielleicht über einen anderen Kanal übertragen?
 

stareck

Aktives Mitglied
Ich hab hier jetzt schon stundenlang herumgetestet, kriege es aber nicht hin...

Hat einer von euch ein kleines Beispiel für mich.

Habe schon diverse Beispiele aus dem Netz getestet, es klappt aber nicht...
 

Ralph-Uwe

Bekanntes Mitglied
Hi

ich habe mich mit dem Infostream der Radiosender auch schon beschäftigt.
als Anhang findes Du meine Lösung. Sie ist mit Sicherheit noch ausbaufähig.

In den Archiv sind alle nötigen Dateien.
Die Datei mp3plugin.jar muß mit in das Projekt eingebunden werden.

Ich hoffe Du kannst damit was anfangen.
 

Anhänge

  • InternetRadio.zip
    79,1 KB · Aufrufe: 55

stareck

Aktives Mitglied
Hi Ralph-Uwe,

vielen Dank, dein Programm klappt bestens:)

Den Radiosender, den ich eingenlich abspielen wollte, macht er allerdings nicht (http://85.239.108.41/90elf_rp01)...

Hast du vielleicht noch einen Tip waran dies liegen kann?

Die werden die Headerdaten dann scheinbar anders übertragen...


Vielen Dnak schonmal!!!
 

Ralph-Uwe

Bekanntes Mitglied
Hi,

freut mich, dass funktioniert hat. :applaus:

Die Daten werden bei dem voreingestellten Sender im html-Format übertragen.
Wie bei vielen anderen auch.
Bei Deinem Wunschsender scheinen es Datensätze zu sein, die ohne genaue Kenntnisse
des Streams nicht ohne weiteres entschlüsselt werden können.

Vielleicht kann Du bei dem Senderanfragen wie die Daten kodiert sind.
 

stareck

Aktives Mitglied
Den Sender habe ich schon gefragt, die können mir auch nichts sagen, oder wollen es nicht:)

Aber es muss irgendein Standard sein, da es Winamp erkennt...
 

stareck

Aktives Mitglied
Ich komme hier nicht weiter, hat von euch schon einmal jemand das MOT-Protokoll ausgelesen?

wäre echt dankbar wenn mir nochmal einer helfen könnte:)
 

stareck

Aktives Mitglied
Ich hatte heute morgen mal versucht den header auszulesen, wusste jetzt aber gar nicht, wie ich den Header erkenne. Das habe ich in dem Dokument von dir nicht gefunden und im Netz hab ich auch nichts gefunden:-(
 

Ralph-Uwe

Bekanntes Mitglied
Hi

ab Seite 12 steht der Header beschrieben:
Das Objekt besteht aus 3 Teilen, header core, header extention und body.
Der HeaderCore besteht aus 7 Byte, header extention und body sind variabel.

Als erstes mußt Du die ersten 7 Byte aus dem Stream lesen und den Variabeln BodySize, HeaderSize,
ContentType und ContentSubType zuordnen. Leider funktioniert das nicht byteweise ;(

Ich bin z.Z. dabei die 7 Bytes in die vier Variabeln aufzuteilen.

Viel Erfolg :toll:
 

stareck

Aktives Mitglied
Hi,

wenn ich die ersten 7 byte des Streams auslese, kommt nur quatsch bei raus, zumindest passen die Werte nicht zu den Werten in der Doku:-(

So lese ich den Stream aus, so erhalte ich nun die binären Daten...
Java:
while ((r = inputStream.read(buffer)) != -1)
{
  BigInteger bi = new BigInteger(buffer);
  String buf = bi.toString(2);
  String headerCore = buf.substring(0, 57);
}

Müsste doch so richtig sein, oder nicht?

Und dies bekomme ich daraus: "-10010101101111110110001011011111111000111101010010111110"
Diese Werte passen dann nicht wirklich zu der Beschreibung...
 
Zuletzt bearbeitet:

Ralph-Uwe

Bekanntes Mitglied
Dein gelesenes Byte aus dem Inputstream ist die Variable "r". Diese benutzt Du
in deinem Code nicht.

ich habe bis jetzt folgendes gemacht:
Java:
			long headerCore = 0;
			for(int i=0;i<7;i++){ // die ersten 7 Byte aus den Stream lesen
				read = playlistStream.read(); // ein Byte aus dem Stream lesen
				headerCore = headerCore << 8; // daten in der Variabel um 8 Bit nach links verschieben
				headerCore = headerCore + read; // gelesenes Byte aus dem Stream addieren
			}
            System.out.println(Long.toBinaryString(headerCore));

Ich lese aus dem Stream die ersten 7 Byte und packe sie nacheinander eine eine
Variable vom Type long. Zwischendurch verschiebe ich die Bits, in der
Variabel headerCore, um ein Byte (also 8 Bits) nach links.
Auf diese Art hänge ich alle 56 Bits aneinander.

Das Ergebnis sieht zum Beispiel so aus:
11111111111110110101001000000100111010110000011111111101

Das muß jetzt noch den Variabeln:
BodySize, HeaderSize, ContentType und ContentSubType zuordnet werden.
Da arbeite ich gerade dran.
 

stareck

Aktives Mitglied
Hi Ralph-Uwe,

ich habe mein Programm erweitert, und mir ist aufgefallen, dass bei der header extension (PIL+ParamId) immer andere Werte gesendet werden, hast du dies bei dir auch??
 

Ralph-Uwe

Bekanntes Mitglied
Hallo,

leider hatte ich die letzten Tage nich viel Zeit weiterzumachen.
Deswegen hänge ich noch am HeaderCore.

Mich machen die Daten ich ich herausbekommen habe stutzig, Etwas stimmt da noch nicht.
Was hast Du als Ergebnisse für BodySize, HeaderSize, ContentType und ContenrSubType raus?
Sind Deine Ergebnisse plausiebel?
 

stareck

Aktives Mitglied
Hallo,

ich habe heute mittag ein bisschen getestet, ich hab das gefühl das meine Daten auch noch nciht passen...

Diese Daten erhalte ich:
HeaderCore:
Headersize=5376 bytes0
Bodysize=4081 bytes
Contenttype=111101 (nicht definiert)
ContentSubtype=111111111

Headerextension:
PLI=00
ParamID = 000001 (nicht definiert)

Das sieht mir noch nicht korrekt aus...
 

HoaX

Top Contributor
Ääääh das ist ein Icy-Stream...

Wenn man einen Binärstream mit einem BufferedReader einliest macht man eh etwas falsch. Des weiteren übergibst du zwar korrekter Weise den Header "icy-metadata", aber du irgnorierst die Antwort-Header und suchst blind HTML-Tags in der Antwort... ich wundere mich nicht dass es nicht geht.
 

HoaX

Top Contributor
Dann schau dir die Streamdaten an, es ist Icy.

Folgender Code funktioniert auch:
Java:
package org.javaforum.hoax.icy;

import java.io.FilterInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map.Entry;

public class IcyInputStream2 extends FilterInputStream {

	private URLConnection connection;
	private int metaDataInterval = -1;
	private int toRead = -1;

	public IcyInputStream2(URL icyURL) throws IOException {
		super(null);
		connection = icyURL.openConnection();
		connection.addRequestProperty("Icy-MetaData", "1");
		in = connection.getInputStream();
		
		readHeader();
	}
	
	protected void readHeader() {
		for(Entry<String, List<String>> header: connection.getHeaderFields().entrySet()) {
			if ("icy-metaint".equalsIgnoreCase(header.getKey())) {
				metaDataInterval = Integer.parseInt(header.getValue().get(0));
				toRead = metaDataInterval;
			}
			if (header.getKey() != null && header.getKey().toLowerCase().startsWith("icy-")) {
				for(String s : header.getValue()) {
					fireEventNewMetaData(header.getKey(), s);
				}
			}
		}
	}
	
	@Override
	public int read() throws IOException {
		if (toRead == 0) {
			readIcyInfo();
			toRead = metaDataInterval;
		}
			
		toRead--;
		if (toRead < 0) {
			toRead = -1;
		}
		int val = in.read();
		return val;
	}
	
	@Override
	public int read(byte[] b) throws IOException {
		return read(b, 0, b.length);
	}
	
	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		int size = off + len;
		for(int i = off; i < size; i++) {
			int d = read();
			if (d == -1) {
				return i - off;
			} else {
				b[i] = (byte) d;
			}
		}
		return len;
	}
	
	private void readIcyInfo() throws IOException {
		int value = in.read();
		int size = value * 16;
		StringBuffer s = new StringBuffer();
		while(size-- > 0) {
			s.append((char)in.read());
		}
		
		if (s.length() > 0) {
			// TODO: s parsen
			fireEventNewMetaData("Length: "+s.length(),s.toString());
		}
	}

	private void fireEventNewMetaData(String key, String value) {
		System.err.println("Neue Metadaten: " + key + " -> " + value);
	}

	
	public static void main(String[] args) throws MalformedURLException, IOException {
		//IcyInputStream2 stream = new IcyInputStream2(new URL("http://85.239.108.41/90elf_rp01"));
		//IcyInputStream2 stream = new IcyInputStream2(new URL("http://mp3.webradio.rockantenne.de:80"));
		IcyInputStream2 stream = new IcyInputStream2(new URL("http://edge.live.mp3.mdn.newmedia.nacamar.net/klassikradiomovie128/livestream.mp3"));
		int d = 0;
		while ((d = stream.read())!= -1) {
			//System.out.write(d);
		}
	}
}

Den String aus dem StringBuffer noch zu zerlegen überlasse ich euch.

Ausgabe schaut so aus:
Code:
Neue Metadaten: icy-url -> http://www.rockantenne.de
Neue Metadaten: icy-br -> 128
Neue Metadaten: icy-reset -> 1
Neue Metadaten: icy-pub -> 0
Neue Metadaten: icy-name -> ROCK ANTENNE MP3 Surround
Neue Metadaten: icy-genre -> Rock
Neue Metadaten: icy-metaint -> 16000
Neue Metadaten: Length: 64 -> StreamTitle='Lenny Kravitz - Rock Star city life';

Code:
Neue Metadaten: icy-url -> http://www.90elf.de
Neue Metadaten: icy-description -> 90elf - Dein Fussball-Radio - Livespiel 1
Neue Metadaten: icy-br -> 64
Neue Metadaten: icy-br -> 64
Neue Metadaten: icy-genre -> Sports
Neue Metadaten: icy-name -> 90elf - Dein Fussball-Radio - Livespiel 1
Neue Metadaten: icy-pub -> 1
Neue Metadaten: icy-metaint -> 16000
Neue Metadaten: Length: 96 -> StreamTitle='';StreamUrl='';adw_ad='true';durationMilliseconds='20140';insertionType='preroll';
Neue Metadaten: Length: 96 -> StreamTitle='Düsseldorf - St. Pauli 0:0 | 90elf - Dein Fussball-Radio ';StreamUrl='';
 
Zuletzt bearbeitet:

Ralph-Uwe

Bekanntes Mitglied
Ok, hast recht :oops:

Ich werden mir Dein Code mal genauer ansehen, um zu sehen welchen fehler
ich in meinem Code habe.

Auf jeden Fall vielen Dank für Deine Hilfe. :toll: :applaus:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Verbindung eines Java-Plugins mit Webserver Allgemeine Java-Themen 3
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
M Rechenprogramm eines wissenschaftlichen Taschenrechners Allgemeine Java-Themen 4
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
E Typüberprüfung eines chars Allgemeine Java-Themen 5
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
H Datentypen Typ eines Arrays überprüfen Allgemeine Java-Themen 9
RalleYTN DPI eines Bildes ändern Allgemeine Java-Themen 4
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
O Datentypen Erstellung eines Containers, der verschachtelte Map-Strukturen beherbergen kann Allgemeine Java-Themen 0
A einmalige Ausführung eines Methodenabschnittes Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
F Teil eines Bildes laden Allgemeine Java-Themen 1
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P Löschen eines keys in einer SortedMap Allgemeine Java-Themen 5
RalleYTN Input/Output URL eines Zip Entry? Allgemeine Java-Themen 2
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
J NullPointerExeption bei Inizialisierung eines Arrays Allgemeine Java-Themen 3
I Setzen und Lesen eines Objektes (Enum?) Allgemeine Java-Themen 10
L Implementierung eines AVT-Baums Allgemeine Java-Themen 2
D Größe der Zahlenkombinationen eines Arrays begrenzen Allgemeine Java-Themen 3
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
thet1983 nach teilen eines Dateinamens suchen Allgemeine Java-Themen 6
T Bezeichnung eines Objektes mit String/int kombinieren Allgemeine Java-Themen 3
Z Auswerten eines eingegeben Termes Allgemeine Java-Themen 13
X Registrierung eines Ecore-Models außerhalb der Eclipse-Umgebung Allgemeine Java-Themen 0
R Instanzen eines Programms Allgemeine Java-Themen 8
I Arbeitsmaterialien eines Softwareentwicklers? Allgemeine Java-Themen 7
L Größe eines Objekts im Arbeitsspeicher Allgemeine Java-Themen 1
D Name eines Nicht-String Objekts ausgeben Allgemeine Java-Themen 4
A Helligkeit eines Bildes berechnen Allgemeine Java-Themen 1
L Anzahl der Tage eines Monats Allgemeine Java-Themen 3
S Java Problem bei der Rückgabe eines Arrays Allgemeine Java-Themen 19
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
H Klassennamen zum Aufruf eines statischen Feldes aus Variable holen Allgemeine Java-Themen 4
C Methode für tiefe Kopie eines unbekannt (dimensionierten & typisierten) Feldes realisierbar? Allgemeine Java-Themen 7
M final vor dem parameter eines Konstruktors Allgemeine Java-Themen 1
B Hintergrundbild eines JFrames? Allgemeine Java-Themen 3
L Winkel eines Vektors berechnen [Anfängerprob] Allgemeine Java-Themen 5
Fab1 Komponenten eines zweiten Java Programms auslesen Allgemeine Java-Themen 8
T Mit Java auf die Konsole eines Process-Objekts zugreifen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben