Hallo.
Ich habe eine Nachfrage bekommen wieso man bei manchen iRadios den Titel angezeigt bekommt, bei anderen aber nicht. Die Suche im Datenstrom zum VS1053, also im Buffer bringt keinen Klartext, keine ID3-Tags oder ähnliches.
Die Feststellung mit den Klartextdaten ist erstmal richtig! Es gibt dafür mehrere Gründe.
ID3 wird meistens ja nicht genutzt, sondern icy. Im iRadioAndroid hatte ich das im MetadatenRetriever in #114 https://www.radio-bastler.de/forum/index.ph…67126#pid267126 gezeigt.
Bei einer normalen Anfrage werden diese Daten aber nicht mitgesendet. Man bekommt nur einen normalen Datenstrom den man zum SW oder HW Dekoder schicken kann. So vom Server zu antworten ist extrem richtig, denn er muss davon ausgehen das nichts anderes auf der Gegenseite verarbeitet werden kann.
Ich zeige das an einem Beispiel.
Anfrage an die Station http://chantefrance.ice.infomaniak.ch/chantefrance-128.mp3 aus unserer Senderliste auf der Konsole:
Code
wget -d http://chantefrance.ice.infomaniak.ch/chantefrance-128.mp3 -O - >> testfile.mp3
Es geht zur Station unser Request:
---request begin---
GET /chantefrance-128.mp3 HTTP/1.1
Host: chantefrance.ice.infomaniak.ch
User-Agent: Wget/1.21.2
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
---request end---
HTTP request sent, awaiting response...
Wenn die Station antwortet bekommen wir zunächst im Header:
---response begin---
HTTP/1.1 200 OK
Content-Type: audio/mpeg
Date: Mon, 06 May 2024 13:23:14 GMT
icy-br:128
ice-audio-info: channels=2;samplerate=44100;bitrate=128
icy-br:128
icy-name:chantefrance-128.mp3
icy-pub:1
Cache-Control: no-cache, no-store
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Connection: Close
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type, Icy-MetaData
Access-Control-Allow-Methods: GET, OPTIONS, SOURCE, PUT, HEAD, STATS
---response end---
200 OK
danach den normalen Datenstrom den jeder (hier MP3) Dekoder verarbeiten kann. Im Beispiel schreiben wir den in die Datei testfile.mp3 die man auch mit vlc öffnen könnte, oder dem iRadioAndroid, oder iRadioMini, Pico ....
Im Hexeditor sieht das dann zum Beispiel so aus
darin suchen wir jetzt nach dem aktuellen Titel und finden nichts

Wenn wir so eine Datei in irgendeinem Player abspielen wird es ohne Sonderbehandlung niemals Probleme geben. Der Ton kommt flüssig zum DAC.
Jetzt wollen wir die ICY-Metadaten haben. Das müssen wir dem Server bei der Anfrage mitteilen und zwar durch die zusätzliche Zeile:
Icy-MetaData: 1
Im Beispiel oben schleusen wir die so ein
Code
wget -d --header "Icy-MetaData:1" http://chantefrance.ice.infomaniak.ch/chantefrance-128.mp3 -O - >> testfile2.mp3
Unser Request an den Radiostationsserver sieht nun so aus
---request begin---
GET /chantefrance-128.mp3 HTTP/1.1
Host: chantefrance.ice.infomaniak.ch
User-Agent: Wget/1.21.2
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
Icy-MetaData: 1
---request end---
HTTP request sent, awaiting response...
Als Antwort bekommen wir
---response begin---
HTTP/1.0 200 OK
Content-Type: audio/mpeg
Date: Mon, 06 May 2024 13:24:53 GMT
icy-br:128
ice-audio-info: channels=2;samplerate=44100;bitrate=128
icy-br:128
icy-name:chantefrance-128.mp3
icy-pub:1
Cache-Control: no-cache, no-store
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Connection: Close
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type, Icy-MetaData
Access-Control-Allow-Methods: GET, OPTIONS, SOURCE, PUT, HEAD, STATS
icy-metaint:16000
---response end---
200 OK
Und danach einen MP3 Datenstrom mit wiederholenden (alle 16000 Byte) eingeschossenen Metadaten, den wir nicht mehr auf einen Dekoder senden dürfen! Probiert es aus und hört euch jetzt mal die hier erzeugte testfile2.mp3 an. Sie hat immer wieder ganz kurze Aussetzer, das sind unsere Metadaten, die man im Hexeditor oder im Quellcode auch im Klartext mitlesen und parsen kann

Und man muss noch mehr machen, man muss diese gefunden Daten aus dem Buffer herausschneiden und darf dann erst den Rest zum Dekoder senden, der dann fehlerfrei im Audio ist.
Den Header modifiziert man laut libdoc der HTTPClient im Pico-core mit der addHeader - Funktion. Das Parsen nach dem Klartext mit den Metadaten macht man im Player in player() nach queue.pop(); und VS1053Dekoder.playData(coded_audio->data, 32);
Trifft man auf die Metadaten, schneidet man den Bereich aus bevor er zu playData geht. Und natürlich merkt man sich das was da übertragen wurde um die gewonnenen Daten in einem displayd benutzen zu können.